attributes
FileAttributes
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.
Enum.HasFlag kullanın (https://msdn.microsoft.com/en-us/library/system.enum.hasflag%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396). – Andrew
[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. –
Bu cevabı benzer bir soruya bakın. Çok iyi yazılmış IMO. http://stackoverflow.com/a/1769814/1260204 – Igor