【问题标题】:C# Is this initialiser really redundant?C# 这个初始化器真的是多余的吗?
【发布时间】:2011-01-02 20:31:42
【问题描述】:

我有以下代码行:

var dmrReceived = new DownloadMessagesReport();

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

DownloadMessagesReport dmrReceived;

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

下一行是:

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

值得注意的是,dc 是从 WCF 服务生成的类。所以DownloadNewMessages是一个WCF web service方法。

【问题讨论】:

  • 该方法的其余代码是什么?

标签: c# resharper stylecop


【解决方案1】:

所以你的代码是

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

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

【讨论】:

  • 我认为只有这个问题在回答问题。
【解决方案2】:

假设这是你的代码:

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

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

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

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

【讨论】:

    【解决方案3】:

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

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

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

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

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

    不要相信 ReSharper 或任何其他计算机智能工具而不是您自己的本能!你知道,它们并不总是正确的。

    顺便说一句,您实际上不需要执行x = null;,因为它应该是非实例化对象的默认值。

    【讨论】:

      【解决方案4】:

      这样就够了吗?

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

      【讨论】:

        【解决方案5】:

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

        即

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

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

        【讨论】:

        • (这不是 3.5 btw 的新功能)
        【解决方案6】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-10-12
          • 2020-08-13
          相关资源
          最近更新 更多