我在多线程环境中得到了来自此代码的空引用异常:
public static void GetLogger(string loggerName) {
Logger logger = ListOfLoggers.Find(delegate(Logger newLogger)
{
return newLogger.Name.Contains(loggerName);
});
if (logger == null) {
ListOfLoggers.Add(new Logger(loggerName));
}
}
在上面的代码中:
ListOfLoggers
可以为空,但永远不会为null,因为它被初始化为静态只读变量。
无法创建null Logger对象(将导致TypeInitializationException),因此ListOfLoggers
永远不会包含null Logger对象。
实例化Logger对象的唯一方法是提供一个设置为Logger对象的Name属性的参数,因此我也看不到newLogger.Name
如何为null。 / p>
堆栈跟踪的断层线是:
LogManager.<>c__DisplayClass1.<GetLogger>b__0(Logger newLogger)
并且似乎建议编译器生成的用于在委托闭包中保存newLogger
局部变量的类是抛出空引用异常的类。
这似乎只发生在多线程环境中,并且在使用单个线程调用上面的代码时我从未看到空引用。这怎么可能?