2016-11-29 5 views
3

は、次のように私はC#のシングルトンクラスを持っていると言う:C#.NET Singletonクラスの静的メソッドは、パフォーマンスやメモリ消費に悪影響を及ぼしますか?簡単な例として

using System.Collections.Generic; 

public sealed class RestrictedNameCollection : List<string> 
{ 
    private static object _lock = new object(); 

    private RestrictedNameCollection() 
    { 
    } 

    private static RestrictedNameCollection _instance; 
    public static RestrictedNameCollection Instance 
    { 
     get 
     { 
      if (_instance == null) 
      { 
       lock (_lock) 
       { 
        if (_instance == null) 
        { 
         var nameList = new List<string>(); 
         nameList.Add("Jack"); 
         nameList.Add("Jill"); 
         nameList.Add("John"); 
         nameList.Add("Jane"); 

         var restrictedNameCollection = new RestrictedNameCollection(); 
         foreach (var name in nameList) 
         { 
          restrictedNameCollection.Add(name); 
         } 

         _instance = restrictedNameCollection; 
        } 
       } 
      } 
      return _instance; 
     } 
    } 
} 

私はクラスに次の2つの方法をIsRestrictedName(string name)メソッドを追加することができます。

public bool IsRestrictedName(string name) 
{ 
    return Contains(name); 
} 

または:

public static bool IsRestrictedName(string name) 
{ 
    return Instance.Contains(name); 
} 

私はRestrictedNameCollection.Instance.IsRestrictedName("Jack")を呼び出すことにより、最初のバージョンを使用することができます。しかし、私はそれを簡潔にするために第二のバージョンRestrictedNameCollection.IsRestrictedName("Jack")を呼び出すことができることを好む。

私の質問は、私がメソッドの静的バージョンから離れなければならない理由はありますか?これは純粋に統語論的な議論ですか?または、私が心配しなければならない基本的なパフォーマンスの影響がありますか?

+0

インスタンスを知らなくてもインスタンスメソッドを呼び出すことはできません。これはInstanceプロパティゲッターの使用を必要とします。だからあなたはそれをどちらかの方法で支払うでしょう。少なくとも、if()ステートメント本体を別のメソッドに移動して、プロパティゲッターをインライン化できるようにします。実際には、静的なコンストラクタを代わりに使用してください。 –

+0

次に、なぜ静的クラスの代わりにシングルトンを使用しますか? –

答えて

0

メモリの質問はちょっと難しいですが、基本的に一度呼び出すと、すべてのデータ(「ジャック」など)がメモリに読み込まれ、DLLがアンロードされるまでそのまま残ります。パフォーマンス上、スレッドの安全性についてもっと心配します。しかし、私が作ろうとしていたのは、なぜリストを作成しようとしているのですか? "populatenames"や "populaterestricted"のようないくつかの静的関数を作成するだけです。

は、私はあなたがナノ秒を保存する心配がない限り、オーバー考え、これを....

+1

Trey、私はこの記事のための例を書いていますので、その方法の違いに焦点を当てることができました。これを鼓舞した現実世界のシングルトンは実際ははるかに複雑ですが、私は読みやすさのために単純化しました。すべてのシングルトンの例では、内部メソッドは通常Instance.Whatever()を呼び出すことによってアクセスされることがわかります。なぜ、インスタンスにアクセスする静的メソッドをシングルトンクラス自体の内部で回避する必要があるのか​​不思議です。 – John

0

あなたは、PERF心配すべきではないと思います。静的メソッド呼び出しは常に安くなりますが、インスタンスを使用すると(インターフェイス経由で)モックアップしたり、後でより多くの動作を注入できます。それは変化する方が受け入れやすい。さらに、インスタンスは処理が完了した時点で破棄することができますが、アプリケーションの存続期間中に存在する必要がある場合は考慮されません。

初期化の目的で静的コンストラクタを使用できます。

0

性能差をテストするためにsimple fiddleを試してみました。あなたと同じように、静的メソッドを使ってアクセスされるシングルトンは、純粋な静的クラスと同じくらい良い(おそらく良い)ことが期待されます。今、それはかもしれません異なる条件の下でより良いと私の結果は、純粋なシングルトンは、静的メソッドのシングルトンよりも遅く入ってくるよりも頻繁に見えるが、非常に大きな違いはないことを示すように見える静的クラス。

最も決定的なテストではありませんが、好きなバージョンはおそらく大丈夫です。

関連する問題