+ -
当前位置:首页 → 问答吧 → 问个基础问题, C# 中的结构使用 new 来初始化, 标识符会成为引用(跟踪句柄)吗?

问个基础问题, C# 中的结构使用 new 来初始化, 标识符会成为引用(跟踪句柄)吗?

时间:2011-12-14

来源:互联网

譬如有个Struct:
[code=C#]
public   struct   OMG
{
        public   int   a;
        public   OMG(int   inInt)
        {
                this.a   =   inInt;
        }
}
[/code]
现在用   new   来初始化它:
[code=C#]
OMG   omg   =   new   OMG(37);
[/code]
这个   omg   是跟踪句柄引用还是直接表示这个实例对象?   这个实力对象被放在堆中还是栈中?

作者: pitsou7   发布时间: 2011-12-14

不会,struct必定不是引用类型,即使用new创建struct,它仍然不是引用类型,这点和c++不同,

作者: stonespace   发布时间: 2011-12-14

OMG omg = new OMG(37); 这句话如果在方法中调用,那么omg必定分配在栈中,

作者: stonespace   发布时间: 2011-12-14

Struct是值类型,不是引用类型.

作者: enter89   发布时间: 2011-12-14

new OMG(37);只是指示调用构造函数初始化实例,并不是在堆中分配对象内存,这点和c++不同,

c#的new运算符并不隐含要在堆中分配内存的操作,而只是用适当方法创建实例并调用构造函数,如果有构造函数的话,


作者: stonespace   发布时间: 2011-12-14

引用 2 楼 stonespace 的回复:

OMG omg = new OMG(37); 这句话如果在方法中调用,那么omg必定分配在栈中,

那么是否有那种 omg 被分配在堆中的情况?

作者: pitsou7   发布时间: 2011-12-14

不可能有,struct都分配在栈中,除非它是另一个类的成员:

class A
{
  public OMG omg=new OMG(37);
}

这样,omg作为类A实例的一部分就被分配在堆中了,

引用 5 楼 pitsou7 的回复:
引用 2 楼 stonespace 的回复:

OMG omg = new OMG(37); 这句话如果在方法中调用,那么omg必定分配在栈中,

那么是否有那种 omg 被分配在堆中的情况?

作者: stonespace   发布时间: 2011-12-14