2

我有一个非常奇怪的问题,看起来像是某种编译器错误,但我也觉得这不太可能。

我有两个嵌套类,它们都有类变量。其中之一 ( SpriteList) 工作得非常好,并完美地初始化了所有变量。当我断点它时,程序在初始化该类时确实会中断。

另一个嵌套类 ( ItemList) 的行为有点奇怪。其中的类变量没有初始化,当我断点代码时,程序永远不会中断。

这是我的代码:

class Registry
{
    public static Dictionary<string, StaticSprite> spriteRegistry = new Dictionary<string, StaticSprite>();
    public static Dictionary<string, Item> itemRegistry = new Dictionary<string, Item>();

    public static void registerSprite(string name, StaticSprite sprite)
    {
        spriteRegistry.Add(name, sprite);
        Console.WriteLine("Registered Sprite: " + name + "!");
    }

    public static void registerItem(string name, Item item)
    {
        itemRegistry.Add(name, item);
        Console.WriteLine("Registered Item: " + name + "!");
    }

    public class ItemList
    {
        public static Item test = new ItemTest();
    }

    public class SpriteList
    {
        public static StaticSprite rock = new SpriteRock();
        public static StaticSprite pedestal = new SpritePedestal();
        public static StaticSprite item = new SpriteItem();
    }
}

我真的不知道这里有什么问题。这两个类都不是在任何地方构建的,这并不重要。当我将 ItemList 中的变量移动到 SpriteList 中时,它运行良好。

我真的不知道这里出了什么问题。

4

1 回答 1

1

如果没有一个好的、最小的完整的代码示例来可靠地重现问题,就不可能确定问题是什么。

但请注意,在运行时实际使用该类之前,不需要运行时初始化类。也就是说,在某些实际需要该类的代码执行时。

如果调用代码的类本身从未在程序中实际使用过,则静态初始化中的断点(例如,静态构造函数、由静态初始化程序调用的方法等)可能永远不会被命中,并且代码永远不会执行。

在我看来,这可能就是问题所在。如果没有代码实际使用过ItemList该类,那么就不需要static初始化类中的字段,因此……它永远不会被初始化。

于 2015-07-14T04:34:58.007 回答