C#: 什么数据类型需要使用NEW来分配内存?

4
我是一名有用的助手,可以为您进行文本翻译。以下是您需要翻译的内容:

我希望更好地理解使用“new”为变量分配内存和不需要使用“new”的情况之间的区别。

当我声明

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

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

使用 "new int()" 是有意义的吗?


3
“new int()”有意义吗?实际上是有的。你会得到默认值0。但是,它仍然是值类型,而不是引用类型。 - BoltClock
1
是的,new int() 是有意义的。这里没有太多可说的;请前往 MSDN 并阅读文档 - Jon
2
@Mike Christensen:不完全准确——对值类型使用new也将它们放在堆栈上。 - BoltClock
不要把它看作是“分配内存”,而应该看作是“创建对象”。在int i = 0int i = new int()的情况下,仍然创建了一个“对象”,尽管是“在堆栈上的对象”。 - user166390
2
@MikeChristensen:其他人已经指出了该声明的缺陷。我只想添加一个链接:如果你在考虑堆栈和堆的问题,那么你是错误的。请参考这篇文章:http://blogs.msdn.com/b/ericlippert/archive/2009/04/27/the-stack-is-an-implementation-detail.aspx - user395760
显示剩余3条评论
7个回答

6

您需要使用new来分配任何引用类型(类)。

任何值类型(如int或structs)都可以无需new进行声明。但是,您仍然可以使用new。以下是有效的:

int i = new int();

请注意,在值类型初始化之前,您无法直接访问它。对于结构体而言,使用new TheStructType()通常很有价值,因为它允许您完全使用结构体成员,而不必先显式地初始化每个成员。这是因为构造函数会进行初始化。对于值类型,缺省构造函数始终将所有值初始化为相当于0的值。
此外,对于结构体,您可以使用非默认构造函数的new,例如:
MyStruct val = new MyStruct(32, 42);

这提供了一种在结构体内部初始化值的方法。尽管如此,这不是必须的,只是一种选择。

3

任何引用类型(如类)都需要使用new。值类型(如int)是简单值,不需要使用new。


3

在c#中,您不需要创建新的值类型。但是其他类型则需要创建。


2
请看这个有关new的MSDN文档。
它还用于调用值类型的默认构造函数,例如:
int myInt = new int();
在上述语句中,myInt被初始化为0,这是int类型的默认值。该语句与以下语句具有相同的效果:
int myInt = 0;

1

int i值类型,所以你不需要初始化,而new List<string>()引用类型,你需要为它分配一个对象实例。


3
无论变量类型如何,您都必须初始化变量才能使用它(有意义地使用)。 - BoltClock

1

引用类型必须使用new进行分配。

值类型不必在堆上分配。整数、双精度和结构体类型是值类型的示例。作为局部变量的值类型将存储在函数调用堆栈上。作为类字段的值类型将存储在类实例数据中。


1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接