2011-01-28 8 views
3
public sealed class Singleton 
{ 
    static readonly Singleton instance=new Singleton(); 

    // Explicit static constructor to tell C# compiler 
    // not to mark type as beforefieldinit 
    static Singleton() 
    { 
    } 

    Singleton() 
    { 
    } 

    public static Singleton Instance 
    { 
     get 
     { 
      return instance; 
     } 
    } 
} 

readonlyキーワードをinstanceメンバーインスタンシエーションから削除しても、シングルトンは同じように機能します。シングルトンの次の実装で '読み取り専用'が不可欠なのはなぜですか?

  • 静的なインスタンスは1つだけ存在します。
  • 値が変化しません。設定値がないためです。
  • 封印されたクラスです。サブクラス化することはできません。

ここでの概念の理解を助けてください。

+0

OMG !!! downvote .. ??誰かがなぜその理由を説明しますか? –

+0

私はこの質問が悪いとは思わない、なぜdownvote? –

+0

誰かがここに来て、すべての反応と同様に質問を下落させました。私はそれについて心配しません。 –

答えて

9

フィールドに読み取り専用のマークが付いていないと、それがSingletonクラス内で変更される可能性があるためです。もちろん、それはまだ外部から変更することができませんでしたが、シングルトンはプログラムの存続期間中に複数のインスタンスが存在する場合、実際にシングルトンではなく、readonly指定子は必要なセマンティクスを強制しますシングルトンクラス。応じて

EDIT:

  1. その静的、インスタンスは1つだけ存在することになります。
  2. 値が変化しません。設定値がないためです。

静的変数は、実行時に異なるオブジェクトを参照するように設定できます。プライベートであるためクラス内でのみ値が変更できます。フィールドが一度しか割り当てられないようにクラスが実装されていた場合、実際には問題にはなりません。しかし、シングルトンインスタンスが決して変更されないことが想定されているので、readonly修飾子はコンストラクタの外側にあるセマンティクスを保証します。 は必須ではありませんクラスのクライアントは参照を変更できないためですが、a)コードの意図を明確にし、b)クラス内でも参照が変更されないようにしてください。

+0

なぜ私はこれのためにdownvoteを得たか知りたいと思うでしょう。私はそれが間違っていると思うところを説明するケア? –

+0

実際、誰かがこのトピックを読んでみんなを下降させたようです(質問さえも)。好奇心... –

+0

はい、それも私に起こった... – digEmAll

0

ここでは読み込み専用にする必要はありません。遅延初期化にのみ意味があります。静的フィールドが読み取り専用としてマークされている場合は、宣言中または静的コンストラクターでのみ初期化できます。インスタンスが読み取り専用としてマークされていない場合、Instanceプロパティへの最初の呼び出し時にインスタンス化できます。

ところで私はダブルチェックロックでシングルトンを使用する方が良いと思う:

public sealed class Singleton 
{ 
    private Singleton() 
    { 
     // Initialize here 
    } 

    private static volatile Singleton _singletonInstance; 

    private static readonly Object syncRoot = new Object(); 

    public static Singleton Instance 
    { 
     get 
     { 
      if(_singletonInstance == null) 
      { 
      lock(syncRoot)) 
      { 
       if(_singletonInstance == null) 
       { 
        _singletonInstance = new Singleton(); 
       } 
      } 
      } 

      return _singletonInstance; 
     }   
    } 
} 
+1

http://csharpindepth.com/Articles/General/Singleton.aspx –

7

readonlyを使用すると、この場合は必須ではないが、それはの性質を示すことによって、コードのセマンティクスを強制するものですフィールド。個人的には、値が一度だけ初期化されるすべてのフィールド宣言に常にreadonlyキーワードを使用します。コンパイラが特定の状況下で最適化を実行するのに役立つ場合もあります。

+0

怠惰な負荷を使ったことはありませんか?それはreadonly修飾語で一種の難しいでしょう:) –

0

OneAtaTimeleton(シングルトンではなく)を作成したかったので、クラスで読み取り専用を削除しました。

なぜですか?このクラスには、ユーザー(管理者)がアプリケーションの実行中に変更できるようにするための設定が含まれていました。そこで、クラスに静的なReload()メソッドを追加しました。

instance = new Configuration(); 

したがって、読み取り専用を削除する必要があります。

コンストラクタのプライベートバージョンは、非静的メソッドを介してconfigをロードします。

関連する問題