.NET'in yerleşik bayrak numaralandırma işlemleri maalesef oldukça sınırlıdır. Çoğu zaman kullanıcılar bitsel işlem mantığını bulmakla kalırlar.
.NET 4'te, kullanıcı kodunu basitleştirmeye yardımcı olan yöntem HasFlag
eklendi, Enum
ancak maalesef bununla ilgili birçok sorun var.
HasFlag
yalnızca belirtilen numara türünü değil, her tür numara değeri bağımsız değişkenini kabul ettiğinden tür güvenli değildir.
HasFlag
değerin, enum değeri bağımsız değişkeni tarafından sağlanan tüm bayraklara sahip olup olmadığını kontrol edip etmediği belirsizdir. Bu arada.
HasFlag
ayırmaya ve dolayısıyla daha fazla çöp koleksiyonuna neden olan boks gerektirdiğinden oldukça yavaştır.
Kısmen .NET'in bayrak numaraları için sınırlı desteği nedeniyle , bu sorunların her birini ele alan ve bayrak numaraları ile uğraşmayı daha kolay hale getiren OSS kütüphanesi Enums.NET'i yazdım .
Aşağıda, .NET çerçevesini kullanarak eşdeğer uygulamaları ile birlikte sağladığı işlemlerden bazıları verilmiştir.
Bayrakları Birleştir
.AĞ flags | otherFlags
Enums.NET flags.CombineFlags(otherFlags)
Bayrakları Kaldır
.AĞ flags & ~otherFlags
Enums.NET flags.RemoveFlags(otherFlags)
Ortak Bayraklar
.AĞ flags & otherFlags
Enums.NET flags.CommonFlags(otherFlags)
Bayrakları Aç / Kapat
.AĞ flags ^ otherFlags
Enums.NET flags.ToggleFlags(otherFlags)
Tüm Bayraklara Sahip
.NET (flags & otherFlags) == otherFlags
veyaflags.HasFlag(otherFlags)
Enums.NET flags.HasAllFlags(otherFlags)
Bayrakları Var
.AĞ (flags & otherFlags) != 0
Enums.NET flags.HasAnyFlags(otherFlags)
Bayrakları Alın
.AĞ
Enumerable.Range(0, 64)
.Where(bit => ((flags.GetTypeCode() == TypeCode.UInt64 ? (long)(ulong)flags : Convert.ToInt64(flags)) & (1L << bit)) != 0)
.Select(bit => Enum.ToObject(flags.GetType(), 1L << bit))`
Enums.NET flags.GetFlags()
Bu geliştirmeleri .NET Core ve belki de sonunda tam .NET Framework içine dahil etmeye çalışıyorum. Sen benim önerisini kontrol edebilirsiniz burada .