INotifyPropertyChanged Setter Style

时间:2011-06-21 07:56:30

标签: if-statement

为了将您的数据更改反映到UI,您必须实现INotifyPropertyChanged,好的。如果我在大多数情况下查看示例,文章,教程等,那么setter看起来就像这样:

public string MyProperty
{
  //get [...]
  set
  {
    if (_correspondingField == value)
    {
      return;
    }
    _correspondingField = value;
    OnPropertyChanged("MyProperty");
  }
}

到目前为止没有问题,只有在必要时才举起活动,很酷。但是您可以将此代码重写为:

public string MyProperty
{
  //get [...]
  set
  {
    if (_correspondingField != value)
    {
      _correspondingField = value;
      OnPropertyChanged("MyProperty");
    }
  }
}

它应该做同样的事情(?),你只有一个返回的地方,它是更少的代码,它是更少无聊的代码,它更多的点(“只有必要时才行动”vs“如果没有必要的话没有,反之亦然“)。

因此,如果第二个版本的优点与第一个版本相比,为什么我很少看到这种风格?我不认为自己比那些编写框架,发表文章等的人更聪明,因此第二个版本必须有缺点。还是错了?或者我想得太多了?

提前致谢

4 个答案:

答案 0 :(得分:3)

我发现第二个例子个人更具可读性。我认为第一个例子变得普遍的原因之一是Resharper将提示使用这种风格(并自动进行转换),理由是它“减少了嵌套”。这是正确的,但在这些简单的情况下,我认为可读性更重要。

归结为意见的根本区别 - 有些程序员认为应该只有一个“返回” - 方法结束时的一个单一退出点。然后有些人认为,如果可能的话,应该始终存在“提前退出”,这可能导致整个方法中的多个“回报”。你喜欢哪个? :)

答案 1 :(得分:1)

我比第一种更经常地看到第二种风格......但无论如何它都无关紧要,行为完全相同。不,我不认为第二种方法有任何缺点。这只是个人偏好的问题,选择你认为最易读的。

答案 2 :(得分:0)

与Thomas Levesque相同。我在代码中使用了第二个,我经常看到它。两种方法都应该执行相同的操作。

答案 3 :(得分:0)

它减少了嵌套。

在你的例子中,它非常清晰,只是一个品味的问题,但是当连续使用时更清晰,正如你在这里看到的那样:

Invert "if" statement to reduce nesting

通常我不在乎我是否在价值相同的情况下得到一个事件,所以我把那部分留下来:

public string MyProperty
{
  get { return _correspondingField; }
  set { _correspondingField = value; OnPropertyChanged("MyProperty"); }
}