スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

C#文法リファレンス - 列挙型

概要
 値に名前を付けた特別な型を定義します。

日常でたとえると
 日本では1月~12月の事を、睦月、如月、弥生、卯月、皐月、水無月、文月、葉月、長月、神無月、霜月、師走と呼ぶときがあります。これが、列挙型のイメージに近いです。

使用に適した状況
 値に何らかの名前を付けたい場合。プログラミングではそうした状況が多々あります。例えば、状態や年号に名前を付けるときに使用します。

サンプル

/*----------------------------------------------------
 * 
 *  列挙型
 *  
 ----------------------------------------------------*/
using System;

//整数型を基になる型として使用できる
enum ByteEnum : byte { Piyo }

//デフォルトでintとなる
enum intEnum 
{
    //値を明示できる
    //明示しない場合は、自動的に0から割り振られる
    One,
    Two,
    Three,
    Ten = 10
}

static class Sample
{
    //拡張メソッドでメソッドを追加できる
    static void Hello( this ByteEnum value )
    {
        Console.WriteLine( "ハロー{0}", value );
    }

    static void Main()
    {
        //基底となる型を取得できる
        Console.WriteLine(
            typeof( intEnum ).Name + "の規定型は" +
            Enum.GetUnderlyingType( typeof( intEnum ) ) );
        Console.WriteLine( );

        //列挙型の名前を取得できる
        Console.WriteLine( 
            typeof( intEnum ).Name + "で指定されている名前は・・・" );
        foreach ( string name in Enum.GetNames( typeof( intEnum ) ) )
            Console.Write( name + " " );
        Console.WriteLine( System.Environment.NewLine );

        //列挙型の値を取得できる
        Console.WriteLine( 
            typeof( intEnum ).Name + "で指定されている値は・・・" );
        foreach ( int val in Enum.GetValues( typeof( intEnum ) ) )
            Console.Write( val + " " );
        Console.WriteLine( System.Environment.NewLine );

        //列挙型は型なので、Cとは違い厳密な型判定が行われる
        byte b = ( byte ) ByteEnum.Piyo; //明示的に変換しなければならない
        Console.WriteLine( "値を表示:{0}", b );
        Console.WriteLine( "名前を表示:{0}", ( ByteEnum ) b );
        Console.WriteLine( );

        //拡張メソッドを使用する
        ByteEnum piyo = ( ByteEnum ) b;
        piyo.Hello( );

        //終了
        Console.ReadLine( );
    }
}


文法
 enumキーワード、名前、値をこの順に指定します。既定でint型から派生しますが、他の整数型を指定することもできます。

解説
 プログラミングでは昔から、値に名前を付けていました。特にC言語プログラミングでは、エラーを表わす定数、年号を表わす定数など、様々なものを、値で表現していました。理由は、プログラミング上、数値として扱った方が便利だからです。
 しかしながら、昔はマクロや定数などで名前と値の対応を管理していたため、保守性や拡張性に問題が生じていました。さらに、数値として扱うとエラーを起こしやすいという問題もありました。
 C#の列挙型にはそういう既存の問題はありません。厳密に型付けされていますので、エラーを起こす前にコンパイラが教えてくれます。また、型情報があるので、名前と値を動的に取得することができます。これは従来の方法ではできない事でした。
 ただ、列挙型には1つ問題があります。それは、メンバーが定義できない事です。Javaの列挙型はクラスなので、様々なことができます。それと同様の事をしたければ、C#では値型を使用しなければなりません。ですが、メソッドと関連付けできれば便利な場面があるのも確かです。
 C#3.0以降この問題は解決されました。拡張メソッドを併用すれば、メソッドを定義したように見えます。ほんらい列挙型は、値と名前を対応付けするものなので、ドメインに依存しがちなメソッドを拡張メソッドで解決するのはうまい方法です。
 列挙型は名前と値を関連付ける単純なオブジェクトです。もし、メンバーを定義して色々な事をしたければ、値型を使用しましょう。
