0

C# で非シングルトン クラス内にシングルトン クラスをネストすることは可能ですか? もしそうなら、この場合、シングルトンのライフサイクルに制限はありますか?

public class NonSingletonClass
{
  public NonSingletonClass()
  {
    // Initialize some stuff.
  }

  // Put some methods here.

  public class SingletonClass
  {
    // Singleton construction goes here.

    // Put some methods here.
  }
}

私のアプリケーションの設計では、これは理にかなっていますが、実際にこれを実装する前に、潜在的な落とし穴を知る必要があります。

編集: 具体的には、タイマーに基づいてタスクを実行するジョブ ホストがあります。このNonSingletonClass場合の は、タスクのインスタンス化です。はSingletonClass、 によって使用されるデータのリポジトリですが、 のNonSingletonClass外部から変更できますNonSingletonClassSingletonClass複数のNonSingletonClassインスタンスがある場合でも、それらすべてに対して命令とデータのセットが 1 つだけであることを保証するために存在します。

4

4 に答える 4

4

はい、シングルトンは非シングルトン内で完全に快適に生活できます。

ネストされたクラスのライフサイクルは、外部クラスのライフサイクルから完全に独立しています。C#では、ネストされたクラスとネストされていないクラスの間にほとんど違いはありません。(ネストされたクラスは外部クラスのプライベートメンバーにアクセスでき、拡張メソッドはネストされていない静的クラスに含まれている必要があるなど、いくつかの違いがありますが、ライフサイクルには影響しません。

特に懸念はありましたか?

于 2009-12-23T17:57:16.723 に答える
2

あなたはモノステートパターンを探していると思います

このリンクはこれの良い説明であり、シングルトンパターンの モノステートパターンとの契約を提供しています

于 2009-12-23T17:55:13.467 に答える
0

私の最初の質問は、「私のアプリケーションの設計はこれが理にかなっている」と述べたことを考慮して、より具体的に教えていただけませんか。抽象ファクトリとビルダーは、シングルトンクラスを使用するパターンのほんの一部です。NonSingletonClass内で使用されるある種のグローバルデータを保存していますか。

于 2009-12-23T18:00:46.887 に答える
0

どちらのクラスも他のクラスへの参照を保持していないことを考えると、ネストされたシングルトンに問題はないと思います。シングルトンが複数のインスタンスに変更可能なデータ ストレージを提供すると言うことを考えると、潜在的な問題は同時実行に関連するものになると思います。

これらは、マルチスレッド アクセスが許可されている場合にのみ適用されます。つまり、まずシングルトンが常に有効な状態になるように適切なロックが設定されていることを確認する必要があります。次に、シングルトンの状態が変化し、オブジェクトが非決定論的な順序でアクセスしている場合、結果は予測できません (つまり、競合状態)。

アプリケーションで同時実行性が問題にならない場合、入れ子になったプライベート クラスを使用すると、実装の詳細を隠し、各オブジェクトに 1 つのロールしか持たないようにする優れた方法であることがわかります。

于 2009-12-23T22:29:28.150 に答える