2012-03-19 4 views
2

почему статический конструктор генерирует исключение, когда ссылается на строку const в другом классе.C# конструктор и константы mystery

class MyClass 
{ 
     static MyClass() 
     { 
      ExamineLog(); 
     } 

     static ExamineLog() 
     { 
      FilePath = HttpContext.Current.Server.MapPath(Helper.LogConfiguration);     
     } 
} 

class Helper 
{ 
     public const string LogConfiguration= "\rootpath\counters.txt"; 
} 

Исключенное исключение - ссылка на объект не установлена ​​в экземпляр объекта. Трассировка стека указывает на линию, где делается попытка прочитать постоянное значение. Есть предположения?

+1

Aaargh! Форматирование. Почини это. –

+1

'static ExamineLog()'? – BoltClock

ответ

6

Мысли:

  • HttpContext может быть нулевым
  • HttpContext.Current может быть пустым
  • HttpContext.Current.Server может быть пустым

Дальнейшие мысли:

Current является статическим свойством HttpContext, поэтому HttpContext не является ссылкой на объект, и он не может быть нулевым. Если вы хотите, чтобы упростить отладку, вы можете изменить код, как это (я предполагаю, что ExamineLog должен был быть объявлен как метод ничтожной):

static void ExamineLog() 
{ 
    var context = HttpContext.Current; 
    var server = context.Server; 
    FilePath = server.MapPath(Helper.LogConfiguration);     
} 
+0

Ну, не быть придирчивым, но «HttpContext» - это класс, поэтому он не может быть «null». – SuperOli

+1

@SuperOli Я только что закончил редактирование ответа, чтобы отразить это. – phoog

0

моя первая ставка плохая строка ...

"\rootpath\counters.txt" // => "\r" is carriage return 

Так что MapPath терпит неудачу.

+0

Это не приводит к NRE. –

+0

Согласно MSDN MapPath не может выбрасывать такое исключение – sll

0

Я предполагаю, что HttpContext.Current является нулевым в контексте статического конструктора. Прошло некоторое время с тех пор, как я был на колене в ASP.NET, но IIRC, HttpContext.Current не будет настроен, если вы не находитесь в жизненном цикле запроса-ответа на странице. Я не знаю, когда статические конструкторы обязательно выполняются в приложении ASP.NET (технически, должно быть, когда первый доступ к коду), и в вашем случае это может быть легко в контексте вне жизненного цикла этой страницы.

Я сомневаюсь, что нулевая ссылка исходит из ссылки на const: ссылка const вставляется как буквальное значение/строка во время компиляции, поэтому не должно быть исключений исключения нулевой ссылки во время выполнения.