R.Tanaka.Ichiro's Blog

主にC# な話題です

目次

Blog 利用状況

ニュース

列挙型を使う(その6)

列挙型を使う
http://blogs.wankuma.com/rti/archive/2007/03/12/66244.aspx

列挙型を使う(その2)
http://blogs.wankuma.com/rti/archive/2007/03/13/66420.aspx

列挙型を使う(その3)
http://blogs.wankuma.com/rti/archive/2007/03/14/66719.aspx

列挙型を使う(その4)
http://blogs.wankuma.com/rti/archive/2007/03/15/66903.aspx

列挙型を使う(その5)
http://blogs.wankuma.com/rti/archive/2007/03/16/67099.aspx

の続きです。

C# で列挙型の実値の型を明示する場合は、以下のように記述します。


public enum 血液型 : short { A, B, O, AB }


しかし、偉い人(W同盟で言う所の N さんとか Jねっとさんみたい立場の人)が、以下のように言ったとしましょう。

「実際の値と表記が異なった場合、重大な問題が生じる(詳細は、その5を参照)ため、実際の値も文字列として記録したい。」

そこで、何も考えずに変更してみます。


public enum 血液型 : string { A, B, O, AB }


すると、エラー一覧に、以下のエラーが表示されてしまいました。


「byte、sbyte、short、ushort、int、uint、long または ulong のいずれかの型を使用してください。」


つまりは・・・・上記のエラーの通りなのです。上記の型以外は、列挙型で取り扱うことができません。

では、列挙型と同様なものを自分で書くとするとどうでしょうか?


public sealed class 血液型 {
  public const string A = "A";
  public const string B = "B";
  public const string O = "O";
  public const string AB = "B";
}


これで、列挙型と似たような使い方ができる筈です。
つまりは、列挙型で取り扱えない型の場合、文字型に限らず、上記のように記述すれば良いということになります。

 

あれ?

 

ちょっと待って下さい。間違ってますよね?
ものがものだけに、相変わらず危険過ぎる間違いですw(いや、笑ってる場合じゃないですし)

さて、列挙した名前と実際の値として定義される文字列が常に同じことを保証することはできないものでしょうか。

・・・実は、.Net でプログラミングを開始したばかりの頃、僕が実際に持った疑問でした。
以下は、その質問を投げかけた掲示板へのリンクです。

http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?mode=viewtopic&topic=29612&forum=7&start=0

その疑問を見事に解決して下さったのが、じゃんぬねっとさんでした
(あの頃は優しかったな・・・遠い目)

上記のリンクを読んでいただくと、その経緯がわかります。

また、ご自身のブログにもわかりやすくまとめて下さっています。

http://blogs.wankuma.com/jeanne/archive/2006/04/04/22239.aspx

これを読むと、答えは一目瞭然でしょう。
(ジェバンニが一晩でやってくれました)答えは、リフレクションにありました。

しかも、リフレクションを使えば Enum と似たようなメソッドを実装することもできそうです。

#ちなみに、ここ最近のネタの提供(本当に提供なのか?)もじゃんぬねっとさんなのでした。
#いつもお世話になっております 
<(_*_)>

投稿日時 : 2007年3月19日 10:02

Feedback

# re: 列挙型を使う(その6) 2007/03/19 10:27 じゃんぬねっと

業務系をやっていないと使い道はなかったりします。
私は表などのヘッディング定義で使うことが多いですが。

例の血液型だと実際には DB と関連付けることが多いので、文字列で扱うことはないでしょうね。

# ところで、今も優しいですよ。

# re: 列挙型を使う(その6) 2007/03/19 11:11 R・田中一郎

じゃんぬねっと さん

>例の血液型だと実際には DB と関連付けることが多いので、文字列で扱うことはないでしょうね。

確かに、僕も文字列にはしません。
ちょっと強引な事例でしたね。

># ところで、今も優しいですよ。

ごめんなさい。これは、誤解を招いてしまう表現でした。
じゃんぬねっとさんは、今も優しくて爽やかな方です。

タイトル  
名前  
Url
コメント