2016-10-02 24 views
1

状態変数を含むクラスにSingletonまたはStaticを使用するかどうかを選択する際に問題がたくさんあります。私は、クラスオブジェクトがインスタンス化して1つだけ存在することを望んでいました。C#はシングルトンに静的メソッドを含める必要がありますか?

私は両方の方法が状態変数を格納できることを知っています。 Staticクラスはすべてのメソッドがstaticになるため、変数を扱うのが容易だと思われます。それ以上の作業は行わずに変数staticにアクセスできます。

ただし、Singletonの場合はこのケースが異なります。私には両方の方法があります。 Singletonの変数Instanceにアクセスする必要があるもの、およびInstance変数にアクセスすることができないもの(静的とマークすることができます)。

アン例:

/// <summary>Singleton.</summary> 
    public sealed class Singleton 
    { 
     private static readonly Singleton instance = new Singleton(); /// <summary>Instance.</summary> 
     public static Singleton Instance { get { return instance; } } 

     private int integer; /// <summary>Integer.</summary> 
     public int Integer { set { integer = value; } get { return integer; } } 

     /// <summary>Constructor.</summary> 
     private Singleton() { } 

     /// <summary>TestA</summary> 
     public void TestA(int val) 
     { 
      Integer = val; 
     } 

     /// <summary>TestB</summary> 
     public static int TestB(int val) 
     { 
      return Instance.Integer * val; 
     } 

     /// <summary>TestC</summary> 
     public static int TestC(int val) 
     { 
      return val * val; 
     } 
    } 

上記の例から、3つの方法があります。 TestA,TestBおよびTestCである。

  1. TestAは、そのプロパティにアクセスできるインスタンスメソッドです。
  2. TestBstaticメソッドですが、Instanceにアクセスしてそのプロパティを取得します。
  3. TestCは、staticメソッドで、インスタンスには使用されません。

これは質問頼む:

  1. Singletonのみstatic方法、およびstaticInstanceプロパティを経由することによって、そのInstanceプロパティとメソッドへのアクセスが含まれているべきか?つまり、すべての方法はTestBまたはTestCに似ています。
  2. Singletonにはnon-staticの方法しか含まれていないと、Instanceが必要かどうかは関係ありませんか?すべての方法はTestAに似ています。
  3. Singletonには、staticnon-static(この場合、TestATestB種類)の両方の方法が混在する必要がありますか?私はそれがむしろ乱雑になると信じています。
  4. そうでない場合、どうすればよいですか?私はSingletonのアイデアをダンプする必要がありますし、すべてstaticと一度だけインスタンス化されるすべてのクラスのために行くか?

編集:同様の質問では、SingletonInstanceの横にある任意のStatic変数/フィールド/プロパティが含まれている必要がありますか?

答えて

1

あなたは両方のパターンを混ぜ合わせるべきです。

シングルトンパターンがある場合、唯一の静的フィールドはインスタンス(ゲッター)でなければなりません。すべてのメソッドとフィールドは、インスタンスを通してアクセス可能でなければなりません。それを混ぜると、混乱の原因になります。

静的なクラスパターンを選択した場合、.NETのジョブの中に秘密のインスタンスを使用しないでください。

あなたに最適なパターンがわからない場合は、このSingleton-vs-Staticの記事をご覧ください。 https://www.dotnetperls.com/singleton-static

+0

私は、ありがとうございます! – Kei

関連する問題