要“新”还是不要“新”
在使用new
关键字时是否遵循经验法则,何时在声明对象时不遵循?
List listCustClass = GetList();
要么
List listCustClass = new List(); listCustClass = GetList();
在您的场景中,似乎正在GetList()
方法内执行对象的实际创建。 所以你的第一个样本将是正确的用法。
创建时, List
存储在堆中,而listCustClass
只是对该新对象的引用。 当您将listCustClass设置为GetList()
, listCustClass
的引用指针将被丢弃,并替换为GetList()
返回的引用指针(可能为null)。 当发生这种情况时,您的原始List
仍然在堆中,但没有对象指向它,因此它只是浪费资源,直到垃圾收集器到来并清理它。
要在每次创建新对象时总结它,然后放弃它,就像第二个例子一样,你实际上是通过用无用信息填充堆来浪费内存。
在第二种情况下,您在第一行创建一个新对象,只是将它扔到第二行。 完全没必要。
在这种情况下,只有您的第一个示例有意义,因为在第二种情况下,您立即用方法返回的创建列表替换创建的列表。 将列表初始化为新的空列表在您添加到该列表的情况下或者您正在调用以填充列表的方法可能以某种方式导致空值时会有意义,否则您将期望空列表。
我可以将初始化用于新的空列表的示例。
List listCustClass = new List (); listCustClass.AddRange( GetList() );
要么
List listCustClass = new List (); try { listCustClass = GetList(); } catch (SqlException) { } return listCustClass;
new关键字主要用于在堆上分配空间。 如果要创建值类型(结构等等),则不必使用new关键字。 但是,参考变量在使用之前必须是新的。
在上面的示例中,似乎GetList()返回一个类型为List的引用,该引用将在函数内的某处创建(new’d)。 因此,在这种情况下,新的是毫无意义的。
您可以使用new
关键字构造对象的新实例。 从你的问题中不清楚GetList
方法的作用,但可能是要么创建一个新列表(从而在其他地方移动new
关键字),要么返回一个现有列表( 有人使用new
创建一个点)。
如果你可以内联它,而不会失去你正在实现的意义和清晰度,无论如何,内联。
编辑:而且,由于我经常内联,我甚至没有想到孤立的对象引用。 卫生署。 =)
没有经验法则,但有一个常识,你可以应用大部分时间。
在创建对象时需要对象进行实例化。 你的GetList()
函数表面上返回一个(创建的)IList,因此第二个代码片段是非常不必要的(你实例化一个IList并在下一行有效地丢弃它)。
但是,第一个片段是完全合适的。
不要以“当我申报时应该使用新”这个词来考虑它。
在分配时使用new(可以是声明的一部分)。
第一个例子是正确的,第二个例子是不必要地浪费运行时资源。
在C#中,必须使用new
关键字创建所有类的实例。 如果您在当前上下文中没有使用new
,则要么具有空引用,要么调用使用new
来实现类的函数。
在这种情况下,似乎GetList()使用new
来创建新列表。