C#构造函数和常量之谜

本文关键字:常量 构造函数 | 更新日期: 2023-09-27 18:28:21

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

 class MyClass
 {  
      static MyClass() 
      { 
           ExamineLog();   
      }
      static ExamineLog()  
      {
          FilePath = HttpContext.Current.Server.MapPath(Helper.LogConfiguration);                
      }
}
class Helper
{  
      public const string LogConfiguration= "'rootpath'counters.txt";
}

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

C#构造函数和常量之谜

思想:

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

进一步思考:

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

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

我的第一个赌注是一个坏字符串。。。

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

所以MapPath失败了。

我的猜测是HttpContext.Current在静态构造函数的上下文中为null。我已经有一段时间没有深入ASP.NET了,但除非你处于页面的请求-响应生命周期中,否则不会设置IIRC,即HttpContext.Current。我不知道静态构造函数何时必须在ASP.NET应用程序中执行(从技术上讲,应该是在代码首次访问时执行),在您的情况下,它很容易在页面生命周期之外的上下文中执行。

我怀疑null引用是否来自您的const引用:const引用在编译时作为文字值/字符串插入,因此不应该引发运行时null引用异常。