首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是“新”还是不是“新”

是“新”还是不是“新”
EN

Stack Overflow用户
提问于 2009-04-20 16:04:11
回答 9查看 988关注 0票数 7

在声明对象时,什么时候使用new关键字,什么时候不使用,有没有一个经验法则可以遵循?

代码语言:javascript
复制
List<MyCustomClass> listCustClass = GetList();

代码语言:javascript
复制
List<MyCustomClass> listCustClass = new List<MyCustomClass>();
listCustClass = GetList();
EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2009-04-20 16:18:02

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

在创建时,您的List<MyCustomClass>存储在堆中,并且您的listCustClass只是对这个新对象的引用。当您将listCustClass设置为GetList()时,listCustClass的引用指针将被丢弃,取而代之的是指向GetList()返回的任何内容的引用指针(可能为null)。当这种情况发生时,你的原始List<MyCustomClass>仍然在堆中,但是没有对象指向它,所以它只是浪费资源,直到垃圾收集器过来清理它。

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

票数 8
EN

Stack Overflow用户

发布于 2009-04-20 16:06:14

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

票数 43
EN

Stack Overflow用户

发布于 2009-04-20 16:05:52

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

我可能使用初始化到一个新的空列表的例子。

代码语言:javascript
复制
List<MyCustomClass> listCustClass = new List<MyCustomClass>();
listCustClass.AddRange( GetList() );

代码语言:javascript
复制
List<MyCustomClass> listCustClass = new List<MyCustomClass>();
try
{
    listCustClass = GetList();
}
catch (SqlException)
{
}
return listCustClass;
票数 18
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/768922

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档