我是C#的初学者,只是一些问题,可以说我们有一个“ Person”类,
我知道我们什么时候喜欢:
Person p = new Person();
我们在堆上创建一个p对象,p将被垃圾回收。
所以我的问题是:
Q1-如果我想通过避免使用'new'关键字在堆栈上创建一个类的实例,我应该这样做吗(我知道通过声明Person为Struct可以完成相同的工作,但是我只希望该类具有行为以相同的方式):
Person p = Person();
我刚刚做的Q2-:
Person p;
是否调用了默认构造函数?还是没有调用默认构造函数,只分配了一块堆栈内存?
答案 0 :(得分:0)
第一季度:
尝试在不使用new
关键字的情况下初始化对象将导致编译时错误。因此,答案是否。
第二季度:
如果无法初始化对象,则不会调用任何构造函数。分配了空间并将其设置为NULL
。因此,在这种情况下,p
将被视为NULL
。
您可以将Person
做成一个结构。结构在C#中被视为值类型,因此它们将被分配在堆栈上。但是,如果结构中有属于引用类型的成员,它们仍将分配在堆上。
为对象分配空间时,可以在其范围内引用它。即使引用的内存位于堆上,引用本身也位于堆栈上。因此,一旦GC意识到没有引用指向堆上的一块内存,它将被释放。
我不认为有可能在C#中为Stack上的引用类型分配空间。如果要实现这一点,请尝试使用非托管运行时。