7

new声明对象时何时使用关键字,何时不使用,是否有一个经验法则?

List<MyCustomClass> listCustClass = GetList();

或者

List<MyCustomClass> listCustClass = new List<MyCustomClass>();
listCustClass = GetList();
4

9 回答 9

43

在第二种情况下,您在第一行创建一个新对象只是为了在第二行将其丢弃。完全没有必要。

于 2009-04-20T16:06:14.233 回答
18

在这种情况下,只有您的第一个示例有意义,因为在第二种情况下,您将立即将创建的列表替换为方法返回的列表。将列表初始化为新的空列表在您添加到该列表的情况下或当您调用以填充列表的方法可能会以某种方式导致空值时是有意义的,否则您会期望一个空列表.

我可能会对新的空列表使用初始化的示例。

List<MyCustomClass> listCustClass = new List<MyCustomClass>();
listCustClass.AddRange( GetList() );

或者

List<MyCustomClass> listCustClass = new List<MyCustomClass>();
try
{
    listCustClass = GetList();
}
catch (SqlException)
{
}
return listCustClass;
于 2009-04-20T16:05:52.173 回答
8

在您的场景中,对象的实际创建似乎是在您的GetList()方法中执行的。因此,您的第一个示例将是正确的用法。

创建时,您List<MyCustomClass>的存储在堆中,您listCustClass只是对该新对象的引用。当您将 listCustClass 设置为GetList()的引用指针时,listCustClass将被丢弃并替换为指向任何GetList()返回的引用指针(可能为空)。发生这种情况时,您的原始List<MyCustomClass>文件仍在堆中,但没有对象指向它,因此它只是在浪费资源,直到垃圾收集器出现并清理它。

总结一下,每次你创建一个新对象然后放弃它,就像第二个例子一样,你实际上是在通过用无用的信息填充堆来浪费内存。

于 2009-04-20T16:18:01.940 回答
3

您使用new关键字来构造对象的新实例。从您的问题中不清楚该GetList方法的作用,但大概是创建一个新列表(从而将new关键字移动到其他地方)或返回一个现有列表(有人在某个时候使用创建new)。

于 2009-04-20T16:06:30.270 回答
3

new 关键字基本上用于在堆上分配空间。如果您正在创建值类型(结构等),则不必使用 new 关键字。但是,引用变量在使用之前必须是新的。

在您上面的示例中,似乎 GetList() 正在返回一个类型为 List 的引用,该引用将在函数内的某处创建(新建)。因此,在这种情况下,新建是没有意义的。

于 2009-04-20T16:09:37.063 回答
2

如果你可以内联它而不失去你正在完成的事情的意义和清晰度,那么无论如何,内联。

编辑:而且,因为我经常内联,我什至没有考虑过孤立对象引用。多哈。=)

于 2009-04-20T16:06:23.997 回答
1

没有经验法则,但有一个常识,您可以在大多数情况下应用。

对象在创建时需要实例化。您的GetList()函数表面上返回一个(创建的)IList,因此第二个代码片段是完全不必要的(您实例化一个 IList 并在下一行有效地丢弃它)。

然而,第一个片段是完全合适的。

于 2009-04-20T16:07:44.523 回答
0

不要以“我应该在声明时使用 new ”的方式来考虑它。

在分配时使用 new (可以是声明的一部分)。

第一个例子是正确的,第二个是对运行时资源的无谓浪费。

于 2009-04-20T16:07:06.197 回答
0

在 C# 中,所有类的实例都必须使用new关键字创建。如果您没有new在当前上下文中使用,那么您要么有一个空引用,要么您正在调用一个new用于实例化类的函数。

在这种情况下,GetList() 似乎new用于创建一个新列表。

于 2009-04-20T16:09:18.267 回答