【问题标题】:Does declaration in c# allocate memory or is it the new operator that allocates memory?c# 中的声明是分配内存还是分配内存的 new 运算符?
【发布时间】:2013-04-05 02:35:17
【问题描述】:

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

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

【问题讨论】:

  • 只是一个小修正,它是一个构造函数
  • 您可能会发现 Eric Lippert 的回答 here 具有教育意义。比你问的更详细,因为问题不是完全重复的。

标签: c# initialization operator-keyword


【解决方案1】:

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

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

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

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

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

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

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

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

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

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

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

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

【讨论】:

    【解决方案2】:

    没有规范的声明在 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操作符只是用来调用构造函数对吗?因为我知道结构和枚举不需要构造函数调用来实例化,而引用类型则需要。所以我真正要问的问题是在什么时候分配内存。是在减速结束或者是在编译器“处理”new操作符的时候,然后调用构造函数来填充分配的内存数据。
    • 答案是两者都...声明使用 NULL 实例创建引用类型内存,实例化创建完整的对象内存。
    【解决方案3】:

    引用类型的声明只占用引用空间,直到您使用 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.
    

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-29
      • 2014-12-11
      • 1970-01-01
      • 1970-01-01
      • 2020-10-13
      • 2021-07-14
      相关资源
      最近更新 更多