2

我有以下代码行:

var dmrReceived = new DownloadMessagesReport();

StyleCop 和 ReSharper 建议我删除多余的初始化程序。但是,如果我将其替换为

DownloadMessagesReport dmrReceived;

这肯定会生成一个未设置为对象实例的对象引用吗?我正在使用 .NET 3.5。您不再需要手动实例化对象吗?

下一行是:

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

值得注意的是,它dc是从 WCF 服务生成的一个类。DownloadNewMessagesWCF Web 服务方法也是如此。

4

6 回答 6

12

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

于 2010-01-08T09:44:06.867 回答
9

所以你的代码是

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

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

于 2010-01-08T11:18:18.320 回答
2

dmrReceived如果在分配之前访问它,那只会产生对象引用错误。很多时候,resharper 说初始化器是多余的的原因是变量总是在每个可能的执行路径中被分配另一个值。

IE

DownloadMessagesReport dmrReceived;

...

if(condition) {
    dmrReceived = new DownloadMessagesReport();
} else {
    throw new Exception("oh no");
}

return dmrReceived.SomeProperty;

访问SomeProperty是代码中dmrReceived实际需要值的第一个位置。如下代码的其余部分,如果不为其分配值,就无法到达该代码行,因此,可能已分配的初始值不会在任何执行路径中使用,因此是多余的.

于 2010-01-08T09:47:12.800 回答
1

“您不再需要手动实例化对象了吗?”

当然,您需要“手动”实例化对象,否则编译器如何知道何时何地实例化它?

一个简单的场景是这样的:

MyType x;

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

如果编译器第一次实例化它,这将是多余的,并且在所有代码中都会产生更多开销。

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

只是附带说明,您实际上不需要这样做,x = null;因为它应该是非实例化对象的默认值。

于 2010-01-08T09:47:11.067 回答
1

假设这是您的代码:

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

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

这就是 ReSharper 和 StyleCop 向您显示警告的原因。

如果您可以在声明变量的同一行中使用实际值初始化变量,请执行此操作。

于 2015-10-14T03:23:25.267 回答
0

这确定就够了吗?

DownloadMessagesReport dmrReceived = dc.DownloadNewMessages(param, param2, param3);
于 2013-12-18T10:17:39.150 回答