gpt4 book ai didi

c# - 甚至没有检查 setter 中的值评估

转载 作者:行者123 更新时间:2023-11-30 15:46:47 26 4
gpt4 key购买 nike

我在复合控件中有一个属性,它在实际设置相关私有(private)字段和执行其他一些操作之前检查值是否已更改。

但是,它似乎从未对声明进行评估。

这是属性的代码:

public T SearchCriteria
{
get
{
return mySearchCriteria;
}
set
{
if (value != mySearchCriteria)
{
mySearchCriteria = value;
EnsureChildControls();
SearchGridParser parser = SearchGridParserFactory.GetParser(this.Type);
parser.SetSearchPanelControls<T>(this.mySearchCriteria, ref mySearchParametersPanel);
GridView.PageIndex = 0;
}
}
}

我已逐步执行代码,每次到达“value != mySearchCriteria”时,它的计算结果为 false 并跳过 if 语句中的代码。事实上,即使我将它更改为“value == mySearchCriteria”,它也会这样做。无论它如何评估,它都会完全跳过它!

什么嘿?

我试过更改检查中参数的顺序,还尝试使用 object.Equals(),但这些更改都没有产生任何影响。

我已经覆盖了 Equals、!=、== 和 GetHashCode。

代码中的其他地方对这些对象类型使用“==”和“!=”没有问题,所以我知道我的重写工作正常。

问题是,这甚至从来没有触及覆盖的方法。我在“==”、“!=”、“Equals”和“GetHashCode”上设置了中断,但在评估“value != mySearchCriteria”语句时,它们都没有被调用。

就好像它完全跳过了对它的求值。

最佳答案

在泛型之间使用 == 几乎总是一个坏主意。运算符是重载而不是覆盖,因此即使您的实际类型上有 == 运算符,编译器也不会知道。 (这意味着你声称你已经“覆盖”了 ==!= 已经不正确 - 你已经重载了这些运算符。你应该确保你理解其中的区别,因为它非常重要。)

当你写的时候:

There are other places in the code where it uses the "==" and "!=" for these object types without a problem, so I know that my overriding is working correctly.

我怀疑这些区域不在通用代码中……它们是编译器知道正在比较哪些类型的地方,因此知道使用您的重载。这与您的一般情况非常不同,在这种情况下,编译器知道要为 == 使用什么,因此回退到引用标识。

我假设您有 where T : class 的通用约束或者你的代码根本不会编译 - 但它仍然只是执行引用比较,而不是使用 T 的实际类型提供的任何重载。 .

使用 EqualityComparer.Default<T>.Equals(value, mySearchCriteria)使用 Equals 的重写实现包括 IEquatable<T> .

关于c# - 甚至没有检查 setter 中的值评估,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4125199/

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