2

使用 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()
    }
}

有任何想法吗?

4

3 回答 3

1

尝试使用静态构造函数:

public static class GlobalClass
{
    static GlobalClass()
    {
        GlobalClass._globalid = 0;
    }

    private static int _globalid;
    public static int GlobalID
    {
        get
        {
            return _globalid;
        }
    }

    //...
}
于 2012-07-04T03:22:44.863 回答
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 异常的 Throw 复选框。

于 2012-07-04T03:25:01.820 回答
0

正如 Anthony Pegram 暗示的那样,我怀疑您有一个静态构造函数或另一个未包含在示例代码中的静态字段初始值设定项。此构造函数或初始化程序抛出空引用异常。

于 2012-07-04T03:27:43.217 回答