2011-10-26 14 views
7

ハードウェアからいくつかのビットフィールドを受け取っています。フラグ列挙型の賛否両論は何ですか?

私のコードは、もともと:

public readonly byte LowByte; 

public bool Timer { get { return (LowByte & 1) == 1; } } 

は、それから私は、フラグ列挙型を思い出しし、それを変更すること検討しています:ように

[Flags] 
public enum LowByteReasonValues : byte 
{ 
    Timer = 1, 
    DistanceTravelledExceeded = 2, 
    Polled = 4, 
    GeofenceEvent = 8, 
    PanicSwitchActivated = 16, 
    ExternalInputEvent = 32, 
    JourneyStart = 64, 
    JourneyStop = 128 
} 

public readonly LowByteReasonValues LowByte; 

public bool Timer { get { return (LowByte & LowByteReasonValues.Timer) == LowByteReasonValues.Timer; } } 

と。

どちらがベストプラクティスであり、それぞれのアプローチの賛否両論があればどうでしょうか?

EDIT:特にパフォーマンスに関して2つのアプローチの間に実用的な違いがあるかどうかを知りたいと思っています。私は、(Microsoftのガイドラインにない限り)コーディングスタイルに関する意見を求めることは望ましくない。なぜなら、質問が非構造的なものとして閉じられるからだ。ありがとう。それは非常に少なくとも

+0

このコードを消費する開発者の視点から見てください。単体テストを書くことはそれを行う良い方法です。例(コードサンプル)を書くことも別です。どのようにすれば、開発者は最も明確なコードを書くことができますか?どちらの方法でクライアント開発者にとって最も直感的でしょうか? – TrueWill

答えて

1

コードをより読みやすくなりますので、

5

後には、あなたの第二の例は、よりよい意味を持っているし、コード内のビットの意味を示し、ベストプラクティスです。そのビットが何のために使われているかのコード内にいくつかの文書があります。

それ以外の場合は、最初の例に基づいて、基本的には魔法(ビット)番号を詰まらせるのでコメントを追加する必要があります。たとえあなたがこのコードを6ヶ月間維持しているとしても、どのビット5が使用されたのかを覚えるのは難しいかもしれません。

4

.NET 4.0を使用している場合は、HasFlagメソッドを使用して、列挙型に特定のビットが含まれているかどうかを確認できるようになりました。これにより、以前の検査方法よりも読みやすくなります。

[Flags] 
public enum LowByteReasonValues : byte 
{ 
    Timer = 1, 
    DistanceTravelledExceeded = 2, 
    Polled = 4, 
    GeofenceEvent = 8, 
    PanicSwitchActivated = 16, 
    ExternalInputEvent = 32, 
    JourneyStart = 64, 
    JourneyStop = 128 
} 

public readonly LowByteReasonValues LowByte; 

public bool Timer 
{ 
    get 
    { 
    return (LowByte.HasFlag(LowByte.Timer)); 
    } 
} 

さらに詳しい情報はMSDNです。

+0

おっと...ありがとう。私は.NET 4.0を使用していますが、その機能は以前私のレーダーには届いていませんでした。 –

+0

残念ながら、(MSDNページのユーザコメントから)少なくともそれは遅いと思われます。恥! –

+0

@StephenKennedy:注目されていますが、問題が発生し始め、コードが非常に重要なパフォーマンスを発揮する場合は、心配しておきます。途中で何かを最適化する必要はありません。 –

関連する問題