2014-11-27 3 views
4

Как может статический объект readonly стать нулевым? (Я установил объект _lock как статический, а не статический, но всегда только для чтения.)Null объект блокировки только для чтения

Метод проверки корректно работает несколько раз, затем после его вызова в 2-3 раза объект _lock имеет значение null. Является ли это индикатором того, что замок принадлежит другому потоку?

enter image description here

+2

Хорошо, это может произойти, если вы будете злоупотреблять отражением. Вы уверены, что в вашем коде ничего не может быть? ('typeof (YourClass) .GetField (" _ lock ", BindingFlags.NonPublic | BindingFlags.Static) .SetValue (null, null)' установит поле в null) –

+2

@Community: это правильный вопрос, пожалуйста, не закрывайте это как «offtopic», так как это явно не – zerkms

+3

Можете ли вы попробовать и уменьшить свой код до [минимального, полного и проверяемого примера] (http://stackoverflow.com/help/mcve)? Удалите код, пока a) он не будет минимальным, и вы можете разместить его здесь, или b) проблема исчезнет, ​​и вы сами узнаете ответ. – dcastro

ответ

-4

Кроме отражения, еще один из способов, которыми этот (точнее, нулевая ссылка исключение на статической переменной назначенной через инициализаторе) может произойти, если у вас есть статический конструктор, определенный в другом месте в своем классе что по какой-то причине устанавливает значение в значение 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(); 
    } 
} 
+3

«Метод проверки достоверно работает в течение нескольких раз» – zerkms

+0

Итак, он сказал, что неправильно ли перечислить другие способы, которыми это может случиться? –

+1

«способов, которыми это может случиться тогда» --- другие способы чего «это»? Еще один способ разбить код намеренно? Ваш ответ никоим образом не затрагивает вопрос, извините. – zerkms

Смежные вопросы