【问题标题】:Does it make sense checking for equality on XF BindablePropery?在 XF BindablePropery 上检查相等性是否有意义?
【发布时间】:2017-05-01 17:46:50
【问题描述】:

这有意义吗,或者相等性检查是多余的?

public int SelectedIndex
{
  get { return (int)GetValue(SelectedIndexProperty); }
  set
  {
    if (value != SelectedIndex)
      SetValue(SelectedIndexProperty, value);
  }
}

我对@9​​87654321@ 进行了一些研究,看起来该对象在进行实际的相等检查之前还有很长的路要走,即使这样我也没有深入挖掘以弄清楚它是否仍然可以on,而 GetValue 开销要简单得多,所以您认为这里的引用相等检查是推荐/冗余的吗?
我不会在所有属性中都这样做,但是有些重复的属性会产生很多开销。

【问题讨论】:

  • 您在SetValue 部分节省了一些跃点,但在GetValue 上也损失了一些,所以最后似乎没有太大区别。您可以尝试对这两种方法进行基准测试,以找出确切的性能差异。
  • 我不知道使用SetValue 是否保证在重新分配相等值之前进行检查。

标签: c# xamarin data-binding xamarin.forms


【解决方案1】:

检查BindableObject类的这一部分:https://github.com/xamarin/Xamarin.Forms/blob/master/Xamarin.Forms.Core/BindableObject.cs#L554

它在触发 OnPropertyChanging 事件之前(第 554 行)和设置上下文值之前(第 563 行)检查值是否相同:

if (!same || raiseOnEqual)
{
    context.Value = value;
}

根据性能,我刚刚用不断变化的属性值对其进行了基准测试。按照您的建议检查值时,平均花费大约 56 个滴答,而如果您不这样做,则平均花费大约 54 个滴答(基本基准,不是很科学)。

所以结论是,像这样在BindableProperties 中检查相等性并没有多大用处。

【讨论】:

  • 什么时候真正改变甚至相等?我的问题并不是关于性能,而是propertyChanged 委托参数(在BindableProperty.Create 中)是否会以其oldValuenewValue 相等的方式被调用。
  • 使用一种或另一种方法通常是性能的选择,这就是为什么我在答案中包含了性能部分。 propertyChanged 委托仅在属性实际不同时才会被调用(参见引用类的第 595 行)。 PS:raiseOnEqual 标志是一个内部标志。
猜你喜欢
  • 2010-11-12
  • 2021-07-16
  • 2022-11-01
  • 2018-04-05
  • 2010-12-02
  • 2017-12-26
  • 1970-01-01
  • 2011-01-19
  • 2010-11-16
相关资源
最近更新 更多