2021年11月23日
川俣晶の縁側ソフトウェアnew_C#入門・全キーワード明快解説!total 697 count

const: 書き換えは絶対にできません!

Written By: 川俣 晶連絡先

この章のテーマ §

 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#コンパイラのバージョンアップを待つ

[[解答]]

Facebook

キーワード【 川俣晶の縁側ソフトウェアnew_C#入門・全キーワード明快解説!
【new_C#入門・全キーワード明快解説!】の次のコンテンツ
2021年
11月
24日
+/-/*\///%: 四則演算プラス剰余・全ての計算の基本のキ
3days 0 count
total 937 count
【new_C#入門・全キーワード明快解説!】の前のコンテンツ
2021年
11月
22日
文字型と文字列型: 文字と1文字の文字列は何が違うの?
3days 0 count
total 785 count

このコンテンツを書いた川俣 晶へメッセージを送る

[メッセージ送信フォームを利用する]

メッセージ送信フォームを利用することで、川俣 晶に対してメッセージを送ることができます。

この機能は、100%確実に川俣 晶へメッセージを伝達するものではなく、また、確実に川俣 晶よりの返事を得られるものではないことにご注意ください。

このコンテンツへトラックバックするためのURL

https://mag.autumn.org/tb.aspx/20211123091325
サイトの表紙【new_C#入門・全キーワード明快解説!】の表紙【new_C#入門・全キーワード明快解説!】のコンテンツ全リスト 【new_C#入門・全キーワード明快解説!】の入手全リスト 【new_C#入門・全キーワード明快解説!】のRSS1.0形式の情報このサイトの全キーワードリスト 印刷用ページ

管理者: 川俣 晶連絡先

Powered by MagSite2 Version 0.36 (Alpha-Test) Copyright (c) 2004-2021 Pie Dey.Co.,Ltd.