第16章 列挙型の活用:連載 改訂版 C#入門(2/4 ページ)
一連の名前に値を関連付ける列挙型。C++などにもあったものだが、C#ではやや機能が異なる。サンプル・プログラムとともにその挙動を確認していく。
16-4 最後の要素に付くカンマ
小さいトピックだが、List 16-4のソース・コードの10行目を見ていただきたい。
1: using System;
2:
3: namespace Sample004
4: {
5: enum Era
6: {
7: Meiji,
8: Taisho,
9: Showa,
10: Heisei,
11: }
12: class Class1
13: {
14: [STAThread]
15: static void Main(string[] args)
16: {
17: Era t = Era.Taisho;
18: Console.WriteLine( t );
19: }
20: }
21: }
これを実行するとFig.16-4のようになる。
C#では、List 16-4の10行目のように、列挙型の最後の要素にカンマが付いていてもエラーにならない。機械的にデータを生成する場合などには便利な機能である。
16-5 数値として使う列挙型
すでに述べたとおり、列挙型の中身は数値である。実際に、個々の要素に対応する数値を見るにはList 16-5のように記述する。
1: using System;
2:
3: namespace Sample005
4: {
5: enum Era
6: {
7: Meiji,
8: Taisho,
9: Showa,
10: Heisei
11: }
12: class Class1
13: {
14: [STAThread]
15: static void Main(string[] args)
16: {
17: Console.WriteLine( (int)Era.Meiji );
18: Console.WriteLine( (int)Era.Taisho );
19: Console.WriteLine( (int)Era.Showa );
20: Console.WriteLine( (int)Era.Heisei );
21: }
22: }
23: }
これを実行するとFig.16-5のようになる。
17〜20行目のように、列挙型の値は数値にキャストできる。何も指定しない場合、列挙型はint型の数値で内部処理されるので、int型へ問題なくキャストできる。結果を見て分かるとおり、特に何も指定しなければ、最初の項目が0に割り当てられ、それ以降1ずつ値が増えていく。
16-6 内部処理用の数値型の変更
何も指定しなければ、列挙型はint型で内容を処理する。しかし、内容の処理に使うデータ型は、指定することで変更することができる。例えば、メモリの節約のためにより少ないビット数の数値型にすることもできるし、表現力を高めるためにより多くのビット数の数値型にすることもできる。符号付きと符号なしも選べる。List 16-6は、それを記述してみたサンプル・ソースである。
1: using System;
2:
3: namespace Sample006
4: {
5: enum Era : byte
6: {
7: Meiji,
8: Taisho,
9: Showa,
10: Heisei
11: }
12: class Class1
13: {
14: [STAThread]
15: static void Main(string[] args)
16: {
17: Console.WriteLine( (byte)Era.Meiji );
18: Console.WriteLine( (byte)Era.Taisho );
19: Console.WriteLine( (byte)Era.Showa );
20: Console.WriteLine( (byte)Era.Heisei );
21: }
22: }
23: }
これを実行するとFig.16-6のようになる。
ここでのポイントは5行目にある。列挙型の名前を書いた直後にコロン記号(:)を置いて、その後に使用したい数値型を書くことである。これにより、Era型はbyte型の整数で内部処理されるようになる。
16-7 privateな列挙型
列挙型の宣言には、クラスと同じように、privateなどのキーワードを付けて利用範囲を制限することができる。List 16-7はそれを実際に記述した例である。
1: using System;
2:
3: namespace Sample007
4: {
5: class Class2
6: {
7: private enum Era
8: {
9: Meiji,
10: Taisho
11: }
12: public static void WriteMeiji()
13: {
14: Console.WriteLine( Class2.Era.Meiji );
15: }
16: }
17: class Class1
18: {
19: enum Era
20: {
21: Showa,
22: Heisei
23: }
24: [STAThread]
25: static void Main(string[] args)
26: {
27: // Console.WriteLine( Class2.Era.Meiji ); // 'Sample007.Class2.Era' はアクセスできない保護レベルになっています。
28: Class2.WriteMeiji();
29: Console.WriteLine( Class1.Era.Showa );
30: }
31: }
32: }
これを実行するとFig.16-7のようになる。
ここでのポイントは、2つのEra型が定義されていることだ。1つは7〜11行目、もう1つは19〜23行目だ。7〜11行目のEra型はClass2クラスの中で宣言され、privateキーワードが付いているので、クラス外からは利用できない。実際、27行目のようなコードを書くと、「エラー 'Sample007.Class2.Era' はアクセスできない保護レベルになっています。」というエラーになり、コンパイルできない。しかし、14行目のように、同じクラス内からは問題なく利用することができる。
Copyright© Digital Advantage Corp. All Rights Reserved.