スポンサーサイト

テーマ : プログラミング
ジャンル : コンピュータ

コメントの投稿

非公開コメント

プロフィール

インドリ

Author:インドリ
みなさん、はじめまして、
コンニチハ。

ボクは、無限の夢(infinity dream)を持つネタ好きな虹色の鳥インドリ(in dre)です。
色々な情報処理技術を啄ばむから楽しみにしてね。

http://twitter.com/indori
は別人による嫌がらせ行為です。
私とは関係ないので注意して下さい。
次はなりすましブログなどをするかもしれませんが、ここ以外でブログをするつもりがないので、ここ以外にインドリのブログがあったとしても無視してください。


何度言っても分からない人がいるので、ここにコメント欄へ書き込むときの注意事項を書きます。


一、社会人としてのマナーをわきまえましょう。
一、妄想に基づく書き込みを止めてください。
一、暴言の類は書かないで下さい。
一、某誹謗中傷サイトの書き込みは彼らの妄想に基づく書き込みですから無視して、ここへ書き込まないで下さい。
一、コメント書く前に他のコメントよく読んでから行って下さい。
一、言いがかかり等の行為を禁止します。
一、その他常識的に考えて迷惑なコメントはしないで下さい。


以上のルールを守れない人のコメントは削除します。



利用上の注意
ここに紹介してある文章およびプログラムコードは正確であるように心がけておりますが、内容を保証するものではありません。当サイトの内容によって生じた損害については、一切の責任を負いませんので御了承ください。


執筆したCodeZineの記事


【VB.NETで仮想CPUを作ろう】

  1. VB.NETで仮想CPUを作ろう
  2. レジスタの実装
  3. 仮想CPUのGUI化
  4. テストドライバの改良
  5. CPUの基礎動作の実装
  6. MOV命令の実装
  7. ADD命令実装
  8. SUB命令実装
  9. INC命令&DEC命令の実装と命令長
  10. MLU命令の実装とModR/Mについて
  11. DIV命令の実装とイベント設計について
  12. 機械語駆動式 関数電卓を作ろう!
  13. 機械語駆動式 関数電卓を作ろう! 解答編(前半)
  14. 機械語駆動式 関数電卓を作ろう! 解答編(後半)


【仮想ネットワーク実装でTCP/IPを学ぼう】
  1. TCP/IPの基礎と勘所
  2. ネットワークアクセス層の勘所
  3. インターネット層の勘所
  4. トランスポート層の勘所
  5. アプリケーション層の勘所
  6. セキュリティの基礎と仮想ネットワークの仕様
  7. GDI+と独自プロトコルの定義



【並列化】
インテル Parallel Studioを使って並列化プログラミングを試してみた
並列プログラミングの効率的なデバッグを実現する「Parallel Inspector」


【TBBシリーズ】
  1. インテル スレッディング・ビルディング・ブロックの概要
  2. インテルTBBから学ぶループの並列化
  3. スレッドセーフとインテルTBBのコンテナ
  4. インテルTBBのスレッドクラス


【OpenMPシリーズ】
  1. OpenMPの基礎構文
  2. OpenMPの実行時ライブラリと並列ループ
  3. OpenMPのメモリモデルとfork- joinモデル

最近の記事
最近のコメント
月別アーカイブ
カテゴリ
Ada (9)
COBOL (5)
C (9)
C++ (11)
C# (370)
D (25)
Java (8)
Perl (1)
Ruby (14)
PHP (2)
Boo (2)
Cobra (2)
LISP (6)
F# (33)
HTML (0)
XHTML (0)
CSS (0)
XML (0)
XSLT (0)
Scala (4)
WPF (0)
WF (2)
WCF (0)
LINQ (4)
MONO (5)
Linux (0)
MySQL (0)
ブログ内検索
リンク
最近のトラックバック
RSSフィード
ブロとも申請フォーム

この人とブロともになる

QRコード
FC2カウンター
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。