我使用的语言是C#
假设我们要实例化T
类型的对象,然后将其设置为相同类型的另一个对象。
我认为,这可以通过两种方式完成:
T a = new T();
a=b;
或
T a = b;
这两种方式之间哪种方式更好?我认为,在第二种方式中,编译器以第一种方式实例化对象,使用new运算符 - 我认为这是实现此目的的唯一方法。后续,它将a
等于b
我们应该使用第一种还是第二种方法?为什么?
提前感谢您的帮助!
答案 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 Types和Type Fundamentals by Jeffrey Richter
答案 1 :(得分:1)
你在这里真正做的是存储对象引用。
因此T a = new T();
将实例化T类的新实例并将其引用(指针)存储在a
变量中。
T a = b;
会a
存储与object reference
相同的b
。
另外,如果您想知道编译器对所有这些内容的看法,请对其进行编码并使用IlDasm
或Redgate Reflector
答案 2 :(得分:-1)
在第一个示例中,首先实例化一个T类型的新对象,并将其分配给名为a
的变量。然后使用b
重写参考。
在第二个示例中,您只将一些现有变量b
分配给变量。
这些不等同......
第二种方法在这种特定情况下更有意义。第一个应该仅被视为一种方法,以确保变量a
包含一些默认值,如果以后出现问题(例如创建对象b
)。