C#使用new来实例化对象

本文关键字:实例化 对象 new 使用 | 更新日期: 2023-09-27 18:30:11

根据我对C++的经验,我知道在C中,声明为ClassName ObjectName;的对象存储在堆栈上,声明为ClassName ObjectName = new ClassName;的对象则存储在堆上。

在C#中,似乎到处都告诉我必须使用new关键字,即不能初始化像ClassName ObjectName;这样的对象,即

Product P;
P.someMethod();

为什么会这样?

C#使用new来实例化对象

在C#类中,对象和对象中的任何值都将始终存储在堆中。新关键字在堆上为对象及其具有的任何值分配内存,并返回对其位置的引用。在此之前,您应该无法使用对象函数。

例如:

Product P = new Product();

p实际上是对所分配对象的引用。一个对象可以对同一个对象有多个引用。

Product C = P;

在这种情况下,C不复制p,但它复制对对象的引用。

结构与对象的工作方式不同,因为它们是在堆栈上分配的。这意味着与上面相同的操作将实际复制结构并在堆栈上为其分配新内存。

为了清晰起见,我将回答我自己的问题。

mohits00691和Jon Skeet的回答结合起来就澄清了这一点。即使P被声明为一种Product类型,它也没有默认值,并且在设置为"=new Product"之前不会被实例化。

这与C++不同,在C++中,Product P将实例化Product类的对象。

据我所知,代码如下:

Product p;
p.someFunction();

将在仅编译时引发错误:"Unassigned Local variable"。因此,在C#中使用之前,您需要为每个变量赋予值,无论是引用类型还是值类型。