c#中的声明是分配内存还是分配内存的新运算符?

时间:2013-04-05 02:35:18

标签: c# initialization operator-keyword

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

据我了解,如果没有new运算符,则无法调用任何类型的构造函数。我对么?

3 个答案:

答案 0 :(得分:19)

  

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

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

其次,让我们通过“变量”的“声明”澄清你的意思。静态字段,实例字段,局部变量和形式参数都具有声明。此外,局部变量和形式参数的分配语义如果是lambda的封闭外部局部变量则是不同的,并且当本地处于异步方法或迭代器块时语义也不同。

所以让我们假设你有一个引用类型的局部变量,对本地没什么好看的:

void M() { 
    Animal x = new Giraffe();  ...

当方法M()被激活时,局部变量x的存储位置被分配给短期存储 - 通常是堆栈或寄存器。

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

因此有两个存储位置。有x的短期位置,只有方法的激活才会存在,并且存在所指的东西的长期存储,并且直到垃圾收集器清理它为止。

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

  

你可以在没有new运算符的情况下调用构造函数吗?

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

不是通过任何“正常”方式,不是。

答案 1 :(得分:1)

没有规范的

声明在C#...

中为(object)null分配内存
string x;
// x = null in memory

string x = "";
// x = string in memory with value.

MyObjectType x;
// x = null;

MyObjectType x = new MyObjectType();
// x = MyObjectType in memory.

答案 2 :(得分:0)

引用类型声明仅为引用提供空间,直到您使用new关键字创建对象。 同样适用于值类型

所以如果你有:

string s; // only reference type memory, which is based on the machine architecture.

如果你有:

string s = "some string"; // reference (pointer) + memory allocated on the heap.

对于Value类型,它几乎是相同的,但它们的内存是在声明值类型的内联中分配的。

你是对的,你不能在任何类型上调用构造函数,除非实例化/创建了类型的对象。