定数について
今回のC#プログラミング学習は、定数を使うメリットやその使い方を学んでいきます。
定数とは
C#プログラムに限らず、プログラムを書いていると、固定の数値というのが出てくる場合があります。
例えば、一日は24時間とか、円周率は3.14など、常識的に決まっているものから…。
月曜日は1、火曜日は2などのように、データを整理するためにこのプログラム内だけの限定ルールなどいろいろあります。
そのような固定数値というのは、普通に変数に代入してコーディングしてもよいのですが、知らないうちに値が変わってしまったら困りますよね。
値が変わらないように、プログラム内に直接書くという方法もありますが、これはやめておきましょう。
なぜなら、コメントでしっかり説明してあればよいですが、そうでない場合、最後まで何の数値だったかわからなかったら悲劇です。
このようなプログラム内に出てくる謎の数値は、通称「マジックナンバー」と呼ばれ嫌われます。
このような時に定数を使うのです。
定数の使い方も簡単で、値の変わらない変数だと思って使えば問題ありません。
まず、型の宣言時に値を入れて、必要な時に宣言した名前を呼び出して使います。
文字だけ見てもわかるように、定数名は、すべて大文字で書くプログラマーが多いです。
定数を使ったプログラム
それでは実際に、定数を使ったC#プログラム(プログラム例その1)を見てみましょう。
using System; namespace Sample { internal class Program { static void Main(string[] args) { const double PI = 3.14; // 以下のコメントを削除するとビルドエラーになる //PI = 3; Console.Write("Pi = {0}", PI); Console.ReadLine(); } } }
プログラム例その1をダウンロードするにはここをクリックします。
ダウンロードしたZIPファイルを解凍して、「Sample.sln」を開くとVisualStudioが立ち上がってきます。
ビルドメニューから「ソリューションのビルド」を選択し、ビルドします。
ビルドが成功したら、F5キーを押してプログラムを動かします。
「Pi = 3.14」と表示されたらOKです。
Enterキーを押すとプログラムが終了します。
プログラム解説
プログラム例その1を参考に、定数の使い方について学んでいきましょう。
定数の使い方
定数を宣言するときは、型名の前に「const」キーワードを付けます。
あとは定数なので、宣言と同時に値を入れます。
const double PI = 3.14;
定数を呼び出すときは変数を呼び出すときと同じで、名前を記述するだけです。
Console.Write("Pi = {0}", PI);
簡単ですよね。
定数を書き換える
定数は値が変わらないというのは本当なのでしょうか?
ということで、プログラム例その1の12行目ぐらいにあるコメント「//」を削除して、「PI = 3;」にしてみます。
ビルドメニューの中から、今度は「ソリューションのリビルド」を選択し、ビルドします。
するとエラーが出て、ビルドすることはできません。
エラー内容は、「CS0131. 代入式の左辺には変数、プロパティ、またはインデクサーを指定してください」。
このように定数を書き換えようとすると、VisualStudio側がエラーを出して、プログラマーに気づかせてくれるんですね。
定数に幅を持たせる
定数を使うとき、ある程度の幅を扱えるようにしたいという場面があります。
例えば、アンケート集計プログラムを作る際、男性を0、女性を1とした場合、性別を格納する変数には、0か1しか入ってほしくないですよね。
これまでの知識を駆使して、以下のようなプログラム(プログラム例その2)を作成しても、性別を扱う変数の値を制限するのは難しいです。
using System; namespace Sample { internal class Program { static void Main(string[] args) { const int MAN = 0; const int WOMAN = 1; int nGender; nGender = MAN; nGender = 2; Console.Write("nGender = {0}", nGender); Console.ReadLine(); } } }
プログラム例その2をダウンロードするにはここをクリックします。
ダウンロードしたZIPファイルを解凍して、「Sample.sln」を開くとVisualStudioが立ち上がってきます。
ビルドメニューから「ソリューションのビルド」を選択し、ビルドします。
ビルドが成功したら、F5キーを押してプログラムを動かします。
変数「nGender」には、本来であれば、男性の0か、女性の1しか代入されてほしくないんですが、「nGender = 2」と表示されてしまいました。
Enterキーを押すとプログラムが終了します。
定数に幅を持たせるプログラム
整数型の定数の幅でよければ、以下のようなプログラム(プログラム例その3)を使用することができます。
using System; namespace Sample { enum GenderType { MAN, WOMAN }; internal class Program { static void Main(string[] args) { GenderType GENDER; GENDER = GenderType.MAN; GENDER = 2; Console.Write("Gender = {0}", (int)GENDER); Console.ReadLine(); } } }
プログラム例その3をダウンロードするにはここをクリックします。
ダウンロードしたZIPファイルを解凍して、「Sample.sln」を開くとVisualStudioが立ち上がってきます。
ビルドメニューから「ソリューションのビルド」を選択し、ビルドします。
すると今度はエラーが出て、ちゃんとビルドが失敗します。
プログラム解説
プログラム例その3では、enumという列挙型を定義して、新たに型を作り出しています。
新たな型の定義
記述方法は、「enum 定義する型の名前 { 値の範囲 };」という感じで書きます。
enum GenderType { MAN, WOMAN };
今回であれば、定義する型の名前が「GenderType」で、値の範囲が「MAN, WOMAN」となっています。
これは、MANが0で、WOMANが1であることを表しています。
つまり、enumキーワードを使って、GenderTypeという新たな型を定義し、値の範囲は、MANと書けば0扱いで、WOMANと書けば1扱いにするというものです。
当然定義されていない範囲の値はありませんから、0か1しか扱えない型が誕生したわけです。
新たな型の変数
新たな型で変数を宣言します。
GenderType GENDER;
普通に変数を宣言するときと同じやり方で、変数を宣言できます。
変数の型はGenderTypeで、変数名はGENDERですね。
変数への代入
変数への代入は、以下のように書きます。
GENDER = GenderType.MAN;
個別に値を呼び出したいときは、「型名.値の名前」にします。
今回は、MANが0で、WOMANが1で定義してあります。
なので、GenderType.MANであれば0、GenderType.WOMANであれば1という感じになります。
もちろん、今回のように間違って「GENDER = 2;」とコーディングしてしまった場合は、以下のようなエラーが出ます。
CS0266. 型 'int' を 'Sample.GenderType' に暗黙的に変換できません。 明示的な変換が存在します (cast が不足していないかどうかを確認してください)
これって、キャストのときに出てきたエラーメッセージですよね。
確かに、イコールの左と右では型が違います。
エラーの原因が分かったので、この部分を削除して、もう一度ビルドしてみてください。
今度はビルドが成功するはずです。
変数の表示
変数の表示は今まで通り、「Console.Write」で行います。
以下の部分で「Gender = 0」と表示させています。
Console.Write("Gender = {0}", (int)GENDER);
intでキャストしているのは、数値として表示させたいからです。
もしキャストしていなければ、「Gender = MAN」と定義した文字列で表示されてしまいます。
まとめ
今回登場した「enum」ですが、読み方がいまいちわからなかったので、ぼくは適当に「e-num」イーナムと呼んでいます。