2013-03-15 41 views
18

Yok (0) değeri için de geçerlidir döndürür:HasFlags hep bu enum tanımıdır enum

Şimdi

, aşağıdaki kod verilmiş, neden değer Animals.None için HasFlag yöntemi dönüş doğrudur yapar?

Animals myAnimals = Animals.Dog | Animals.Horse; 

var hasNone = myAnimals.HasFlag(Animals.None); //true! Why? 
var hasCat = myAnimals.HasFlag(Animals.Cat);  //false 
var hasDog = myAnimals.HasFlag(Animals.Dog);  //true 
var hasHorse = myAnimals.HasFlag(Animals.Horse); //true 
var hasZebra = myAnimals.HasFlag(Animals.Zebra); //false 

cevap

19

HasFlag etkili bir şudur: Bu her zaman sıfır değer enum-alan için geçerli olacak

var hasNone = (myAnimals & Animals.None) == Animals.None 

:

HasFlag = (GivenFlag & Value) == GivenFlag; 

//"Anything" AND 0 == 0 --> always true 
0

Eh Enum.HasFlags aşağıdaki gibi bir şey olarak giderir. MSDN

HasFlag yöntemi kaynaktan

0

aşağıdaki mantıksal ifadenin sonucunu verir.

thisInstance And flag = flag 
0

Bu HasFlag yöntemin sadece tanımlanmış bir davranıştır. MSDN belgelerinde

bayrağın altında yatan değeri sıfırsa itibaren yöntem kendime önce buna karşı geldim

6

true döndürür. Bu tasarım, .NET Framework: Tasarım:

Grafiğin altında yatan değer sıfır ise, yöntem true değerini döndürür. Bu davranış istenmiyorsa, eşitlik için sıfırı sınamak için Eşit yöntemini kullanabilir ve aşağıdaki örnekte gösterildiği gibi yalnızca bayrağı temel değerinin sıfır olmaması durumunda HasFlag'i kullanabilirsiniz.

Burada MSDN makalesinde bu konuda biraz daha okuyabilir

: http://msdn.microsoft.com/en-GB/library/system.enum.hasflag.aspx

2

Orada Böyle NEDEN açıklayan cevaplar bir bolluk zaten, yani ne elde için yapabilecekleriniz sadece o katacak Bu durumda HasFlag kullanmak değil, bunun yerine var hasNone = myAnimals == Animals.None yapın.

Kişisel olarak gerçekten uzantı yöntemlerini seviyorum, ancak gerçekten yazabilmeyi gerçekten hak ediyorsanız bunu Enum uzantısına koymak mümkün olabilir. Yine de bu özel durumda None değerini açıkça kontrol ederek çalışıyorum.