73662


[constとreadonlyとstatic readonly、それぞれの特徴と使い分け方 -
Qiita](https://qiita.com/4_mio_11/items/203c88eb5299e4a45f31)  
や  
[const と static read only
の違いと使い分けについて](https://ja.stackoverflow.com/questions/6653/const-%e3%81%a8-static-
read-
only-%e3%81%ae%e9%81%95%e3%81%84%e3%81%a8%e4%bd%bf%e3%81%84%e5%88%86%e3%81%91%e3%81%ab%e3%81%a4%e3%81%84%e3%81%a6)

を読んで、`const`はコンパイル時に値が決まるもの、基本的に将来に置いて不変のもの（これはプログラム的にということではなく世界的な取り決めとして未来永劫変わらないとされているもの）に使うということを理解しました。

`readonly`が実行時に値を一度入れたら再代入不可のもの（おそらくコレがJavaScriptの`const`や
Swiftの`let`に近いもの）と理解しました。

ここでの`static`は他の言語で言うところのクラス変数のことですよね？（参考：[静的メンバー - C# によるプログラミング入門 | ++C++; //
未確認飛行
C](https://ufcpp.net/study/csharp/oo_static.html)）であれば、再代入禁止とは関係ないので、`const`と`static
readonly`が比較される意味がわかりません。

`const`がついたメンバー変数が無条件でクラス変数（静的メンバー）になるのであれば、比較対象になりえると思うのですが、まだC#の理解があまり進んでおらずわかっておりません。

`const`と`static readonly`にはなにか再代入禁止以外に共通点はありますか？

たとえば `static const` という書き方ができるかどうかわかっていないですが、こういうものがあるのであれば、`static
const`と`static readonly`が比較されるのはわかるのですが...

とここまで書いて思ったのですが、もしかしたら、静的メンバーであるかというのは観点が違っていて、readonlyだけだとインスタンス変数になるので、インスタンスを作るごとにメモリ領域が取られてしまいますが、static
readonlyにしておけば、いくらインスタンスを作ろうがメモリ領域は一つしか作られないので、constの意味合いに近いみたいな回答が得られそうな気がしてきました。（ただ、ここに記載した動きは調べたわけや文献をみたわけでもなく単なる当てずっぽうなので、回答として正確にしりたいと考えています）


CC BY-SA 4.0
2021-01-28T11:48:52.947
73651
2021-02-02T13:59:39.153
2021-02-02T13:59:39.153
9008
9008
question
c#
再代入禁止の文脈で const と static readonlyが比較される意味合いがわかりません。再代入禁止以外になにか共通点はありますか？


[リビジョン5](https://ja.stackoverflow.com/revisions/73651/5)への回答

> static readonly の staticの部分は何を表していますか？

[`static`](https://docs.microsoft.com/ja-jp/dotnet/csharp/language-
reference/keywords/static)と[`readonly`](https://docs.microsoft.com/ja-
jp/dotnet/csharp/language-reference/keywords/readonly)はそれぞれ独立した修飾子です。`static
readonly`はたまたま両方の修飾子が指定されただけであり、特別な意味はありません。

`static`は「静的メンバーは、特定のオブジェクトではなく、型自体に属するメンバー」と説明されています。

* * *

[リビジョン9](https://ja.stackoverflow.com/revisions/73651/9)への回答

> 再代入禁止の文脈で const と static readonlyが比較される意味合いがわかりません

比較したい人は比較しますし、興味のない人は比較しません。比較される主な理由ですが、それこそどちらも実行時に定数として扱われる、ご認識の通り「再代入禁止」だからでしょう。理由がわかっていながら「比較される意味合いがわかりません」なのはたぶん興味がないからではないでしょうか？

もう少し補足すると、`const`はコンパイル時定数です。この意味は深くて、コンパイル時に決定されるだけでなく、この定数を参照した側のコードもコンパイル時に値を取り込みます。  
`const`の値が後から変更されたとしても既にコンパイル済みのコードには反映されません。そのため、「未来永劫変わらないとされているもの）に使う」という理解で正しいです。  
具体例としては[`TimeSpan.TicksPerSecond`フィールド](https://docs.microsoft.com/ja-
jp/dotnet/api/system.timespan.tickspersecond?view=net-5.0)（１秒は何Tickなのか）を挙げておきます。

対して`readonly`は実行時定数です。この定数を参照した側のコードは実行時に改めて参照するようコード生成されます。  
具体例としては[`Path.PathSeparator`フィールド](https://docs.microsoft.com/ja-
jp/dotnet/api/system.io.path.pathseparator?view=net-5.0)（ディレクトリの区切り文字、Windowsでは`\`、その他では`/`）を挙げておきます。

* * *

> `static
> readonly`にしておけば、いくらインスタンスを作ろうがメモリ領域は一つしか作られないので、`const`の意味合いに近いみたいな回答が得られそうな気がしてきました。

はい、その考え方であっています。


CC BY-SA 4.0
2021-01-28T14:21:08.280
73662
2021-01-29T00:35:38.350
2021-01-29T00:35:38.350
4236
4236
73651
answer