C#以最佳方式实例化对象?

时间:2013-12-04 10:43:02

标签: c#

我使用的语言是C#

假设我们要实例化T类型的对象,然后将其设置为相同类型的另一个对象。

我认为,这可以通过两种方式完成:

T a = new T();
a=b;

T a = b;

这两种方式之间哪种方式更好?我认为,在第二种方式中,编译器以第一种方式实例化对象,使用new运算符 - 我认为这是实现此目的的唯一方法。后续,它将a等于b

我们应该使用第一种还是第二种方法?为什么?

提前感谢您的帮助!

3 个答案:

答案 0 :(得分:1)

实例化是新对象的创建。将分配新对象的内存的位置取决于T的类型。如果T是引用类型(即类,请参阅下面的链接),那么将在堆上分配新数据。如果T是值类型(即int,booleand或其他结构),则将在堆栈上分配内存。这就是new T()的作用。

接下来,您需要了解变量a的含义。如果T是引用类型,那么它将保留引用,即分配新对象的内存中的地址。如果T是值类型,则变量将包含新对象本身而不是对象的地址。

因此,T a = new T()在内存中分配新对象,并将其地址或值分配给变量a

如果您要为变量a = b分配新值,它将指向内存中的新地址(其中b点),或者它将包含b个对象的副本数据(如果它的值类型)

所以,结论:如果你需要在某个其他对象上设置变量a或保留它的数据,那么就不要实例化新对象 - 只需声明变量并为其分配现有值:

T a = b;

有用阅读:Value and Reference TypesType Fundamentals by Jeffrey Richter

答案 1 :(得分:1)

你在这里真正做的是存储对象引用。

因此T a = new T();将实例化T类的新实例并将其引用(指针)存储在a变量中。

T a = b;a存储与object reference相同的b

另外,如果您想知道编译器对所有这些内容的看法,请对其进行编码并使用IlDasmRedgate Reflector

进行查看

答案 2 :(得分:-1)

在第一个示例中,首先实例化一个T类型的新对象,并将其分配给名为a的变量。然后使用b重写参考。

在第二个示例中,您只将一些现有变量b分配给变量。

这些不等同......

第二种方法在这种特定情况下更有意义。第一个应该仅被视为一种方法,以确保变量a包含一些默认值,如果以后出现问题(例如创建对象b)。