DependencyObject无法很好地处理对象属性上的相等性

时间:2018-10-29 13:25:33

标签: c# dependencyobject

我遇到了StackOverflowException,这使我发现DependencyObject无法正确处理平等性!!

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

如果您看一下

  

DependencyObject.Equals(DependencyProperty dp,对象value1,对象   value2)

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;

那么,这是所需的行为还是错误?

1 个答案:

答案 0 :(得分:0)

我不认为这是一个错误。这只是dotnet处理对象的方式。如果在没有DependencyProperties上下文的情况下进行尝试,则是相同的:

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

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

我在控制台中读到“不同”。因此,通常,如果对对象进行相等性评估,则始终使用ReferenceEquals(即使它们是装箱的值类型)。