Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 属性初始化和比较计时_C#_Wpf_Mvvm_Viewmodel - Fatal编程技术网

C# 属性初始化和比较计时

C# 属性初始化和比较计时,c#,wpf,mvvm,viewmodel,C#,Wpf,Mvvm,Viewmodel,上下文:C#,WPF,MVVM 在我的viewmodels中,我对我的一些属性使用了初始化逻辑,这基本上是检查支持属性是否为null,如果是,则初始化它。最后,返回backing属性。下面是一个列表示例,允许用户选择要筛选的项目: List<CBPicklistString> _clientClassificationFilterList; public List<CBPicklistString> ClientClassificationFilterList { g

上下文:C#,WPF,MVVM

在我的viewmodels中,我对我的一些属性使用了初始化逻辑,这基本上是检查支持属性是否为null,如果是,则初始化它。最后,返回backing属性。下面是一个列表示例,允许用户选择要筛选的项目:

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)