Enum Bit Flags: Bayrak Kombinasyonları Güvenli Şekilde Kullanma
Bir nesnenin birden fazla özelliğini aynı anda tutmak gerektiğinde enum bit flags kullanılır. Örneğin bir dosyanın okuma, yazma ve çalıştırma izinleri ya da bir oyun karakterinin aktif durumları (yürüyor, atılıyor, hasar alıyor) gibi. Bit flags doğru yapılmadığında kombinasyonlar çakışır, kontrol işlemleri hata verir.
Bit flags güvenli kullanmanın anahtarı [Flags] attribute'ü ve 2'nin kuvvetleri ile tanımlamaktır.
1using System;23[Flags]4public enum FilePermissions5{6None = 0,7Read = 1, // 2^08Write = 2, // 2^19Execute = 4, // 2^210Delete = 8 // 2^311}1213class Program14{15static void Main()16{17// Bayrakları birleştirme (bitwise OR)18FilePermissions perms = FilePermissions.Read | FilePermissions.Write;19Console.WriteLine($"İzinler: {perms}");20// Çıktı: İzinler: Read, Write2122// Bir bayrağın var olup olmadığını kontrol etme23if ((perms & FilePermissions.Read) == FilePermissions.Read)24Console.WriteLine("Okuma izni var");2526if ((perms & FilePermissions.Execute) == FilePermissions.Execute)27Console.WriteLine("Çalıştırma izni var");28else29Console.WriteLine("Çalıştırma izni yok");3031// Bayrak ekleme32perms |= FilePermissions.Execute;33Console.WriteLine($"Execute eklendikten sonra: {perms}");34// Çıktı: Execute eklendikten sonra: Read, Write, Execute3536// Bayrak kaldırma37perms &= ~FilePermissions.Write;38Console.WriteLine($"Write kaldırıldıktan sonra: {perms}");39// Çıktı: Write kaldırıldıktan sonra: Read, Execute4041// Bayrak toggle etme (var ise kaldır, yoksa ekle)42perms ^= FilePermissions.Delete;43Console.WriteLine($"Delete toggle: {perms}");44// Çıktı: Delete toggle: Read, Execute, Delete4546// Tüm bayrakları kontrol47if (perms == FilePermissions.None)48Console.WriteLine("Hiç izin yok");49else50Console.WriteLine($"Toplam {perms.ToString().Split(',').Length} izin aktif");51}52}Önemli noktalar: Enum değerleri her zaman 2'nin kuvveti olmalı (1, 2, 4, 8, 16...). [Flags] attribute'ü yazmayı unutma; aksi halde kombinasyonlar anlaşılmaz görünür. Kontrol işleminde HasFlag() metodu da kullanabilirsin: perms.HasFlag(FilePermissions.Read). Bu daha okunabilir ve güvenlidir.
Bayrak kombinasyonları için bileşik sabitler de tanımlanabilir: ReadWrite = Read | Write. Böylece sık kullanılan kombinasyonları tekrar yazmaktan kurtulursun.
Bit işlemleri (|, &, ~, ^) hızlı olduğu için performans kritik alanlarda ideal seçimdir. Ancak başlangıçta kafası karışanlar için HasFlag() yeterince açık ve yeterlidir.
0 yorum