【问题标题】:Are there any valid circumstances where foo=foo makes sense?是否存在 foo=foo 有意义的任何有效情况?
【发布时间】:2011-03-03 10:38:18
【问题描述】:

清理我继承的C#项目上的一些警告,我发现了这段代码sn-p:

private bool _WriteValue(object FieldValue,..,..)
  ...
  if(MultipFactor!=1)
     FieldValue=((double)FieldValue)*MultipFactor;
  else
    FieldValue=FieldValue;

我显然没有想太多就烧毁了else 块,只是想知道为什么以前的程序员离开了那部分。

  • 是不是太懒了才删除?
  • 对于某些未来的程序员来说,在发生特定更改时节省一些输入是否是一种礼貌?
  • 是不是隐藏了什么危险的东西?

在您看来,foo=foo 是否有意义?


关于_WriteValue 方法的更多细节:

_WriteValue 方法被包装到不同的重载 WriteValue 方法中,这些方法传递给 object FieldValue 参数,值如下类型:intlongstringDatetime

【问题讨论】:

  • Fieldvalue的属性设置器有副作用吗?
  • 如果是我,我会摆脱 if 并每次都进行乘法运算!

标签: c# refactoring legacy


【解决方案1】:

如果FieldValue 是一个属性,那么set 运算符可能会触发一些代码,那么在这种情况下自赋值是否有意义?!

一个例子是:

public string FieldValue
{
    get
    {
        return _fieldValue;
    }
    set
    {
        _fieldValue = value;
        Trace.WriteLine( string.Format("Received value '{0}'.", value ) );
    }
}

(我的回答是在发帖人添加 FieldValue 实际上是方法参数,而不是我首先假设的属性之前给出的)

【讨论】:

  • 但这会打开一罐蠕虫,属性的副作用,哇!如果不知道这些副作用是什么,阅读它的人仍然没有任何意义。
  • @Mr.是的,我同意,我只是在猜测一个使用场景:-)
  • @systempuntoout 当然。请注意,在您添加 FieldValue 实际上是方法参数而不是我最初假设的属性的信息之前,我的回复是对您的文章。
【解决方案2】:

有一些糟糕的程序员,他们通常会留下一些垃圾......

【讨论】:

    【解决方案3】:

    程序员可能不知道条件断点的存在,并利用该语句作为放置条件触发断点的位置。

    只是为了说清楚,我并不是说这是一个好主意,但在没有条件断点的环境中这是一个技巧。

    【讨论】:

      【解决方案4】:

      如果FieldValue 后面有getter 或setter,那么它可能会产生副作用。例如:

      private double myFieldValue;
      
      public double FieldValue
      {
          get { return myFieldValue; }
          set { myFieldValue = value; ReformatSystemVolume(); }
      }
      

      使用带有副作用的吸气剂是非常糟糕的做法。然而,setter 广泛的副作用是很常见的,尽管这些副作用不像我的示例中那样严重!

      【讨论】:

        【解决方案5】:

        在 C++ 中,你可以定义 operator= 来做任何你想做的事情:)

        【讨论】:

        • 在 C# 中你不能,至少对于赋值运算符不能。在 C# 中,只有一元、二元和关系运算符可以重载。
        • C++ 是从哪里进入这个问题的?
        • 也许代码是从 C++ 移植过来的,因此最初是从 = 运算符重载的地方复制过来的。因此,如果是这种情况,功能可能实际上被破坏了。
        【解决方案6】:

        在某些低级硬件情况下,设置该值会产生(理想的)副作用,而这些副作用无法以其他方式调用。这很愚蠢,但超出了程序员修复的范围。我只在纯 C 代码中看到过这种情况,所以我确定这不是您在 C# 代码中看到这种情况的原因,但它确实发生了。

        【讨论】:

          【解决方案7】:

          请注意,这是您应该评论的极好(而且非常常见)的示例:“明显”“修复”实际上会破坏事物的任何事情。确保从挫折中吸取教训!

          【讨论】:

          • 您是否建议评论我已删除 else 块?
          • 对不起,我的意思是写给最初写这篇文章的人,或者如果你找到了它存在的正当理由。我的观点是,如果您做过类似的事情,请记住这一集,让您的同事或未来的自己免受同样的痛苦!
          猜你喜欢
          • 1970-01-01
          • 2013-11-17
          • 2013-11-06
          • 1970-01-01
          • 2018-10-18
          • 2010-12-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多