C#:哪些数据类型需要NEW来分配内存?

时间:2011-11-11 18:24:34

标签: c# variables memory-management new-operator

我想更好地理解使用'new'为变量分配内存与不需要new的情况之间的区别。

当我宣布

int i; // I don't need to use new.

但是

List<string> l = new List<string>();

说“new int()”是否有意义?

7 个答案:

答案 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