0

以下に示すようなコードがあります。Singletonパターンだと思います。静的コンストラクターが必要なのはなぜですか。また、これの利点は何ですか?お返事をありがとうございます ...

  public sealed class Myclass
  {
    static Myclass()
    {
        Myclass.Application = new Myclass();
    }

    protected Myclass()
    {

    }

    static Myclass _application;

    public static Myclass Application
    {
        get { return Myclass._application; }
        protected set { Myclass._application = value; }
    }

    string _name;

    public string Name
    {
        get { return _name}
        protected set { _name= value; }
    }
 }
4

6 に答える 6

6

そもそも、このクラスは、保護されたコンストラクターを持っているという点でやや奇妙です。封印されていることを考えると致命的な欠陥ではありませんが、明らかに奇妙です。

このコードと静的変数初期化子のほぼ同等の使用との間には、タイミングに潜在的な違いがあります。

static readonly Myclass _application = new Myclass();

(もちろん、この場合、セッターは必要ありません。)

ただし、自動的に実装されたプロパティではそれを行うことはできません。

何らかの形で静的初期化を使用すると、スレッドセーフが「解放」されます。遅延初期化を取得するためにロックを実行する必要はありません。

より多くのオプションについては、私のシングルトン実装の記事が興味深いと思うかもしれません。

于 2012-05-28T08:48:33.570 に答える
0

Jon Skeetの回答で指摘されているように、スレッドセーフ以外に、getアプローチで遅延インスタンス化されるのとは対照的に、静的コンストラクターには直接的な利点はありません。何も指定していませんが、これは状況に関連する場合と関連しない場合があります。コードの見た目が異なるだけですが、同じ機能になります。

シングルトンパターンの「利点」は、クラスの単一インスタンス、基本的にはクラスの「グローバルに」アクセス可能なインスタンスの一種に簡単にアクセスできることです。

シングルトンパターンがアンチパターンであるという議論がたくさんあるので、私は「利点」と言います。私は柵の上にいます。小さなアプリケーションでは、これは問題なく機能し、提案された代替ソリューションのほとんどには、依存性注入フレームワークが含まれます(多くの場合、「シングルトン」の寿命があります)。これは、小さなアプリでは実用的でない場合があります。

ただ注意してください、メンバーを持つsealedクラスを持つことprotectedは無意味です-封印されたクラスは継承できません。

于 2012-05-28T08:45:35.907 に答える
0

このように記述した場合、 autoプロパティを使用でき、実際には実装しません。

このように言う:

 public sealed class Myclass
 {
        static Myclass()
        {
            Myclass.Application = new Myclass();
        }

       .....
        public static Myclass Application {get;set;}
        ...


}

基本的に、これが好きでなければ、実用的な利点はありませんコードスタイル。

于 2012-05-28T08:46:18.607 に答える
0

ここでの型ctorの使用は、シングルトンインスタンスが一度初期化されることを保証します。遅延シングルトン初期化を実装する場合、ロックパターンをダブルチェックする方が簡単ですが、同じ理由で欠点があります。シングルトンの作成には非常に費用がかかる可能性があり、アプリの存続期間中はシングルトンを使用できない可能性があります。

于 2012-05-28T08:48:33.567 に答える
0

クラスのインスタンスをどこかに作成する必要があります。これは、静的コンストラクター、またはインスタンスを取得するプロパティのいずれかにあります。

とにかく、それはあなたが見つけた良いコード例ではありません。

  • protectedであるにもかかわらずメンバーが含まれているsealedため、コードが混乱するだけです。彼らはする必要がありますprivate
  • プロパティを見ると、Name設定できないことがわかりますので、常にnull
于 2012-05-28T08:56:26.323 に答える
-1

アセンブリのロード中に呼び出される静的コンストラクタ...

編集: ありがとうジョン私は間違っていました...クラスのインスタンスが作成されたとき、または静的メンバーが参照されたときにのみ実行するようにC#の静的コンストラクターが指定されていることを理解しました。

于 2012-05-28T08:48:57.050 に答える