c#中的声明是分配内存还是由new操作符分配内存?
本文关键字:内存 分配 new 操作符 声明 | 更新日期: 2023-09-27 18:07:24
c#中的声明是否为要创建的变量分配内存,或者它是分配内存并允许调用构造函数在内存中初始化分配的变量的新操作符?
在我看来,没有new操作符就不能调用任何类型的构造函数。我说的对吗?
c#中的声明是否为要创建的变量分配内存,或者它是分配内存的新操作符,并允许调用指导符在内存中初始化分配的变量?
首先让我们确保你问的是你认为你问的问题。对于值类型,变量存储位置和值存储位置为同一存储。对于引用类型,与变量关联的存储位置包含与对象关联的存储位置的引用。这是完全不同的。
第二,让我们澄清你所说的"声明"一个"变量"是什么意思。静态字段、实例字段、局部变量和形式参数都有声明。此外,如果局部变量和形式参数是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.
对于值类型来说几乎是一样的,但是它们的内存是内联分配的,在声明值类型的地方。
你是对的,你不能在任何类型上调用构造函数,除非类型的对象被实例化/创建。