2011-10-26 16 views
7

Donanımdan birkaç bit alanı alıyorum.Bayrak enumunu kullanmanın artıları ve eksileri nelerdir?

Kodum aslen:

public readonly byte LowByte; 

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

Sonra bayrakları enum hatırladı ve değiştirmeyi düşünüyorum: böylece

[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; } } 

ve.

En iyi uygulama hangisidir ve her bir yaklaşımın artıları ve eksileri nelerdir?

DÜZENLEME: İki yaklaşım arasında, özellikle performans açısından pratik farkların olup olmadığını bilmek istiyorum. Kodlama stilleri üzerine fikir istemek istemiyorum (Microsoft yönergelerinden gelmediği sürece). Teşekkürler. o En azından

+0

Bu kodu kullanan geliştiricinin bakış açısından bakmayı deneyin. Yazma birimi testleri bunu yapmak için iyi bir yoldur; Yazı örnekleri (kod örnekleri) başka bir şeydir. Bu yol, geliştiricinin en net kodu yazmasına izin verir? İstemci geliştiricisi için en uygun yol hangisidir? – TrueWill

cevap

1

kodunuzu daha okunaklı hale getirdiği için

5

daha sonra ikinci örnek daha iyi semantiğini vardır ve kodundaki bit anlamını gösterir, en iyi uygulamadır. Bitin ne için kullanıldığına dair kod içinde bazı belgeler vardır.

Aksi takdirde, ilk örneğinize dayanarak, temelde sihirli (bit) sayıları ikiye katladığınız için yorum eklemeniz gerekir, bu da kodu özellikle daha aşina olmayan başka bir kişi tarafından okunmasını zorlaştırır. Kendinizi altı ay boyunca bu kodu koruyacak olsanız bile, 5'in ne için kullanıldığını hatırlamak zor olabilir.

4

.NET 4.0 kullanıyorsanız, bir enum'un belirli bir bit içerip içermediğini kontrol etmek için HasFlag yöntemini kullanabilirsiniz. Bu, önceki kontrol yönteminden daha da okunabilir hale getirir.

[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)); 
    } 
} 

Daha fazla bilgi için MSDN.

+0

Ooh ... teşekkürler. .NET 4.0 kullanıyorum ama bu işlev daha önce radarıma gelmemişti. –

+0

Maalesef göründüğü gibi (MSDN sayfasındaki kullanıcı yorumuna göre) oldukça yavaş. Utanç! –

+0

@StephenKennedy: Not Edildi, ancak sorunlara neden oluyorsa ve kodunuz son derece yüksek performans açısından kritik önem taşıyorsa sadece endişeleniyorum. Hiçbir şeyi zamanında optimize etmeye gerek yok. –

İlgili konular