提问人:MBNLINK 提问时间:8/2/2022 最后编辑:MBNLINK 更新时间:8/2/2022 访问量:88
为什么当每个 Individual 属性返回 true 时,整个模型的比较返回 false
Why does comparison of entire model return false when each Individual properties return true
问:
我想做什么:
我希望用户在组合框中选择配色方案,然后我稍后在执行时将其用于一些 UI 内容(这工作正常),但我想保存该配色方案并通过 MVVM 和绑定使该项目在下次用户打开窗口时在组合框中被选中,但它不起作用。
我做了一个模型来容纳我的配色方案:
[SettingsSerializeAs(SettingsSerializeAs.Xml)]
public class ColorScheme
{
public int Id { get; set; }
public SolidColorBrush ColorOne { get; set; }
public SolidColorBrush ColorTwo { get; set; }
public SolidColorBrush ColorThree { get; set; }
public SolidColorBrush ColorFour { get; set; }
public SolidColorBrush ColorFive { get; set; }
public SolidColorBrush ColorSix { get; set; }
public SolidColorBrush ColorSeven { get; set; }
public SolidColorBrush ColorEight { get; set; }
public SolidColorBrush ColorNine { get; set; }
public SolidColorBrush ColorTen { get; set; }
}
然后,我将配色方案存储在用户的settings.settings文件中,但是当我重新打开窗口时,组合框是空的,即使配色方案包含颜色的确切十六进制值。
当我测试配色方案列表和我存储的配色方案之间的比较时,它返回 false,但有趣的是,如果我将其划分为单独的属性比较,它会在所有属性比较上返回 true:
foreach (var colorScheme in AllColorSchemes)
{
if (SelectProjectColorScheme != null)
{
if (colorScheme.Id == SelectProjectColorScheme.Id
|| colorScheme.ColorOne == SelectProjectColorScheme.ColorOne
|| colorScheme.ColorTwo == SelectProjectColorScheme.ColorTwo
|| colorScheme.ColorThree == SelectProjectColorScheme.ColorThree
|| colorScheme.ColorFour == SelectProjectColorScheme.ColorFour
|| colorScheme.ColorFive == SelectProjectColorScheme.ColorFive
|| colorScheme.ColorSix == SelectProjectColorScheme.ColorSix
|| colorScheme.ColorSeven == SelectProjectColorScheme.ColorSeven
|| colorScheme.ColorEight == SelectProjectColorScheme.ColorEight
|| colorScheme.ColorNine == SelectProjectColorScheme.ColorNine
|| colorScheme.ColorTen == SelectProjectColorScheme.ColorTen)
{
var test = "yes";
}
if (colorScheme == SelectProjectColorScheme)
{
var test = "yes";
}
}
}
在上面的代码中,第一个 if 语句在所有参数上都返回 true,但底部返回 false。我尝试在 SolidColorBrushes、Brushes 之间切换,将 HEX 值转换为画笔并使用预定义的画笔。它对我不起作用。
我对可能导致这种情况的原因感到茫然,我希望有解决方法或更好的方法来做到这一点。这应该是一个相当简单的任务,我花了 3 天多的时间试图修复它。
答:
你的模型是一个引用类型,所以当你调用 == 时,它实际上是在检查引用相等性(即检查它们是否只是同一对象的两个不同名称,而不是检查它们是否是两个具有相同值的对象,这才是你真正想要的)。可以重写 == 方法来检查值,但阅读本指南时,他们建议不要对可变类型这样做。我不完全确定为什么会这样(很可能是一些深刻的编程哲学),但他们的建议是改写 Equals() 作为适当的值检查并调用它。请注意,如果你走这条路,你还应该覆盖 GetHashCode() (也许只是 ^ 所有值的哈希码一起或其他东西)。
另一方面,如果您默认将模型更改为结构体,则 Equals() 将进行值比较,但 == 将无法按照您想要的方式工作,除非您手动覆盖它。
如果您使用的是 C#9 或更高版本,则可以考虑记录类型,如果调用 ==,它将进行值比较。 这里有几个更有用的链接,祝你好运。
https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/operators/equality-operators
评论