2015-09-07 17 views
5

, ben şu kod bakın:Nasıl yapılır ((öznitelikleri ve FileAttributes.Hidden) == FileAttributes.Hidden) {} nasıl çalışır? <a href="https://msdn.microsoft.com/en-us/library/system.io.file.getattributes(v=vs.110).aspx" rel="nofollow">this</a> sayfada

if ((attributes & FileAttributes.Hidden) == FileAttributes.Hidden) 

Ama yoludur neden o olduğunu anlamıyorum.

Neden attributes & FileAttributes.Hidden)? attributes'daki tekil kontrol gerçekte ne yapar? Boş olmadığını kontrol ediyor mu? Bildiğim bir his var ama garip görünüyor. Rastgele ve tuhaf.

+3

Enum.HasFlag kullanın (https://msdn.microsoft.com/en-us/library/system.enum.hasflag%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396). – Andrew

+2

[FileAttributes] (https://msdn.microsoft.com/en-us/library/system.io.fileattributes (v = vs.110) .aspx) sayfasını da okuyun. Türün bir FlagsAttribute özniteliğine sahip olduğunu belirtir; bu, değerin bir değerler kümesinden ziyade mantıksal bayrakların bir koleksiyonu olarak ele alındığı anlamına gelir. Bu, bayrak alanlarını kontrol etmek için mantıksal AND ('&') ve OR ('|') operatotroslarını kullandığınız anlamına gelir. –

+1

Bu cevabı benzer bir soruya bakın. Çok iyi yazılmış IMO. http://stackoverflow.com/a/1769814/1260204 – Igor

cevap

15

Basit bir boole mantığı. Her iki taraf da aynı değere sahipse, == operatörü yalnızca true değerini döndürür. Yani karşılaştırmak istediğiniz bayrakla maskeyiattributes değerine sahip olmalısınız. (Değerler oluşur) bu iki örnekleri dikkate:

doğru:

0010001 // attributes 
& 0000001 // FileAttributes.Hidden 
    ------- 
= 0000001 // FileAttributes.Hidden 

yanlış:

0011000 // attributes 
& 0000001 // FileAttributes.Hidden 
    ------- 
= 0000000 // FileAttributes.None 
3

& bir bit-bazında ve operatördür.

Bu operatör sadece ikilik VE bit 2 takım gerçekleştirir. (|) Ve XOR (özel OR) (^) operatörü ve Operatörün yanında

0 & 0 === 0 
1 & 0 === 0 
0 & 1 === 0 
1 & 1 === 1 

, ayrıca bir ameliyathane mevcuttur.

+1

^bir XOR operatördür, ~ bir DEĞİLDİR. XOR, "her iki bit de her iki bit 1'dir", "Her iki bit de 0 ise" anlamına gelir. – Kevin

4

attributesFileAttributes tiptedir. Bu tür, bir değer türü olan enum'dur. Bu FileAttributes? (Nullable<FileAttributes>) değil, bu nedenle sıfır olamaz.

Her enum adlı değerlerin bir listesini içerir, ancak bunların her biri bazı tamsayı (int) değerlerine dönüştürülebilir Haritalanabilir/olduğunu. Pek çok yerde C# bu dönüşümü ve (biraz) enum değerlerini inters gibi ele almanıza izin verir, ama yine de değildir.

Örneğin, & operatör beklediğiniz gerçekleştirir - bu ikili gerçekleştirir VE. Bu şekilde, enum değeri, tam sayıya dönüştürüldüğünde, ilgili bit (ler) ayarlanmışsa, sıfırdan farklı bir sonuç elde edersiniz. Bazı bayraklar/bitleri bazı durum değeri varsa kontrol etmeyi bir "eski güzel yolu" olarak

. Bayrağın ayarlanmış olup olmadığını kontrol eden foo & FLAG != 0 gibi ifadeleri veya bu ikisinden herhangi birinin ayarlanıp ayarlanmadığını kontrol eden ifadesini görebilirsiniz. Bu biraz kusurlu/tehlikeli çünkü birisi FLAG'i bir bitden fazla değiştirirse, bu tür ifadeler, HERHANGİ bir bitin ayarlanıp ayarlanmadığını kontrol ederdi, tüm bu "çok bitli bayrak" ayarlanmışsa değil. Bu nedenle, genellikle bit maskesini uygulayan ve sonucun bit maskesi olup olmadığını kontrol eden foo & FLAG == FLAG'u da görebilirsiniz. Bu nedenle, tüm maske bitlerinin ayarlanıp ayarlanmadığını kontrol eder.

Burada, sizin durumunuzda sadece bu. Bu ifadede, aynı maske ile ANDING ve COMPARING iseniz, maskenin TÜM biti ayarlanmış olup olmadığını kontrol ediyorsunuz. Ancak FileAttributes açıkça [Flags] olarak işaretlendiğinden gereksizdir, Hidden değeri sadece bir bittir, bu yüzden! = 0 yeterli olur.

Ancak, bu tür durumlarda size, çoğu insan bu gibi durumlarda şekilde tasarlandığından beri, kullanmak bildirecektir Enum.HasFlag yöntemini kullanmayı deneyebilirsiniz (bayrakları, değil fantezi bitsel maskeleri kontrol) 'de;)

Bu Ancak her zaman en iyi seçim değildir. bakınız: bu performans maliyeti size bir sorun olurdu ben sürpriz olurdu ..ama

. Bu noktaya optimizasyon çok nadiren gereklidir.