在堆栈上创建类的实例

时间:2019-03-05 22:32:22

标签: c# garbage-collection stack heap-memory

我是C#的初学者,只是一些问题,可以说我们有一个“ Person”类,

我知道我们什么时候喜欢:

Person p = new Person();

我们在堆上创建一个p对象,p将被垃圾回收。

所以我的问题是:

Q1-如果我想通过避免使用'new'关键字在堆栈上创建一个类的实例,我应该这样做吗(我知道通过声明Person为Struct可以完成相同的工作,但是我只希望该类具有行为以相同的方式):

Person p = Person();

我刚刚做的Q2-:

Person p; 

是否调用了默认构造函数?还是没有调用默认构造函数,只分配了一块堆栈内存?

1 个答案:

答案 0 :(得分:0)

第一季度:

尝试在不使用new关键字的情况下初始化对象将导致编译时错误。因此,答案是

第二季度:

如果无法初始化对象,则不会调用任何构造函数。分配了空间并将其设置为NULL。因此,在这种情况下,p将被视为NULL

其他信息

您可以将Person做成一个结构。结构在C#中被视为值类型,因此它们将被分配在堆栈上。但是,如果结构中有属于引用类型的成员,它们仍将分配在堆上。

为对象分配空间时,可以在其范围内引用它。即使引用的内存位于堆上,引用本身也位于堆栈上。因此,一旦GC意识到没有引用指向堆上的一块内存,它将被释放。

我不认为有可能在C#中为Stack上的引用类型分配空间。如果要实现这一点,请尝试使用非托管运行时。