【问题标题】:DependencyObject does not handle equality on object properties wellDependencyObject 不能很好地处理对象属性的相等性
【发布时间】:2019-04-02 10:37:36
【问题描述】:

我遇到了 StackOverflowException,它让我发现 DependencyObject 没有正确处理相等性?!

当 DependencyProperty 的类型为 Object 时,它将始终使用 Reference.Equals。当应用相同的值时,这会导致每次为字符串和值类型触发 PropertyChanged。

如果你看看

DependencyObject.Equals(DependencyProperty dp, object value1, object 价值2)

https://referencesource.microsoft.com/#WindowsBase/Base/System/Windows/DependencyObject.cs,3453

/// <summary>
///     Helper method to compare two DP values
/// </summary>
private bool Equals(DependencyProperty dp, object value1, object value2)
{
    if (dp.IsValueType || dp.IsStringType)
    {
        // Use Object.Equals for Strings and ValueTypes
        return Object.Equals(value1, value2);
    }
    else
    {
        // Use Object.ReferenceEquals for all other ReferenceTypes
        return Object.ReferenceEquals(value1, value2);
    }
}

一种简单的重现方式:

public static readonly DependencyProperty ObjValueProperty = DependencyProperty.Register(nameof(ObjValue), typeof(object), typeof(MainWindow), new PropertyMetadata(default(object)));

public object ObjValue
{
    get
    {
        return GetValue(ObjValueProperty);
    }
    set
    {
         SetValue(ObjValueProperty, value);
    }
}

protected override void OnPropertyChanged(DependencyPropertyChangedEventArgs e)
{
    if(e.Property == ObjValueProperty) { /*Breakpoint here*/ }
}

...
ObjValue = 7;
ObjValue = 7;

那么,这是期望的行为还是错误?

【问题讨论】:

    标签: c# dependencyobject


    【解决方案1】:

    我不认为这是一个错误。它只是 dotnet 处理对象的方式。如果您在没有 DependencyProperties 的上下文的情况下尝试它也是一样的:

    我创建了一个小型控制台应用程序:

    object v1 = 7;
    object v2 = 7;
    if (v1 == v2) Console.Write("are the same"); else Console.Write("are different");
    

    我在控制台中读到“不同”。所以一般来说,如果对象被评估是否相等,那么总是由 ReferenceEquals(即使它们是装箱的值类型)。

    【讨论】:

      猜你喜欢
      • 2011-12-24
      • 1970-01-01
      • 2022-12-02
      • 1970-01-01
      • 1970-01-01
      • 2019-06-26
      • 2012-06-01
      • 1970-01-01
      • 2017-03-29
      相关资源
      最近更新 更多