1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【C#】constよりもreadonlyを使うべし

Last updated at Posted at 2025-01-26

C#で使える定数

C#では定数を宣言する際にconstまたはreadonlyを使います
それぞれの特徴は下記の通りです

定数 値決定タイミング パフォーマンス
const コンパイル時 優れている
readonly 実行時 やや劣る

"値の変わらないもの"という役割は同じですが、それぞれ大きく異なる動きをするため、用法を誤るとバグに繋がってしまうかも!?

どっちを使うべきか?

タイトルでネタバレしちゃってますが、基本的にはreadonlyを使うことが推奨されています
以下の観点でなぜresdonlyを使うべきなのか考察していきます

  • 値変更後の再コンパイル必要有無
  • 扱える型の違い

値変更後の再コンパイル必要有無

constreadonlyの最も大きな違いは値決定のタイミングです
constはコンパイル時、readonlyは実行時に値が決まります

C#コードはビルド時にコンパイルが行われ、コンパイル完了後の成果物を使用して処理が実行されます

image.png

つまり、定数の中身に変更があった場合、コンパイル時に値が決定するconstは、再ビルドを実行しないと定数値の変更が処理に反映されません

例) アセンブリの変更時に再ビルト実行が漏れたケース

VersionInfoというアセンブリのクラスVersionDefinitionに以下の定数が設定されているとします

class VersionDefinition
{
   public static readonly double AvailableVersion = 1.5;

   public const double CurrentVersion = 2.0;
}

この定数を別アセンブリから参照する以下の処理があったとします

if (VersionDefinition.CurrentVersion > VersionDefinition.AvailableVersion)
{
    Console.WriteLine($"This version is available!");
}

現状、定数の変更がなければ問題なくConsole.WriteLine()が実行されます

ただ、アセンブリVersionInfoのアップデートが行われ、以下のように変更があった場合を考えてみましょう

class VersionDefinition
{
   public static readonly double AvailableVersion = 2.0;

   public const double CurrentVersion = 2.1;
}

このケースでVersionInfoの再ビルドが漏れると実行時の各定数の値は以下になります
AvailableVersion: 2.0
CurrentVersion: 2.0

ifの条件式がfalseになりアセンブリVersionInfoで設定した定数が意図する処理とは異なる挙動になってしまいますね

長期的なメンテナンス性を加味するとreadonlyを使うのが得策と言えるでしょう

扱える型の違い

constはコンパイル時に値が決まっていなければならないという特性上、扱える型に制限があります

具体的には、

  • 整数型や浮動小数型
  • 列挙型
  • 文字列型
    のみとなります

それに対して、readonlyは処理実行時に値を決定するため、すべての型に対応可能です

この問題に関しては実装時に気づくことができるため不具合につながる可能性等は低いですが、constで対応できない定数はreadonlyで補えることを知っておくと便利でしょう

じゃあconstはいつ使うの?

上記の理由から定数は基本的にreadonlyを使用することを推奨しますが、constを使うメリットはあります

それはパフォーマンスです

実行時に値へアクセスするreadonlyよりも、コンパイル時に値が決まっているconstの方が処理時間が早いのは自明ですね

将来的に値の変更が想定されない定数や、参照されているアセンブリごとに値変更の反映タイミングをずらしたい定数などはconstが有効となります

参考

Effective C# 6.0/7.0 Bill Wagner (著), 鈴木 幸敏 (監修, 翻訳)

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?