c#中的声明是分配内存还是分配内存的新操作符?

c#中的声明是分配内存还是分配内存的新操作符?,c#,initialization,operator-keyword,C#,Initialization,Operator Keyword,c#中的声明是否为要创建的变量分配内存,还是分配内存并允许调用构造函数初始化内存中分配的变量的新运算符 据我所知,如果没有新的运算符,就不能调用任何类型的构造函数。我说得对吗 无规范声明为C#中的(对象)null分配内存 引用类型的声明只占用引用的空间,直到您使用新关键字创建对象为止。 值类型也是如此 因此,如果你有: string s; // only reference type memory, which is based on the machine architecture. 如果你

c#中的声明是否为要创建的变量分配内存,还是分配内存并允许调用构造函数初始化内存中分配的变量的新运算符


据我所知,如果没有新的运算符,就不能调用任何类型的构造函数。我说得对吗

无规范声明为C#中的(对象)null分配内存


引用类型的声明只占用引用的空间,直到您使用新关键字创建对象为止。 值类型也是如此

因此,如果你有:

string s; // only reference type memory, which is based on the machine architecture.
如果你有:

string s = "some string"; // reference (pointer) + memory allocated on the heap.
对于值类型几乎是一样的,但是,它们的内存是在声明值类型的位置内联分配的

没错,除非实例化/创建了任何类型的对象,否则不能对任何类型调用构造函数

c#中的声明是否为要创建的变量分配内存,还是分配内存并允许调用讲师初始化内存中分配的变量的新运算符

首先,让我们确定你问的是你认为你在问的问题。对于值类型,变量存储位置和值存储位置是相同的存储位置。对于引用类型,与变量关联的存储位置包含对与对象关联的存储位置的引用。这是完全不同的

其次,让我们澄清一下“变量”的“声明”是什么意思。静态字段、实例字段、局部变量和形式参数都有声明。此外,如果局部变量和形式参数在lambda的外部局部上是闭合的,则它们的分配语义不同,并且当局部变量位于异步方法或迭代器块中时,它们的语义也不同

因此,我们假设您有一个引用类型的局部变量,并且局部变量没有什么特别之处:

void M() { 
    Animal x = new Giraffe();  ...
当方法M()被激活时,局部变量x的存储位置从短期存储(通常是堆栈或寄存器)中分配

当计算“new Giraffe()”时,运行时在长期存储(GC堆)上为长颈鹿分配内存,然后将对该对象的引用传递给构造函数。当构造函数返回时,引用将被分配给本地

因此有两个存储位置。这里有x的短期位置,它的寿命与方法的激活一样长,还有被引用的东西的长期存储,它的寿命直到垃圾收集器将其清除为止

如果这不能回答你的问题,请澄清你的问题

你能在没有新操作符的情况下调用构造函数吗

我假设“构造函数”是指实例构造函数,而不是静态构造函数


不是用任何“正常”的方式,不是。

只是一个小小的更正,这是一个结构,你可能会发现埃里克·利珀特的回答很有教育意义。比你问的更详细,因为这个问题不是完全重复的。我希望我能+10 Eric的帖子。这很有启发性,所以减速分配内存,新的操作符只是用来调用构造函数,对吗?因为我知道结构和枚举不需要构造函数调用来实例化,而引用类型需要。所以我真正要问的问题是,在哪一点分配内存。是在减速结束时,还是在编译器“处理”新运算符时,然后调用构造函数以用数据填充分配的内存。答案是。。。声明使用空实例创建引用类型内存,实例化创建完整的对象内存。
void M() { 
    Animal x = new Giraffe();  ...