8827


`Guid`は`const`として扱うことができないため、下記のようにGUID値を文字列定数にして`public
static`な`Guid`値にしています。

初期化の順番が`NullObjectGuidSingleton`、`GuidText`の順になるなど、  
環境によって変わることがありえますか？

ありえるなら、`Guid`のコンストラクタに同じものを書くのは避けたいのですが、  
どのようにコーディングするのがよいでしょうか？

[code]

    public sealed class NullObject : IGameObject
    {
        private const string GuidText = "1887ABDE-4B0B-4D87-860B-1E811CCE3A89";
        public static readonly Guid NullObjectGuidSingleton = new Guid(GuidText);
        // ...
    
[/code]


CC BY-SA 3.0
2015-04-06T12:14:54.033
8826
2015-04-08T21:58:23.193
8870
question
c#
Guid型の静的フィールドの初期化のパラメータにconst値を使っても大丈夫か？


定数式は必ず`static`フィールド初期化子より先に評価されるので質問文の書き方で問題ありません。  
なお同一クラスの`static`フィールド初期化子は上から順に評価されますので注意が必要です。


CC BY-SA 3.0
2015-04-06T12:20:22.573
8827
2015-04-06T12:20:22.573
5750
8826
answer


const はコンパイル時に初期化されます。  
readonly は実行時になります。ですのでconstが先に初期化という認識で正しいです。

ちなみに、一般的にシングルトンはインスタンス(メモリ上に配置された状態)が実行時に１つだけになる実装パターンを指します。  
Guid? は単に参照型であるGuidをnullの状態を持つことができるようにしただけです。  
Guid?はいくつも宣言できその値が別の値を保持できますので、シングルトンとは呼びません。

シングルトンを詳しく知りたいのであれば、GoFのデザインパターンを調べてみると良いですよ。

[code]

    // シングルトンの簡単な実装。C#でのシングルトンの実装は他にもパターンがあります。
    public sealed class Singleton`
    {
        // これがシングルトンのインスタンス
        public static Singleton Instance = new Singelton();
    
        // 外からインスタンス化できない用にprivateのコンストラクタを宣言
        private Singleton()
        {
        } 
    }
    
[/code]


CC BY-SA 3.0
2015-04-08T21:58:23.193
8919
2015-04-08T21:58:23.193
8514
8826
answer