この章のテーマ §
constキーワードを用いた定数の定義を学習します。定数は変数に似ていますが、変数と違って書き換えが禁止されています。円周率などの絶対に変化しない数を定義するために使います。
前提知識 §
Console.WriteLineメソッド, 文字列の基礎, 変数の基礎, int型, Math.Maxメソッド
解説 §
int a = 123;と書けば変数の宣言になります。整数型(int型)で名前がaで初期値が123になります。123の値は書き換え可能ですが、型と名前は寿命が尽きるまで変化しません。
定数は、これにconstキーワードを付けてconst int a = 123;のようにして宣言します。この場合、整数型(int型)で名前がaで値が123になります。この123という値は絶対に変化しません。つまり、型と名前だけでなく値も寿命が尽きるまで変化しません。
定数は一般的に【値に名前を付ける】ために使用されます。たとえば、クラスの定員が30名の時、ソースコードに30と直接書き込むと何の30か分からなくなるので、const int クラスの定員 = 30;のように宣言しておき、30ではなく【クラスの定員】をソースコードに書き込みます。
定数を宣言する場合には必ず値を指定しなければなりません。その際、値の指定が計算式で許される場合と許されない場合があります。
たとえばサンプルソースのconst int c = a + b;はOKです。C#コンパイラはaもbも定数であることを知っているので、cも決まり切った数【定数】になると理解できるからです。しかし、const int d = Math.Max(a, b);はNGです。Math.Maxメソッドは、2つの引数のうちの大きい方の値を得る機能を持ったライブラリのメソッドで、この場合定数a, bの大きい方の値は常に決まっていて同じ値になると決まっています。しかし、C#コンパイラはライブラリのメソッドの事情までは理解していないので、これは【実行してみるまで値は分からない】と判定され、エラーになります。このような場合はたとえ定数になると分かっていてもconstキーワードを外して変数として宣言する必要があります。
罠の数々 §
- 定数の宣言は、いわゆる【マジックナンバーの回避】という目的で多用される。マジックナンバーとは、ソースコード上に出現する生の数字のことである。たとえば、12と書かれていても、1ダースのことなのか、1年の月数なのか、それとも黄道十二宮のことなのか、あるいはもっと別のものなのか咄嗟に分からないことがあり、ソースコードをメンテナンスする効率を下げる。名前を付ければ分かりやすくなる
- 同じ決まった値(定数)を複数使う場合、constキーワードで名前を付けると良い。そして値は名前で使用する。そうすると、const宣言を書き換えるだけで全ての値が一瞬で書き換わる
- 同じ値でも目的が違う場合は別々に異なる名前で宣言しよう。A国の税率とB国の税率が同じだからといって、同じ定数を使うと両国の税率が違ってしまったときに手直しに苦労する
- 数字、ブール値、文字列、null 参照で定数を宣言できる。通常のオブジェクト参照は定数値にできない
参考リンク §
const (C# リファレンス)
サンプルソース: kw_const §
const int a = 123;
const int b = 456;
const int c = a + b; // OK
//const int d = Math.Max(a, b); // NG
int d = Math.Max(a, b); // OK
Console.WriteLine($"a={a}");
Console.WriteLine($"b={b}");
Console.WriteLine($"c={c}");
Console.WriteLine($"{a}と{b}の最大値は{d}");
実行結果 §
a=123
b=456
c=579
123と456の最大値は456
リポジトリ §
https://github.com/autumn009/CSharpPrimer2
練習問題 §
const int 還元率パーセント = 10;という定義があった。還元率の改訂があって、10を12にしたい。どうすれば良いのだろうか。正しい対処方法はどれだろうか。
- 還元率パーセント = 12;という代入文を追加する
- 定数を上書きする定義を追加するだけで良い。特にソースコードは書き換えなくて良い
- const int 還元率パーセント = 12;とソースコードを書き換えてコンパイルをやり直す
- 定数は書き換えられないので、絶対にもう変化できない
- C#コンパイラのバージョンアップを待つ
[[解答]]