C# 属性初始化和比较计时
上下文:C#,WPF,MVVM 在我的viewmodels中,我对我的一些属性使用了初始化逻辑,这基本上是检查支持属性是否为null,如果是,则初始化它。最后,返回backing属性。下面是一个列表示例,允许用户选择要筛选的项目:C# 属性初始化和比较计时,c#,wpf,mvvm,viewmodel,C#,Wpf,Mvvm,Viewmodel,上下文:C#,WPF,MVVM 在我的viewmodels中,我对我的一些属性使用了初始化逻辑,这基本上是检查支持属性是否为null,如果是,则初始化它。最后,返回backing属性。下面是一个列表示例,允许用户选择要筛选的项目: List<CBPicklistString> _clientClassificationFilterList; public List<CBPicklistString> ClientClassificationFilterList { g
List<CBPicklistString> _clientClassificationFilterList;
public List<CBPicklistString> ClientClassificationFilterList
{
get
{
Debug.WriteLine("ClientClassificationFilterList - Get: " + _clientClassificationFilterList?.Count ?? "Null");
if (_clientClassificationFilterList == null)
{
_clientClassificationFilterList = CBPicklists.PicklistStrings(CBPicklists.CLIENT_CLASSIFICATIONS).ToList();
_clientClassificationFilterList.Insert(0, new CBPicklistString() { PicklistStringId = 0, PicklistStringValue = "(All Client Classes)" });
SelectedClientClassificationFilter = _effectiveClientClassificationFilter = _clientClassificationFilterList[0];
OnPropertyChanged("SelectedClientClassificationFilter");
}
return _clientClassificationFilterList;
}
}
在初始运行时,getter应该初始化列表和\u effectiveClientClassificationFilter
,if语句应该将比较视为false(对象相等),这意味着没有要设置的活动筛选器。但我看到的是if语句的行为就像它看到了一个true(对象不相等)。当我在调试器中检查这些值时,它们实际上是相等的。这就好像存在一个并发性问题,其中初始化没有在比较之前完成。但这不是一段多线程代码。在这里,.Net(或WPF)正在做自己的事情吗?这不是进行列表初始化的有效方法吗?我到处都在使用这种逻辑范式(多年来一直如此),但这是我第一次,也是唯一一个看到这种古怪行为的地方。没有太多其他相关的代码
我遗漏了什么?我不确定,但我认为比较中首先使用的是_effectiveClientClassificationFilter的初始值,然后计算ClientClassificationFilter列表,更改_effectiveClientClassificationFilter的值,我想它不知道。因此,如果你颠倒条件的顺序,它将正常工作 而不是
if (_effectiveClientClassificationFilter != ClientClassificationFilterList[0])
使用
\u effectiveClientClassificationFilter
的数据类型是什么?CBPicklistString
是一个类或结构,并且该类型覆盖Equals()
或=代码>运算符?在SelectedClientClassificationFilter
getter中是否还有任何逻辑?是否\u有效的ClientClassificationFilter
和ClientClassificationFilterList[0]
的第一个元素是不同的实例?如果是这样,它们将通过引用进行比较,并且永远不会相等。也许实现一个用于比较的IEquatable(T)
可以解决您的问题(详细信息请参见)。@LittleBit,它们是相同的实例。它们在调试器中读取为同一实例,即使比较结果显示为不相等。@FrankM,数据类型一致。没有覆盖。只是检查以确保实例是相同的。
if (_effectiveClientClassificationFilter != ClientClassificationFilterList[0])
if (ClientClassificationFilterList[0] != _effectiveClientClassificationFilter)