c# 中的声明是为要创建的变量分配内存还是 new 运算符分配内存并允许调用构造函数来初始化内存中分配的变量?
据我了解,没有 new 运算符就不能调用任何类型的构造函数。我对么?
c# 中的声明是为要创建的变量分配内存还是 new 运算符分配内存并允许调用构造函数来初始化内存中分配的变量?
据我了解,没有 new 运算符就不能调用任何类型的构造函数。我对么?
c# 中的声明是否为要创建的变量分配内存,或者是分配内存并允许调用讲师初始化内存中分配的变量的 new 运算符?
首先,让我们确保你问的是你认为你在问的问题。对于一个值类型,变量存储位置和值存储位置是同一个 storage。对于引用类型,与变量关联的存储位置包含对与对象关联的存储位置的引用。那些是完全不同的。
其次,让我们澄清一下“变量”的“声明”是什么意思。静态字段、实例字段、局部变量和形参都有声明。此外,如果局部变量和形参是封闭的 lambda 的外部局部变量,则它们的分配语义是不同的,当局部变量位于异步方法或迭代器块中时,语义也不同。
所以让我们假设你有一个引用类型的局部变量,并且对局部没有什么特别的:
void M() {
Animal x = new Giraffe(); ...
当激活方法 M() 时,局部变量 x 的存储位置从短期存储(通常是堆栈或寄存器)中分配出来。
当评估“new Giraffe()”时,运行时会在长期存储(GC 堆)上为 Giraffe 分配内存,然后将对该对象的引用传递给构造函数。当构造函数返回时,引用然后分配给本地。
所以有两个存储位置。x 有一个短期位置,它只在方法激活时存在,并且有被引用的东西的长期存储,并且一直存在到垃圾收集器清理它为止。
如果这不能回答您的问题,请澄清您的问题。
你可以在没有 new 运算符的情况下调用构造函数吗?
我假设“构造函数”是指实例构造函数而不是静态构造函数。
不是通过任何“正常”的方式,不。
没有规范的声明在 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.
引用类型的声明只占用引用空间,直到您使用 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.
值类型几乎相同,但是,它们的内存是在声明值类型的地方内联分配的。
你是对的,除非实例化/创建了该类型的对象,否则你不能在任何类型上调用构造函数。