2013-04-05 57 views
2

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

据我的理解,你不能在没有新操作符的情况下调用任何类型的构造函数。我对么?

+1

只是一个小的更正,它是一个**构造函数** – Charleh 2013-04-05 02:42:16

+1

您可能会发现Eric Lippert的答案[here](http://stackoverflow.com/questions/15520378/memory-allocation-of-class-objects)教育。比你问的更详细,因为问题不是完全重复。 – 2013-04-05 02:49:13

+0

我希望我能+10埃里克的帖子。这很有启发性。 – code4life 2013-04-05 03:58:50

回答

1

申报不规范分配内存,在C#(对象)空...

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. 
+0

所以减速分配内存和新运算符只是用来调用构造函数是我吗?因为我知道结构和枚举不需要构造函数调用来实例化,而引用类型可以。所以我真正要问的是内存分配的问题。在减速结束时或处于新运算符由编译器“处理”的位置,然后调用构造函数以使用数据填充分配的内存。 – 2013-04-05 03:47:18

+0

答案是......声明用NULL实例创建引用类型的内存,实例化创建完整的对象内存。 – MaxOvrdrv 2013-04-05 03:51:28

0

引用类型的声明只需要空间为基准,直到你创建新的关键字的对象。 同样是值类型

,如果您有:

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

如果您有:

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

这几乎是值类型相同,不过,他们的记忆是分配直列值类型被声明的地方。

而且你是正确的,你不能在任何类型上调用构造函数,除非类型的对象被实例化或创建。

19

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

首先让我们确保你问的问题是你认为你问的问题。对于值类型,变量存储位置和值存储位置是相同的存储区。对于参考类型,与变量相关联的存储位置包含参考到与相关联的存储位置。那些完全不同。

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

因此,让我们假设你有引用类型的局部变量并没有什么花哨有关地方:

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

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

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

所以有两个存储位置。有x的短期位置,它只与方法的激活一样长,并且存在被引用的东西的长期存储,并且直到垃圾收集器清理它为止。

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

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

我假设通过“构造函数”你是指一个实例构造函数,而不是一个静态构造函数。

不是任何“正常”的意思,没有。