我想更好地理解使用'new'为变量分配内存与不需要new的情况之间的区别。
当我宣布
时int i; // I don't need to use new.
但是
List<string> l = new List<string>();
说“new int()”是否有意义?
答案 0 :(得分:6)
您需要使用new来分配任何引用类型(类)。
可以在没有new的情况下声明任何值类型(例如int或structs)。但是,您仍然可以使用新的。以下是有效的:
int i = new int();
请注意,在初始化之前,您无法直接访问值类型。使用结构,使用new TheStructType()
通常很有价值,因为它允许您充分利用结构成员,而无需首先显式初始化每个成员。这是因为构造函数执行初始化。对于值类型,默认构造函数始终将所有值初始化为等效值0。
此外,对于结构,您可以将new
与非默认构造函数一起使用,例如:
MyStruct val = new MyStruct(32, 42);
这提供了一种初始化struct内部值的方法。话虽如此,这里不需要,只有一个选项。
答案 1 :(得分:3)
任何引用类型(例如类)都需要new。值类型(例如int)是简单值,不需要new。
答案 2 :(得分:3)
您不需要在c#中使用新的value types。你做的所有其他类型。
答案 3 :(得分:2)
请查看new
上的此MSDN文档它还用于调用值类型的默认构造函数,例如:
int myInt = new int();
在前面的语句中,myInt初始化为0,这是int类型的默认值。该陈述与以下内容具有相同的效果:
int myInt = 0;
答案 4 :(得分:1)
int i
value type这就是为什么你不需要初始化而new List<string>()
是reference type,你需要为它分配一个对象实例
答案 5 :(得分:1)
必须使用new
分配参考类型。
值类型不必是堆分配的。 Integer,Double和struct类型是值类型的示例。作为本地var的值类型将存储在函数调用堆栈中。作为类字段的值类型将存储在类的实例数据中。
答案 6 :(得分:1)
只需检查IL:您可以看到编译器发出'initobj'或'newobj'。
为int i = 0发出initobj;和int i = new int();
http://msdn.microsoft.com/en-us/library/system.reflection.emit.opcodes.initobj(v=vs.85).aspx