gpt4 book ai didi

c# - DependencyObject 不能很好地处理对象属性的相等性

转载 作者:太空宇宙 更新时间:2023-11-03 14:48:25 25 4
gpt4 key购买 nike

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

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

如果你看一下

DependencyObject.Equals(DependencyProperty dp, object value1, object 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;

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

最佳答案

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

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

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

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

关于c# - DependencyObject 不能很好地处理对象属性的相等性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53046480/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com