C#构造函数和常量之谜

时间:2012-03-19 19:09:41

标签: c# constructor class-constants

为什么静态构造函数在引用时抛出异常 另一个类中的const字符串。

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

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

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

抛出的异常是未将对象引用设置为对象的实例。堆栈跟踪指向尝试读取常量值的行。有什么想法吗?

3 个答案:

答案 0 :(得分:6)

思想:

  • HttpContext可能为null
  • HttpContext.Current可能为null
  • HttpContext.Current.Server可能为null

进一步的想法:

CurrentHttpContext类的静态属性,因此HttpContext不是对象引用,并且不能为null。如果您想简化调试,可以像这样更改代码(我假设ExamineLog应该被声明为void方法):

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

答案 1 :(得分:0)

我的第一个赌注是一个糟糕的字符串...

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

所以MapPath失败了。

答案 2 :(得分:0)

我的猜测是HttpContext.Current在静态构造函数的上下文中为null。自从我在ASP.NET中陷入困境已经有一段时间了,但是IIRC,HttpContext.Current将不会被设置,除非你处于页面的请求 - 响应生命周期中。我不知道什么时候静态构造函数必须在ASP.NET应用程序中执行(从技术上讲,应该是在第一次通过代码访问时),在您的情况下,它可以很容易地处于此页面生命周期之外的上下文中。

我怀疑null引用是来自你的const引用:const引用是在编译时作为文字值/字符串插入的,所以不应该抛出运行时空引用异常。