【问题标题】:create an instance of class on stack [duplicate]在堆栈上创建类的实例[重复]
【发布时间】:2019-07-27 12:03:50
【问题描述】:

我是 C# 的初学者,只是一些问题,假设我们有一个类 'Person',

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

Person p = new Person();

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

所以我的问题是:

Q1- 如果我想通过避免使用“new”关键字在堆栈上创建类的实例,我应该喜欢吗(我知道通过将 Person 声明为 Struct 会做同样的工作,但我只是希望类表现以同样的方式):

Person p = Person();

Q2- 当我这样做时:

Person p; 

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

【问题讨论】:

  • 如果你将Person 设为结构,它应该放在栈上而不是堆上。

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


【解决方案1】:

第一季度:

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

第二季度:

当您未能初始化对象时,不会调用构造函数。空间已分配并设置为NULL。所以在这种情况下,p 将被视为NULL

附加信息

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

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

我不相信在 C# 中为堆栈上的引用类型分配空间是可能的。如果您想实现这一点,请尝试使用非托管运行时。

【讨论】:

    猜你喜欢
    • 2017-06-21
    • 1970-01-01
    • 2017-06-06
    • 2013-12-09
    • 1970-01-01
    • 1970-01-01
    • 2011-12-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多