SORU
12 AĞUSTOS 2008, Salı


[Bayraklar] Numaralama Özniteliği C ne anlama geliyor#?

Zaman zaman aşağıdaki gibi bir sıralama görüyorum

[Flags]
public enum Options 
{
    None    = 0,
    Option1 = 1,
    Option2 = 2,
    Option3 = 4,
    Option4 = 8
}

[Flags]-öznitelik ne yaptığını anlamıyorum.

Herkes iyi bir açıklama ya da yazı olabilir örnek?

CEVAP
12 AĞUSTOS 2008, Salı


Flags özniteliği sayısız bayrak koleksiyonu, yerine tek bir değeri temsil eder zaman kullanılmalıdır. Bu koleksiyonlar genellikle bit operatörleri, örneğin kullanarak manipüle

myProperties.AllowedColors = MyColor.Red | MyColor.Green | MyColor.Blue;

Kendisi tarafından [Flags] bunu değiştirmez unutmayınhiç- tüm yapar .ToString() yöntemi ile güzel bir gösterimini etkinleştirin

enum Suits { Spades = 1, Clubs = 2, Diamonds = 4, Hearts = 8 }
[Flags] enum SuitsFlags { Spades = 1, Clubs = 2, Diamonds = 4, Hearts = 8 }

...

var str1 = (Suits.Spades | Suits.Diamonds).ToString();
           // "5"
var str2 = (SuitsFlags.Spades | SuitsFlags.Diamonds).ToString();
           // "Spades, Diamonds"

Ayrıca önemli [Flags] dikkat etmek önemlidirdeğilotomatik olarak iki numaralandırma değerleri güçler olun. Eğer sayısal değerler atlarsanız, varsayılan olarak bir numaralandırma değerleri ve artış 0 ile başlar çünkü bit işlemleri beklemek gibi çalışmaz.

Yanlış beyan:

[Flags]
public enum MyColors
{
    Yellow,
    Green,
    Red,
    Blue
}

Eğer bu şekilde ilan ederse, Sarı olacak değerleri, = 0, = 1, Kırmızı = 2, Mavi = 3 Yeşil. Bu işe yaramaz bir bayrak olarak kullanmak için işlerler.

İşte doğru bir tanımlaması örneği:

[Flags]
public enum MyColors
{
    Yellow = 1,
    Green = 2,
    Red = 4,
    Blue = 8
}

Sen farklı değerleri bir özellik almak için bunu yapabilirsiniz

if((myProperties.AllowedColors & MyColor.Yellow) == MyColor.Yellow)
{
    // Yellow has been set...
}

if((myProperties.AllowedColors & MyColor.Green) == MyColor.Green)
{
    // Green has been set...
}    

ya da, içinde .NET 4 ve daha sonra,

if (myProperties.AllowedColors.HasFlag(MyColor.Yellow))
{
    // Yellow has been set...
}

Yorganın altında

Bu daha önce size numaralandırma iki güç kullanıldığı için çalışır. Bu örtülerin altına böyle bir numaralandırma değerleri görünüyor (1 veya 0'ın hangi 8 bit olan bayt olarak sunulmuştur)

 Yellow: 00000001
 Green:  00000010
 Red:    00000100
 Blue:   00001000

İşletmenizi kurduktan sonra aynı şekildeAllowedColorsKırmızı, Yeşil ve Mavi VEYA boru | tarafından çiğnenmiş değerleri),AllowedColorsbu gibi görünüyor

myProperties.AllowedColors: 00001110

Çok değer almasını aslında bit VE değerleri saptandı

myProperties.AllowedColors: 00001110
             MyColor.Green: 00000010
             -----------------------
                            00000010 // Hey, this is the same as MyColor.Green!

Yok = 0 değeri

Ve ilgili numaralandırma 0 Web sitesini ziyaret alıntı kullanın:

[Flags]
public enum MyColors
{
    None = 0,
    ....
}

Sıfır olan bayrak numaralandırılmış sabit adı olarak kullanım Yok.Sonuç her zaman sıfır olamaz çünkü bir bayrak için Hiçbiri sabit VE test etmek için bir bit işlemi numaralandırılmış kullanın.Ancak, sayısal değer arasında mantıksal bir bit değil, bir karşılaştırma yapabilir ve Hiçbiri sayısal değer herhangi bir biti ayarlanmış olup olmadığını belirlemek için numaralandırılmış sabit.

Flags özniteliği ve msdn designing flags at msdn kullanımı hakkında daha fazla bilgi bulabilirsiniz

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • EEVblog

    EEVblog

    4 NİSAN 2009
  • hanksranger

    hanksranger

    6 EKİM 2009
  • Mega64

    Mega64

    24 ŞUBAT 2006