const と static read only の違いと使い分けについて


題名通り、const と static read only
の違いと使い分けについて下記の理解をもっています。もし、間違っていたり、アドバイスをいただける点がありましたら、是非お願いします。

MSDNのリファレンス：  
[readonly (C# リファレンス)](https://msdn.microsoft.com/ja-jp/library/acdd6hb7.aspx)

[const (C# リファレンス)](https://msdn.microsoft.com/ja-jp/library/e6w8fe1b.aspx)

![画像の説明をここに入力](https://i.stack.imgur.com/21q8C.png)




初期化の項はもにょります。よく読むとどちらも初期化が行われるにもかかわらず、なぜ必要・不必要に分かれるのか、その記述には何か意図があったりしますか？  
速度についてですが、.NETではJIT; Just-In-Time
Compileが行われます。ソースコード中で値の変わる変数に見えても実質的に値が変わらないようであれば定数としてコンパイルが行われます。ですのでstatic
readonlyが遅いというわけではありません。  
ディフォルト値は意図が読み取れませんでした。

その他として、constの場合、値型・文字列・nullが使えます。つまり文字列以外の参照型は使えません。static
readonlyにはこのような制限はありません。

あとマニアックな話としてstatic readonlyは実行時に初期化されます。この言葉の意味は、初期化前に参照すると別の値（nullや0）が読み出せます。

[code]

    class A {
        public static readonly int A2 = B.B2 + 1;
    }
    class B {
        public static readonly int B2 = A.A2 + 1;
    }
    
[/code]

もし先にAにアクセスするとA2の初期化が行われます。その際、B.B2を参照しますのでそこでBの初期化が行われます。B2の値を決定すべくA.A2を参照しますが未初期化ですのでA.A2は0が読み出されB.B2は1で確定します。引き続きA2の初期化が行われ、A2
= B.B2 + 1は2で確定します。

もちろんBを先にアクセスすると値は入れ替わります。  
これらが、初期化の項やディフォルト値に絡んでくるかもしれません。




初期化の項はもにょります。よく読むとどちらも初期化が行われるにもかかわらず、なぜ必要・不必要に分かれるのか、その記述には何か意図があったりしますか？  
速度についてですが、.NETではJIT; Just-In-Time
Compileが行われます。ソースコード中で値の変わる変数に見えても実質的に値が変わらないようであれば定数としてコンパイルが行われます。ですのでstatic
readonlyが遅いというわけではありません。  
ディフォルト値は意図が読み取れませんでした。

その他として、constの場合、値型・文字列・nullが使えます。つまり文字列以外の参照型は使えません。static
readonlyにはこのような制限はありません。

あとマニアックな話としてstatic readonlyは実行時に初期化されます。この言葉の意味は、初期化前に参照すると別の値（nullや0）が読み出せます。

[code]

    class A {
        public static readonly int A2 = B.B2 + 1;
    }
    class B {
        public static readonly int B2 = A.A2 + 1;
    }
    
[/code]

もし先にAにアクセスするとA2の初期化が行われます。その際、B.B2を参照しますのでそこでBの初期化が行われます。B2の値を決定すべくA.A2を参照しますが未初期化ですのでA.A2は0が読み出されB.B2は1で確定します。引き続きA2の初期化が行われ、A2
= B.B2 + 1は2で確定します。

もちろんBを先にアクセスすると値は入れ替わります。  
これらが、初期化の項やディフォルト値に絡んでくるかもしれません。

