【问题标题】:C# constructor and constants mysteryC# 构造函数和常量之谜
【发布时间】:2012-04-04 07:16:18
【问题描述】:

为什么静态构造函数在引用时会抛出异常 另一个类中的 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# constructor class-constants


    【解决方案1】:

    想法:

    • 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);                 
    } 
    

    【讨论】:

    • 好吧,不要挑剔,但HttpContext是一个类,所以不能是null
    • @SuperOli 我刚刚编辑完答案以反映这一点。
    【解决方案2】:

    我的第一个赌注是一个错误的字符串...

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

    所以 MapPath 失败了。

    【讨论】:

    • 根据 MSDN MapPath 不能抛出这样的异常
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2015-07-24
      • 2015-08-27
      • 2023-03-20
      • 2021-12-25
      • 1970-01-01
      • 2016-01-02
      • 2013-05-02
      • 2016-01-08
      • 2011-07-20
      相关资源
      最近更新 更多