代码之家  ›  专栏  ›  技术社区  ›  Dabblernl

为什么此代码会引发ArgumentNullException?

  •  3
  • Dabblernl  · 技术社区  · 15 年前

    我在所有地方都使用这个代码模式,只有在这个特定属性中,当尝试为它赋值(即调用setter)时才会抛出ArgumentNullException。为null的对象是isLoggedInLock,因此在调用setter之前似乎还没有实例化它。怎么了??

    EDIT2:我在非静态构造函数中实例化了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");
                }
            }
        }
    
    5 回复  |  直到 15 年前
        1
  •  4
  •   to StackOverflow    15 年前

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

    看来还没有 在创建setter之前实例化 打电话

    如果从异常中查看堆栈跟踪,应该可以很容易地找出发生了什么。

        2
  •  3
  •   Rob Levine    15 年前

    从10秒钟的代码来看,最可能的原因是OnPropertyChanged。

    [编辑-抱歉没看到你说isLoggedInLock是凶手]

    你确定是吗 isLoggedInLock

    这是受影响代码的准确表示吗?绝对不是这样的情况,财产是静态的,或一些这样的区别?

        3
  •  2
  •   James Curran    15 年前

        4
  •  2
  •   Dabblernl    15 年前

    信息技术 类的字段可能为null,即使在构造函数中初始化也是如此:当类通过反序列化进入生命时,构造函数是空的 打电话。。。。

        5
  •  0
  •   TcKs    15 年前

    是可能的,反射被设置为“isLoggedInLock”为空?使用FieldInfo.SetValue()可以更改只读字段的值。