2009-02-26 12 views
0

にint型のオーバーライド:私はこのように見えたいくつかの.NET 2.0のコードを見たビット列挙

public enum abc : int 
{ 
    value1 = 1, 
    value2 = 2, 
    value3 = 4 
} 

などを...

今私は(フラグ列挙型はビット値のために使用することができます知っているように上記、そう?)そうすることができます| "または" &など、しかし、それを使用しない理由は何ですか? intをオーバーライドする際のポイントは何ですか?

複数の値を選択するための列挙型を設計する場合は、フラグ属性を使用し、何も上書きしないでください(私が理解できないもの)。上記のアプローチは何を網羅していますか?

おかげ

答えて

9

intは「オーバーライド」されていません。これは、列挙の基になるタイプを示しています。デフォルトでは、それだけで、これは実際には何も達成していないが、いくつかのケースでは、あなたがより多くのフラグを格納するlongに列挙型をベースにするかもしれない、またはbyte周り列挙型の非常に多くのインスタンスが存在することになる場合はスペースを節約し、intですいくつかの値がありますが、フレームワーク設計ガイドラインの推奨事項はintを使用することです。

フラグの列挙型である場合は、[Flags]というマークを付ける必要があります。これはここでの意図であるように見えるので、間違いのように見えます。 [Flags]でマークされていなくてもビット単位の演算子を使用して値を組み合わせることはできますが、メモリからはコンパイラの警告が表示されます(または、FxCop警告、またはReSharper警告が出る可能性があります)。

2

ザ・「:intは」列挙値のための基になる型として使用するものを指定しています。ここではchar以外の整数型を使用できます。デフォルトはintなので、この場合は冗長です。

0

私は何の利益もありません。おそらくプログラマーの面での経験の欠如。

2

FlagsAttributeは、この列挙型のフィールドを組み合わせることができることをユーザーに通知します。列挙型のフィールドを実際に「フラグ設定可能な」値に設定するわけではありません。これは、あなたがすでに持っているのと同じように、あなた自身で行う必要があります。

0

あなたが特定の値を選択するためのシナリオを求めているならば、私はぶっきらぼう良い例を知らないが、私は

enum Color = { 
    Red = 0xFF0000, 
    Green = 0x00FF00, 
    Blue = 0x0000FF } 

は多分有用であるようなものを想像することができます。わずか1ホットエンコーディングを使用してのために1ホットエンコーディングを使用するように非フラグ列挙型の値を設定

0

は本当にどんな意味がありません。私は将来あなたがFlags enumにするかもしれないと思ったらそれは意味をなさないかもしれないと思います。それ以外の場合は、値をオーバーライドしたり、その意味に基づいて値を割り当てたりする必要があります(例:Color.Red = 0xFF0000)。参照する

0

:基になる型を指定する「INT」は、私がいることを見たら、私は周りを見て必要があるだろうし、彼らはそのようにすべての列挙型をdelcareかどうかを確認します。もしそうなら、彼らはたぶんそのようにenumを書くことを学んだだけかもしれません(あるいは、おそらく彼らはハイパー・リバーサル・コーダーです)。しかし、この列挙型がこのように宣言されたのであれば、おそらくプログラマはこれが根本的な "int"型を持つことが重要であると言うことをコメントしているかもしれません。おそらく、それはバイナリシリアライズされているか、どこかでデシリアライズされています。

[Flags]属性に関しては、C#に関する限り、[Flags]で宣言されたものだけでなく、任意の列挙型でビット単位の演算子を使用できます。上記の例では、[Flags]が指定されていないため、以下は完全に合法です。

abc myAbcValue = value1 | value2;

[Flags]の主な違いは、EnumのToString()およびParse()メソッドにあります。 [Flags]を指定しない場合、myAbvValue.ToString()は "3"を返しますが、[Flags]を使用すると "value1、value2"が返されます。同様に、[Flags]で、

abc yourAbcValue =(abc)Enum.Parse(typeof(abc)、 "value1、value2");

列挙のIsDefined()メソッド(すなわち3

注にyourAbcValueの基本値を設定しますが)ので、[フラグ]列挙型との複数の値を許可しない:

Enum.IsDefined (typeof(abc)、 "value1、value2")

は[Flags]の使用に関係なくfalseを返します。

また、[Flags]は任意のリフレクションアクセスに関する情報を提供し、他の言語はフラグ付き列挙型の制限を通常の列挙型とは異なる方法で処理することがあります。

関連する問題