変数の反対が定数、です。
リテラル表記が、定数値と呼ばれることは説明しましたが、リテラル表記だと、その値
が何を意味しているのかが分からなくなります。
そういう場合は、定数値に名前をつけてやると、プログラムが見やすくなります。
また、名前をつけてやれば複数個所で使われていた場合、宣言部を変えれば全ての箇所
を変更することが出来るという大きなメリットもあります。
定数を宣言するには、const修飾子を使用します。
Cでの必要悪defineは、定数やマクロの目的としては使用できません。
#if
,#elseのような、コンパイルオプションにのみ使用出来るようになっています。
より安全になった、ということですね(C++で定数定義にdefineを使うことはあまり無い
でしょうが、使えてしまうというのはやっぱり怖いですしね)
定数は、変数と違って変更できません。
ためしにpiに何か数値を代入してみてください。
コンパイルエラーが発生します。
尚、const修飾子をつけると、値がコンパイル時に評価されます。
C/C++とちがって、無理矢理この値を変更することはできません。
例
const double pi = 3.14;
こうしておけば、piを3.14として使用できます。
たとえば、あとで、3.14ではなくも、もっと正確に3.14159265358979323846264338...
といった値が必要だった場合、このpiの値を変えてやれば、このpiを使って計算してい
るところは変更する必要はなくなります。
リテラル値を使って計算していると、修正を忘れたり、間違って修正したりとバグの原
因となります。
constによる定数は便利ですが、例えば曜日のように連続しているものを、一々constで
宣言するのは少々面倒です。
そういう場合は列挙型というものを使用します。
列挙型を宣言すると、新しい列挙型の型を使えるようになります。
例:
public partial class Form1 : Form
{
public enum Week { Sun, Mon, Tue, Wen, Thu, Fri, Sat };
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
Week day;
day = Week.Mon;
label1.Text = day.ToString();
}
}
列挙型はローカル(関数の中)には宣言できない為、フィールド(クラス内)で定義します。
public enum Week { Sun, Mon, Tue, Wen, Thu, Fri, Sat };
これが、列挙型の宣言です。
こうすると、Week型、という列挙型が使えるようになります。
まぁ、変数の型と同じようなものです。
Form1_Load関数内では、
Week day;
これで、dayを宣言しています。
dayに代入するには
day = Week.Mon;
このように、Weekという列挙のMonを入れる、というように、ピリオドでどの列挙型の何、
というようにしています。
何気なく(?)使っている、label1.Textもそうです。
label1のTextに、文字を代入する、ということですね。
列挙名を取得したい場合はToStringを実行します。
label1.Text = day.ToString();
例のプログラムを実行すると、フォームの真ん中にMonと表示されるはずです。
列挙型は、並んでいる順番に0から1ずつ番号を振ってくれます。
なので、例ではSunは0、Monは1ということになります。
初期値を変えたい場合は、宣言の中でイコールにて値を設定してください。
public enum Week { Sun = 1, Mon, Tue, Wen, Thu, Fri, Sat };
こうすると、Sunは1、Monは2になります。
public enum Week { Sun = 1, Mon = 2, Tue = 3, Wen = 4, Thu = 5, Fri = 6, Sat = 7 };
の、ように、全てに値を設定することも出来ます。
数値、なので、値を変数に代入することも出来ますが、明示的なキャストが必要です。
キャストについては次で説明します。
例を以下のように変更してみましょう。
int day;
day = (int)Week.Mon;
今度は1と表示されるようになったはずです。
ただ、個人的な意見なのですが、enumはあくまで定数です。
名前で扱うべきであり、数値で扱うべきではありません。
数値で扱ってしまうと、列挙型に追加をしたり、削除をしたとき、思わぬ動作をしてしま
うことになりかねません。
最終更新:2007年09月06日 12:51