C#这个初始化器真的多余吗?

时间:2010-01-08 09:42:12

标签: c# resharper stylecop

我有以下代码行:

var dmrReceived = new DownloadMessagesReport();

StyleCop和ReSharper建议我删除冗余初始化程序。但是,如果我用

替换它
DownloadMessagesReport dmrReceived;

当然这会产生一个未设置为对象实例的对象引用吗?我使用的是.NET 3.5。你不再需要手动实例化对象吗?

接下来的一行是:

dmrReceived = dc.DownloadNewMessages(param, param2, param3);

值得注意的是dc是从WCF服务生成的类。所以DownloadNewMessages是一种WCF Web服务方法。

6 个答案:

答案 0 :(得分:12)

如果它是一个字段,它将自动初始化为其默认值 - null 作为参考类型。然而,鉴于var,我猜它不是,并且你实际上是在你的代码中进一步实例化它,从而丢弃你在这里实例化的值。您不需要初始化声明它的变量。如果您想使用var,那么我建议您在实际使用它的地方声明它。

答案 1 :(得分:7)

所以你的代码是

var dmrReceived = new DownloadMessagesReport();
dmrReceived = dc.DownloadNewMessages(param, param2, param3);

第二行不填充您在第一行创建的对象,但它完全替换该对象。因此不需要第一个赋值(因为第一个对象从未使用过),这就是R#警告的内容。

答案 2 :(得分:2)

如果在分配dmrReceived之前访问DownloadMessagesReport dmrReceived; ... if(condition) { dmrReceived = new DownloadMessagesReport(); } else { throw new Exception("oh no"); } return dmrReceived.SomeProperty; ,则只会生成对象引用错误。很多时候,resharper说初始化器是冗余的原因是变量总是在每个可能的执行路径中被赋予另一个值。

SomeProperty

访问dmrReceived是代码中{{1}}实际需要拥有值的第一个位置。从代码的其余部分开始,如果没有为其赋值,就无法获得该代码行,因此,可能已分配的初始值不会在任何执行路径中使用,因此将是多余的

答案 3 :(得分:1)

  

“你不再需要手动了   实例化对象?“

当然你需要“手动”实例化对象,编译器如何知道何时或何处实例化它?

一个简单的场景是:

MyType x;

if ( EverythingWorkedOut )
    x = new MyType(params);
else
    x = null;

如果编译器第一次实例化它,那么在所有代码中它将是冗余的并且开销更大。

不要相信ReSharper或任何其他计算机智能的东西超过你自己的直觉!你知道他们并不总是对的。

只是旁注,您不需要x = null;,因为应该是非实例化对象的默认值。

答案 4 :(得分:0)

当然这已经足够了?

DownloadMessagesReport dmrReceived = dc.DownloadNewMessages(param, param2, param3);

答案 5 :(得分:0)

假设这是您的代码:

var dmrReceived = new DownloadMessagesReport();
dmrReceived = dc.DownloadNewMessages(param, param2, param3);

您正在第一行创建DownloadMessagesReport的实例。然后通过为dmrReceived变量分配从DownloadNewMessages方法返回的另一个值来抛弃此对象。第一个new DownloadMessagesReport()对象是多余的。您可以有效地创建垃圾收集器在某些时候必须清理的垃圾。

这就是ReSharper和StyleCop向你展示警告的原因。

如果你可以在声明变量的同一行中用实际值初始化变量,那就去做吧。