C # конструктор и загадка констант - PullRequest
2 голосов
/ 19 марта 2012

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

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

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

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

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

Ответы [ 3 ]

6 голосов
/ 19 марта 2012

Мысли:

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

Дальнейшие размышления:

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

static void ExamineLog()   
{
    var context = HttpContext.Current;
    var server = context.Server;
    FilePath = server.MapPath(Helper.LogConfiguration);                 
} 
0 голосов
/ 19 марта 2012

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

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

0 голосов
/ 19 марта 2012

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

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

Итак, MapPath не работает.

...