2

ある種のコンパイラ エラーのように見える非常に奇妙な問題がありますが、それは非常にありそうもないことでもあります。

クラス変数を持つ 2 つの入れ子になったクラスがあります。それらの 1 つ ( SpriteList) は完全に正常に動作し、すべての変数を完全に初期化します。ブレークポイントを設定すると、そのクラスを初期化するときにプログラムが中断します。

もう 1 つのネストされたクラス ( 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 に答える