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";
}
引发的异常是未设置为对象实例的对象引用。堆栈跟踪指向试图读取常数值的行。有什么想法吗?
思想:
HttpContext
可能为空HttpContext.Current
可能为空HttpContext.Current.Server
可能为空
进一步思考:
Current
是HttpContext
类的静态属性,因此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引用异常。