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;
2
3[Flags]
4public enum FilePermissions
5{
6None = 0,
7Read = 1, // 2^0
8Write = 2, // 2^1
9Execute = 4, // 2^2
10Delete = 8 // 2^3
11}
12
13class Program
14{
15static void Main()
16{
17// Bayrakları birleştirme (bitwise OR)
18FilePermissions perms = FilePermissions.Read | FilePermissions.Write;
19Console.WriteLine($"İzinler: {perms}");
20// Çıktı: İzinler: Read, Write
21
22// Bir bayrağın var olup olmadığını kontrol etme
23if ((perms & FilePermissions.Read) == FilePermissions.Read)
24Console.WriteLine("Okuma izni var");
25
26if ((perms & FilePermissions.Execute) == FilePermissions.Execute)
27Console.WriteLine("Çalıştırma izni var");
28else
29Console.WriteLine("Çalıştırma izni yok");
30
31// Bayrak ekleme
32perms |= FilePermissions.Execute;
33Console.WriteLine($"Execute eklendikten sonra: {perms}");
34// Çıktı: Execute eklendikten sonra: Read, Write, Execute
35
36// Bayrak kaldırma
37perms &= ~FilePermissions.Write;
38Console.WriteLine($"Write kaldırıldıktan sonra: {perms}");
39// Çıktı: Write kaldırıldıktan sonra: Read, Execute
40
41// Bayrak toggle etme (var ise kaldır, yoksa ekle)
42perms ^= FilePermissions.Delete;
43Console.WriteLine($"Delete toggle: {perms}");
44// Çıktı: Delete toggle: Read, Execute, Delete
45
46// Tüm bayrakları kontrol
47if (perms == FilePermissions.None)
48Console.WriteLine("Hiç izin yok");
49else
50Console.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.

Reklam · TEST
AdSense Test ReklamıYazı arası (gönderi içi) · Yazı arası

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.

Reklam · TEST
AdSense Test ReklamıGönderi altı · Görüntülü
konu hakkında tepkinizi verebilirsiniz