根据我对C ++的经验,我知道在C中,声明为ClassName ObjectName;
的对象存储在堆栈中,声明为ClassName ObjectName = new ClassName;
的对象存储在堆上。
在C#中,我似乎从各地都被告知必须使用new
关键字,即你不能初始化像ClassName ObjectName;
这样的对象,即
Product P;
P.someMethod();
为什么会这样?
答案 0 :(得分:0)
我会回答我自己的问题,为了清楚起见,将信息拉到一起。
mohits00691和Jon Skeet的答案的组合清除了这一点。即使P被声明为一种产品类型,它也没有默认值,并且在设置为“= new Product”之前不会实例化。
这与C ++不同,其中Product P
将实例化Product类的对象。
答案 1 :(得分:0)
在C#类对象中,对象中的任何值将始终存储在堆上。新关键字在堆上为对象及其拥有的任何值分配内存,并将引用返回到其位置。在此之前,您应该无法使用对象函数。
所以在示例中:
Product P = new Product();
p实际上是对已分配对象的引用。对象可以具有对同一对象的多个引用。
Product C = P;
在C不复制P的情况下,它会复制对象的引用。
结构与对象的工作方式不同,因为它们是在堆栈上分配的。这意味着与上面相同的操作实际上将复制结构并在堆栈上为它分配新内存。
答案 2 :(得分:-2)
据我所知,代码如下:
Product p;
p.someFunction();
仅在编译时抛出错误:"未分配的局部变量"。因此,在C#中使用它之前,需要为每个变量赋值,无论是引用类型还是值类型。