【问题标题】:C# check value in set accessorC# 检查 set 访问器中的值
【发布时间】:2016-06-25 09:58:15
【问题描述】:

如何更好地实现优化目标?

public SpeedGraphModel SpeedGraphModel
{
    get { return _speedGraphModel; }
    set { 
            if (_speedGraphModel == value)
                return;

            _speedGraphModel = value; 
        }
}

public SpeedGraphModel SpeedGraphModel
{
    get { return _speedGraphModel; }
    set { _speedGraphModel = value; }
}

我认为string 类型不检查会更好,但对于其他类型?

【问题讨论】:

  • 您真的认为这对性能有什么影响吗?
  • 你确定你不是premature optimization的受害者吗?
  • 你为什么想要这样的代码?这破坏了可读性。你可以做public SpeedGraphModel SpeedGraphModel { get; set; }。这不太可能对现代硬件的性能产生影响。
  • 除非你真的很了解底层的实现细节(我怀疑你不是),否则这是初学者会犯的错误。我去过那里,我从中吸取了教训,永远不要担心它。我不知道如何说服你,但你应该总是分配它(你的第二种方法)。一年后,当你看到这个问题时,你会觉得自己很愚蠢。
  • 如果SpeedGraphModel 是 500 字节的结构,那么可能是最罕见的情况,那么是的,复制会产生明显的惩罚,但是首先要做的就是大的结构是错误的,而且有条件的检查如此大的结构很可能会涉及耗时的相等操作,这无论如何都会否定不复制的优势。与往常一样,如果这一切都让您担心,请重新考虑设计,如果您认为您的设计是合理的,请自行测量。

标签: c# set accessor


【解决方案1】:

添加另一个条件检查而不是设置变量值,即使它相等也是多余的。

最佳情况如果它们相等,您将进行 1 次操作(条件)。
最坏情况您将进行 2 次操作(条件 + 赋值)。

而不是设置变量无论如何。 => 1 次操作。

【讨论】:

    【解决方案2】:

    这种检查通常在你对设置值调用一些逻辑时使用(不仅仅是设置它)。例如,在桌面 (WPF/WinForms) 或移动 (Xamarin) 中,您可以实现自己的属性,该属性的行为将类似于依赖属性,并在其中调用 OnPropertyChanged() 方法。它可用于在更新后刷新视图的项目等。这样,即使您为您的项目设置相同的值然后调用OnPropertyChanged(),它也会更新可能影响性能的部分视图,因此您想在这里做一个额外的检查。

    如果您只有一个常用属性,其唯一职责是在私有字段内设置值,而无需任何逻辑,您不需要额外的检查,因为它是多余的并且不会提高您的性能。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-07
      • 2022-09-24
      • 1970-01-01
      • 2012-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多