2

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

据我了解,没有 new 运算符就不能调用任何类型的构造函数。我对么?

4

3 回答 3

19

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

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

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

所以让我们假设你有一个引用类型的局部变量,并且对局部没有什么特别的:

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

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

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

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

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

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

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

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

于 2013-04-05T03:43:43.437 回答
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.
于 2013-04-05T02:39:15.373 回答
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.

值类型几乎相同,但是,它们的内存是在声明值类型的地方内联分配的。

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

于 2013-04-05T02:45:37.653 回答