使用CodeMaid清理代码后出现了一个奇怪的问题。现在,包含所有全局变量和函数的类正在抛出异常,我无法弄清楚原因。
在GlobalClass.GetID()中抛出外部异常:TypeInitializationException。
内部异常是:对象引用未设置为对象的实例
以下是导致此问题的一些代码示例。
namespace ErrorCode //Library
{
public static class GlobalClass
{
private static int _globalid = 0; //Never reached
public static int GlobalID
{
get
{
return _globalid;
}
} //Read-Only
public static int GetID()
{
retun _globalid++; //Crashes here with TypeInitialzationException
}
}
public class Entity
{
private int _id;
public int ID
{
get
{
return _id;
}
}
public Entity()
{
_id = GlobalClass.GetID(); //Crashes here with object reference not set to an instance of an object?
}
}
}
using ErrorCode;
namespace MainProgram //The program that will run
{
public class Program
{
public Entity e = new Entity(); //Triggers GlobalClass.GetID()
}
}
有什么想法吗?
答案 0 :(得分:1)
尝试使用静态构造函数:
public static class GlobalClass
{
static GlobalClass()
{
GlobalClass._globalid = 0;
}
private static int _globalid;
public static int GlobalID
{
get
{
return _globalid;
}
}
//...
}
答案 1 :(得分:1)
您过多地编辑了代码并删除了异常的真正原因。具有字段初始值设定项的类,如下所示:
public static class Globals {
private static int _globalid = 0;
}
CLR不直接支持。编译器重写此代码,它为类创建一个静态构造函数(或修改现有的构造函数)并将其写为:
public static class Globals {
private static int _globalid;
static Globals() {
_globalid = 0;
}
}
它使用初始化程序为所有静态字段执行此操作。其中一个是在您的情况下抛出异常,我们无法在您的代码段中看到它。追逐它的一种方法是强制调试器停止异常,Debug + Exceptions,勾选CLR异常的Thrown复选框。
答案 2 :(得分:0)
我怀疑,正如Anthony Pegram暗示的那样,你有一个静态构造函数或另一个静态字段初始值设定项,你没有包含在你的示例代码中。此构造函数或初始值设定项抛出空引用异常。