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

标签 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()
    }
}

有什么想法吗?

最佳答案

您对代码进行了过多的编辑并删除了异常的真正原因。具有如下字段初始值设定项的类:

public static class Globals {
    private static int _globalid = 0;
}

不受 CLR 直接支持。编译器重写此代码,它为该类创建一个静态构造函数(或修改现有的构造函数)并按如下方式编写:

public static class Globals {
    private static int _globalid;
    static Globals() {
        _globalid = 0;
    }
}

它使用初始化器对所有静态字段执行此操作。其中之一是在您的情况下抛出异常,我们在您的代码片段中看不到它。追踪它的一种方法是强制调试器在异常发生时停止,“调试 + 异常”,勾选“CLR 异常的抛出”复选框。

关于C# .net 对象引用未设置为静态类上的对象实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11321959/

相关文章:

具有其他类数据类型的 C++ 构造函数

c# - 需要一种方法来区分 ShDocVw.InternetExplorer 选项卡对象

c# - 结构的构造函数有问题(编译器大喊我没有完全初始化结构的所有自动属性)

c++ - 在头文件中引用 ADT

c# - 将 Windsor CaSTLe IoC 用于 Windows 服务

.net - 通过ICalUid获得交流约会?

c++ - 类函数与非类函数的名称冲突

c# - 在每个大小为 150 MB 的多个文本文件中搜索字符串 C#

c# - 如果字符串包含特定字符则数据触发

c# - 为什么 List.Sort() 是实例方法而 Array.Sort() 是静态的?