【发布时间】:2010-02-14 13:51:08
【问题描述】:
我在整个过程中都使用此代码模式,并且仅在此特定属性中,在尝试为其分配值时(即调用 setter)会引发 ArgumentNullException。为null的对象是isLoggedInLock,所以在调用setter之前它似乎没有被实例化。瓦特错了??
编辑:我注释掉了 OnPropertyChanged 方法以避免混淆。仍然抛出异常。我能想到的另一件事是更新是在 UI 线程之外的另一个线程中完成的。
EDIT2:我在非静态构造函数中实例化了 isLoggedInLock ,但仍然抛出异常。一些非常奇怪的事情正在发生。我会进一步调查。
最后编辑:我的道歉:我遗漏了解决方案的关键:[DataMember] 属性。该对象通过反序列化来实现。这将跳过默认构造函数和 isLoggedInLock 的静态初始化。通过使用 [DataMember] 属性装饰 isLoggedInLock 或在使用 [OnDeserialzed] 属性装饰的方法中实例化它,问题就消失了!
非常感谢,第一个更新他的答案的人将获得积分! ;-)
[DataMember]
private bool isLoggedIn;
private readonly object isLoggedInLock=new object();
public bool IsLoggedIn
{
get
{
lock (isLoggedInLock)
{
return isLoggedIn;
}
}
set
{
lock (isLoggedInLock)
{
isLoggedIn = value;
//OnPropertyChanged("IsLoggedIn");
}
}
}
【问题讨论】:
-
OnPropertyChanged方法中有代码吗?
-
请捕获异常并发布 ex.ToString() 的结果
-
这是
ArgumentNullException还是NullReferenceException,就像您标记的那样? -
ArgumentNullException,标签不准确