是否使用“new”关键字?(涉及IT技术)

7

在声明对象时,何时使用new关键字,何时不使用有什么经验法则可遵循吗?

List<MyCustomClass> listCustClass = GetList();

或者

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

6
不,我认为他不理解“new”的意思是一个构造函数调用和创建新对象。否则他就会知道不应该创建新对象然后立即丢弃它。也许他来自VB.NET,那里“New”关键字可以成为声明语法的一部分,所以他认为C#中也是这样。 - John Saunders
我不确定这个问题是否适合使用 C# 和 .NET 标签,因为它是一个相当一般的面向对象编程的问题。 - Welbog
1
我会保留这些标签,因为我认为这不是一个面向对象的问题;而是一个“我不理解C#语法”的问题。他不可能在问“我应该在什么时候创建一个对象,然后在下一条语句中将其丢弃”(希望如此)。 - John Saunders
我可以接受这一点,这就是为什么我保留了标签,但我在考虑如何使问题更加通用,以便于任何可能在Google中输入类似内容并最终来到这里的人。这个问题技术上适用于Java、C++和其他任何类似C语言的编程语言。 - Welbog
很棒的标题,我认为应该以“这就是问题”结尾,哈哈哈 - bendewey
显示剩余3条评论
9个回答

43

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

在第二个案例中,您在第一行创建了一个新对象,只是在第二行将其丢弃。这是完全没有必要的。

18

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

以下是我可能使用初始化为新的空列表的示例:

List<MyCustomClass> listCustClass = new List<MyCustomClass>();
listCustClass.AddRange( GetList() );
或者
List<MyCustomClass> listCustClass = new List<MyCustomClass>();
try
{
    listCustClass = GetList();
}
catch (SqlException)
{
}
return listCustClass;

8
在你的场景中,似乎实际创建对象是在GetList()方法内部执行的。因此,你的第一个示例将是正确的用法。
当创建完List<MyCustomClass>后,它存储在堆中,而listCustClass只是对该新对象的引用。当你将listCustClass设置为GetList()时,listCustClass的引用指针被丢弃并替换为对GetList()返回内容(可能为空)的引用指针。当发生这种情况时,原始的List<MyCustomClass>仍然存在于堆中,但没有对象指向它,因此它只是浪费资源,直到垃圾回收器来清理它。
总之,每当你创建一个新对象然后放弃它,就像第二个示例一样,你基本上就是通过填充堆中无用的信息来浪费内存。

3
您使用new关键字构造一个对象的新实例。从您的问题中不清楚GetList方法的作用,但可能是创建一个新列表(因此将new关键字移到其他位置)或返回一个现有列表(某人曾经使用new创建过)。

GetList应该使用new来创建一个列表,以便它可以将其返回给调用者。对吗?还有其他实现GetList的方法吗? - Bob Smith
重点是有人正在创建列表,无论是GetList还是GetList调用的某个方法。 - Kent Boogaart

3
新关键字基本上用于在堆上分配空间。如果您正在创建值类型(结构等...),则不必使用new关键字。但是,在使用引用变量之前必须进行新的操作。
在上面的示例中,似乎GetList()返回的是一个引用,该引用的类型为List,该引用可能已在函数内的某个位置创建(new'd)。因此,在这种情况下,new'ing是没有意义的。

2

如果您可以在不失去意义和清晰度的情况下内联它,那么请务必内联。

编辑:由于我经常进行内联操作,所以我甚至没有考虑过孤立的对象引用。呃。


啊哈哈。我的同事整天都在用鼠标错过了很多次,一定是星期一的缘故。=) - J. Steen

1

没有铁律,但通常情况下可以应用常识。

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

然而,第一个代码片段是完全适当的。


0
不要考虑“我在声明时应该使用new吗”的问题。
当你进行赋值(可以是声明的一部分)时,你使用new。
第一个例子是正确的,第二个例子是不必要的浪费运行时资源。

0
在C#中,所有类的实例都必须使用new关键字创建。如果您当前的上下文中没有使用new,则可能存在空引用,或者您正在调用使用new来实例化类的函数。
在这种情况下,看起来GetList()使用new来创建一个新列表。

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