【问题标题】:Null readonly lock object空只读锁定对象
【发布时间】:2014-11-27 00:09:08
【问题描述】:

静态只读对象如何变为空? (我已将 _lock 对象设置为静态而非静态,但始终为只读。)

validate 方法可以正常工作几次,然后在调用 2-3 次后 _lock 对象为空。这是否表明锁由另一个线程拥有?

【问题讨论】:

  • 好吧,如果你滥用反射,就会发生这种情况。您确信您的代码中没有任何内容可以想象吗? (typeof(YourClass).GetField("_lock", BindingFlags.NonPublic | BindingFlags.Static).SetValue(null, null) 会将字段设置为空)
  • @Community:这是一个有效的问题,请不要将其关闭为“离题”,因为它显然不是
  • 你能试着把你的代码减少到minimal, complete and verifiable example吗?删除代码,直到 a) 它是最小的,你可以在这里发布,或者 b) 问题消失,你自己找到答案。
  • Visual Studio 对_lock 的定义有什么看法,并在名称下划线?
  • 你需要发布一个好的代码示例。调试器中几行代码的屏幕截图并没有为任何人提供足够的上下文来告诉您发生了什么。见stackoverflow.com/help/mcve

标签: c#


【解决方案1】:

除了反射之外,this(更具体地说,通过初始化程序分配的静态变量上的空引用异常)可能发生的另一种方式是,如果您在类的其他地方定义了一个静态构造函数由于某种原因将值设置为null,例如:

class Program
{
    class A
    {
        private static readonly object _lock = new object();

        public void Validate()
        {
            lock (_lock) // NullReferenceException here...
            {
                Console.WriteLine("Not going to make it here...");
            }
        }

        static A()
        {
            Console.WriteLine(_lock.ToString());
            Console.WriteLine("Now you can see that _lock is set...");
            _lock = null;
        }
    }

    static void Main(string[] args)
    {
        var a = new A();
        a.Validate();
    }
}

【讨论】:

  • 好吧,他这么说,然后列出另一种可能发生的方式是错误的吗?
  • “它可能发生的方式”---另一种方式是什么“它”?故意破坏代码的另一种方法?您的回答没有以任何方式解决问题,抱歉。
  • 它有效,但根据屏幕截图,显然无效 - 所以问题是为什么。我提供的这些原因之一可能就是原因。
  • @F.Buster,但您的原因不可能是对 OP 问题的解释。因为如果它曾经工作过,将字段设置为 null 的静态初始化程序将无法负责。
  • @KirkWoll 公平地说,由于问题缺少细节,而且这似乎是一种极端情况,因此假设 什么都没有 是公平的。这也包括质疑 OP 的假设,例如“验证方法可以正常工作几次”。
猜你喜欢
  • 2012-02-21
  • 1970-01-01
  • 2021-07-04
  • 1970-01-01
  • 2021-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多