C#.net对象引用未设置为静态类上的对象实例

时间:2012-07-04 03:09:52

标签: c# .net class exception

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

有什么想法吗?

3 个答案:

答案 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暗示的那样,你有一个静态构造函数或另一个静态字段初始值设定项,你没有包含在你的示例代码中。此构造函数或初始值设定项抛出空引用异常。