0

従来のシングルトンでは、次のようにインスタンスを初期化できます。

private static readonly Messages _instance = new Messages();

次に、次のようにゲッターを介してアクセスします。

    public static Messages Instance {
        get {
            return _instance;
        }
    }

この場合、親と複数の子孫があります。

私たちが持っている親では

    protected static Base _instance;
    public static Base Instance {
        get {
            return _instance;
        }
    }

子孫では、クラス コンストラクターを使用して静的変数を設定します。

    static Derived() {
        _instance = new Derived();
    }

クラスコンストラクターは、クラスが使用される前に最初に参照されたときに呼び出されるため、これは機能するはずです。何らかの理由で、これは機能していません。

   Derived.Instance.Initialize();

Instance が null であり、コンストラクターのブレークポイントがヒットしないため、失敗します。

更新: Base コンストラクターは呼び出されますが、Derived コンストラクターは呼び出されません。これは、クラスで静的メソッドが呼び出されたときに静的コンストラクターがトリガーされることが原因である可能性があります。私が呼び出している静的メソッドは、子孫ではなく親にあります。

4

2 に答える 2

1

Derivedあなたが書いたとしてもDerived.Instance、C#は巧妙であり、それが実際に定義されていることを認識しているためInstance、コンストラクターを実行していません。BaseBase.Instance.Initialize()Derived

とにかく、これは非常に悪い考えのようです。Derived2インスタンスも設定する作成および参照するとどうなりますか? 今、あなたは行って壊しましたDerived.Instance

なぜこれを行っているのかわからない場合、回避策は Derived で外部から参照される静的メンバーを定義するか、 on をDerived.Instance作成することです。new static Derived InstanceDerived

インスタンスを上書きする例を次に示しDervied2ます。

void Main()
{
    //Prints null
    Console.WriteLine(Derived.Instance?.Name);

    //Prints Derived
    var a = Derived.InitDerived;
    Console.WriteLine(Derived.Instance?.Name);

    //Prints Derived2
    var b = Derived2.InitDerived;
    Console.WriteLine(Derived.Instance?.Name);
}

public class Base
{
    public string Name { get; set; }
    protected static Base _instance;
    public static Base Instance
    {
        get
        {
            return _instance;
        }
    }
}
public class Derived : Base
{
    public static int InitDerived = 1;
    static Derived()
    {
        _instance = new Derived() { Name = "Derived" };
    }
}

public class Derived2 : Base
{
    public static int InitDerived = 2;
    static Derived2()
    {
        _instance = new Derived()  { Name = "Derived2" };
    }
}
于 2016-11-16T04:11:43.633 に答える