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

C# 这个初始化器真的是多余的吗?,c#,resharper,stylecop,C#,Resharper,Stylecop,我有以下代码行: var dmrReceived = new DownloadMessagesReport(); StyleCop和ReSharper建议我删除多余的初始值设定项。但是如果我用 DownloadMessagesReport dmrReceived; 这肯定会生成一个未设置为对象实例的对象引用吗?我正在使用.NET3.5。您是否不再需要手动实例化对象 下一行是: dmrReceived = dc.DownloadNewMessages(param, param2, param3

我有以下代码行:

var dmrReceived = new DownloadMessagesReport();
StyleCop和ReSharper建议我删除多余的初始值设定项。但是如果我用

DownloadMessagesReport dmrReceived;
这肯定会生成一个未设置为对象实例的对象引用吗?我正在使用.NET3.5。您是否不再需要手动实例化对象

下一行是:

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

值得注意的是,
dc
是一个由WCF服务生成的类。因此,
DownloadNewMessages
是一种WCF web服务方法。

如果它是一个字段,它将自动初始化为引用类型的默认值-null。然而,考虑到
var
,我猜它不是,而且实际上您正在代码中进一步实例化它,从而丢弃您在这里实例化的值。您不需要在声明变量的地方初始化它。如果您想使用
var
您确实需要,但是我建议您在实际第一次使用它的地方声明它

“您是否不再需要手动操作 实例化对象?”

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

一个简单的场景是:

MyType x;

if ( EverythingWorkedOut )
    x = new MyType(params);
else
    x = null;
如果编译器第一次实例化它,那么它在所有代码中都是多余的,而且开销更大

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


只是一个旁注,您实际上不需要执行
x=null如果在分配对象之前访问了
dmrReceived
,则只会生成对象引用错误。很多时候,resharper之所以说初始值设定项是多余的,是因为变量总是在每个可能的执行路径中被分配另一个值

i、 e

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

因此,您的代码是

var dmrReceived = new DownloadMessagesReport();
dmrReceived = dc.DownloadNewMessages(param, param2, param3);
第二行不会填充在第一行中创建的对象,但会完全替换该对象。因此不需要第一个赋值(因为第一个对象从未使用过),这就是R#所警告的。

这肯定足够了吗

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

假设这是您的代码:

var dmrReceived = new DownloadMessagesReport();
dmrReceived = dc.DownloadNewMessages(param, param2, param3);
您正在第一行创建一个
DownloadMessagesReport
的实例。然后通过为
dmrReceived
变量分配另一个从
DownloadNewMessages
方法返回的值,将该对象丢弃。第一个
新的DownloadMessagesReport()
对象是冗余的。您可以有效地创建垃圾收集器在某个时候必须清理的垃圾

这就是为什么ReSharper和StyleCop向您显示警告


如果您可以在声明变量的同一行中使用实际值初始化变量,那么就这样做。

该方法的其余代码是什么?(这对3.5 btw来说不是什么新鲜事)我认为只有这个问题回答了这个问题。
var dmrReceived = new DownloadMessagesReport();
dmrReceived = dc.DownloadNewMessages(param, param2, param3);