gpt4 book ai didi

c# - 为什么此代码会抛出 ArgumentNullException?

转载 作者:行者123 更新时间:2023-11-30 13:34:45 25 4
gpt4 key购买 nike

我在整个过程中都使用了这个代码模式,并且只在这个特定的属性中尝试为其赋值(即调用 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");
}
}
}

最佳答案

可以在您发布的代码中抛出 ArgumentNullException 的唯一原因是当您执行锁定语句时 isLoggedInLock 是否为 null。因此,除非您在其他地方明确地将 isLoggedInLock 设置为 null(并且这只能在构造函数中,因为该字段是只读的),您的假设是正确的:

it seems that it has not been instantiated before the setter is called

字段将按照它们声明的顺序进行初始化,因此如果您有一个更高层的字段初始化调用访问 IsLoggedIn 属性的成员,这将在 isLoggedInLock 初始化之前发生。

如果您查看异常的堆栈跟踪,应该很容易弄清楚发生了什么。

关于c# - 为什么此代码会抛出 ArgumentNullException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2261257/

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