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;
    }
}

これは、初期化子を使用してすべての静的フィールドに対して実行されます。そのうちの1つは、あなたのケースで例外をスローしていますが、スニペットには表示されません。それを追跡する1つの方法は、デバッガーが例外で停止するように強制することです。デバッグ+例外、CLR例外の[スロー]チェックボックスをオンにします。

于 2012-07-04T03:25:01.820 に答える
0

Anthony Pegram が暗示しているように、サンプル コードに含まれていない静的コンストラクターまたは別の静的フィールド初期化子があるのではないかと思います。このコンストラクターまたは初期化子は、null 参照例外をスローしています。

于 2012-07-04T03:27:43.217 に答える