定数について

今回の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が立ち上がってきます。

ビルドメニューから「ソリューションのビルド」を選択し、ビルドします。

VisualStudioのビルド成功画面

ビルドが成功したら、F5キーを押してプログラムを動かします。

プログラム実行画面

「Pi = 3.14」と表示されたらOKです。

Enterキーを押すとプログラムが終了します。

プログラム解説

プログラム例その1を参考に、定数の使い方について学んでいきましょう。

定数の使い方

定数を宣言するときは、型名の前に「const」キーワードを付けます。

あとは定数なので、宣言と同時に値を入れます。

const double PI = 3.14;

定数を呼び出すときは変数を呼び出すときと同じで、名前を記述するだけです。

Console.Write("Pi = {0}", PI);

簡単ですよね。

定数を書き換える

定数は値が変わらないというのは本当なのでしょうか?

ということで、プログラム例その1の12行目ぐらいにあるコメント「//」を削除して、「PI = 3;」にしてみます。

VisualStudioのコード編集画面

ビルドメニューの中から、今度は「ソリューションのリビルド」を選択し、ビルドします。

VisualStudioのビルド失敗画面

するとエラーが出て、ビルドすることはできません。

エラー内容は、「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が立ち上がってきます。

ビルドメニューから「ソリューションのビルド」を選択し、ビルドします。

プログラム例その2のビルド成功画面

ビルドが成功したら、F5キーを押してプログラムを動かします。

プログラム例その2の実行画面

変数「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のビルド失敗画面

すると今度はエラーが出て、ちゃんとビルドが失敗します。

プログラム解説

プログラム例その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」イーナムと呼んでいます。