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);