1. ホーム
  2. c#

[解決済み] メソッド内部で変数の代わりにconstを使用する利点

2023-05-22 05:17:06

疑問点

メソッド内にローカル変数がある場合、ReSharperはそれらを定数に変換するよう提案します。

// instead of this:
var s = "some string";
var flags = BindingFlags.Public | BindingFlags.Instance;

// ReSharper suggest to use this:
const string s = "some string";
const BindingFlags flags = BindingFlags.Public | BindingFlags.Instance;

これらは変数ではなく定数値であるため、ReSharperはこれらをconstに変更するよう提案しているのだと理解しています。

しかし、それとは別に、constを使うことで何か他の利点(例えば、より良いパフォーマンス)があるのでしょうか? const BindingFlags の代わりに、便利で読みやすい var というキーワードを使うのでしょうか?

ちなみに、ここで似たような質問を見つけました。 文字列の代わりにconst文字列を作るようにResharperはいつも私に示唆している しかし、私はそれが私の質問はローカル変数/コンストラクタについてであるクラスのフィールドについてより多くのものだと思います。

どのように解決するのですか?

定数に値を代入しようとするとコンパイラがエラーを投げるので、誤って変更することを防げる可能性があります。

また、通常、定数対変数を使用すると、わずかながらパフォーマンスの利点があります。 これは、MSIL にコンパイルされる方法と関係があります。 この MSDN マガジンの Q&A :

<ブロッククオート

これで、コード内のどこで myInt が参照されても、変数から値を取得するために "ldloc.0" を実行する代わりに、MSIL はハードコードされている定数値をロードするだけになりました。 このように、定数を使うことには通常小さなパフォーマンスとメモリの利点があります。 しかし、それらを使用するためには、コンパイル時に変数の値を持っている必要があり、コンパイル時にこの定数を参照すると、たとえそれが別のアセンブリにあったとしても、この置換が行われます。

定数は、コンパイル時に値を知っていれば、確かに便利なツールです。そうではなく、変数が一度だけ設定されるようにしたい場合は、C#のreadonlyキーワード(MSILではinitonlyに対応)を使用して、変数の値がコンストラクタ内でのみ設定可能であることを示し、それ以降は変更するとエラーになります。これは、フィールドがクラスの識別を決定するのに役立ち、しばしばコンストラクタのパラメータに等しく設定される場合によく使用されます。