C# 至;新";还是不去;新";

C# 至;新";还是不去;新";,c#,.net,new-operator,allocation,C#,.net,New Operator,Allocation,在声明对象时,何时使用new关键字以及何时不使用关键字,是否有经验法则 List<MyCustomClass> listCustClass = GetList(); List listCustClass=GetList(); 或 List listCustClass=new List(); listCustClass=GetList(); 在本例中,只有第一个示例有意义,因为在第二个示例中,您将立即用该方法返回的列表替换创建的列表。将列表初始化为新的空列表在向该列表中添加内容的情

在声明对象时,何时使用
new
关键字以及何时不使用关键字,是否有经验法则

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

List listCustClass=new List();
listCustClass=GetList();

在本例中,只有第一个示例有意义,因为在第二个示例中,您将立即用该方法返回的列表替换创建的列表。将列表初始化为新的空列表在向该列表中添加内容的情况下,或者当您调用的填充列表的方法可能会导致空值时,将列表初始化为新的空列表是有意义的

List<MyCustomClass> listCustClass = new List<MyCustomClass>();
listCustClass.AddRange( GetList() );
我可能使用初始化来创建新的空列表的示例

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

List listCustClass=new List();
尝试
{
listCustClass=GetList();
}
捕获(SqlException)
{
}
返回类;

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

如果你能在不失去意义和清晰的情况下将其内联,无论如何,内联


编辑:而且,由于我经常内联,我甚至没有想到孤立对象引用。Doh.=)

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

不要认为它是“我在声明时应该使用new吗?”

赋值时使用new(可以是声明的一部分)


第一个示例是正确的,第二个示例是对运行时资源的不必要浪费。

没有经验法则,但有一个常识,您可以在大多数时间应用

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

但是,第一个代码片段是完全合适的。

在C#中,所有类的实例都必须使用
new
关键字创建。如果在当前上下文中未使用
new
,则可能有一个空引用,或者正在调用一个使用
new
实例化类的函数


在本例中,GetList()似乎使用
new
创建新列表。

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


在上面的示例中,似乎GetList()正在返回一个属于List类型的引用,该引用本应在函数中的某个位置创建(新建)。因此,在这个场景中,新建是没有意义的。

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

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


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

你真的在问你是否应该编写工厂吗?不,我想他不明白“new”意味着构造函数调用和创建一个新对象。否则,他就不会创建一个新对象,然后将其扔掉。也许他来自VB.NET,在VB.NET中,“New”关键字可以作为声明语法的一部分,所以他认为这就是C#中的内容。我不确定这个问题上的C#和.NET标记,因为这是一个非常普遍的OOP问题。我会保留这些标记,因为我认为这不是OOP问题;这是一个“我不懂C#的语法”的问题。他不可能会问“我什么时候应该创建一个对象,然后在下一个语句中扔掉它”(我希望)。我可以接受这一点,这就是为什么我保留标签的原因,但我正在考虑如何使这个问题对于任何可能在谷歌中键入类似内容并最终出现在这里的人来说更通用。这在技术上可以应用于java和C++以及任何其他类似C语言的语言。我的同事也整天带着他的鼠标不见了。必须是星期一GetList应该使用new创建一个列表,以便它可以将其返回给调用方。正确的?有没有其他方法来实现GetList?关键是有人在创建列表,不管是GetList还是GetList调用的某个方法。
List<MyCustomClass> listCustClass = new List<MyCustomClass>();
try
{
    listCustClass = GetList();
}
catch (SqlException)
{
}
return listCustClass;