要"新"还是不要"新"

Bob*_*ith 6 .net c# allocation new-operator

在使用new关键字时是否遵循经验法则,何时在声明对象时不遵循?

List<MyCustomClass> listCustClass = GetList();
Run Code Online (Sandbox Code Playgroud)

要么

List<MyCustomClass> listCustClass = new List<MyCustomClass>();
listCustClass = GetList();
Run Code Online (Sandbox Code Playgroud)

eri*_*len 43

在第二种情况下,您在第一行创建一个新对象,只是将它扔到第二行.完全没必要.


tva*_*son 18

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

我可能会将初始化用于新的空列表的示例.

List<MyCustomClass> listCustClass = new List<MyCustomClass>();
listCustClass.AddRange( GetList() );
Run Code Online (Sandbox Code Playgroud)

要么

List<MyCustomClass> listCustClass = new List<MyCustomClass>();
try
{
    listCustClass = GetList();
}
catch (SqlException)
{
}
return listCustClass;
Run Code Online (Sandbox Code Playgroud)


ben*_*wey 8

在您的方案中,似乎实际创建的对象正在您的GetList()方法中执行.所以你的第一个样本将是正确的用法.

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

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