🚩 الگوی [Flags] Enum در #C: مدیریت چندین گزینه با بیتها
تو پست قبلی با Enumهای استاندارد آشنا شدیم. اما اگه بخوایم یه متغیر بتونه ترکیبی از چند عضو Enum رو همزمان نگه داره چی؟ مثلاً دسترسیهای کاربر (خواندن، نوشتن، حذف کردن).
اینجاست که الگوی قدرتمند [Flags] وارد میشه.
1️⃣ [Flags] چیست و کی بهش نیاز داریم؟
[Flags]
یه اتریبیوته که به کامپایلر و ابزارها میگه اعضای این Enum رو میشه با هم مثل پرچمهای مختلف ترکیب کرد. این برای مدیریت گزینهها (options)، دسترسیها (permissions) یا هر وضعیتی که میتونه چند حالت همزمان داشته باشه، عالیه.
2️⃣ نحوه پیادهسازی: قدرت اعداد توان ۲
کلید اصلی این الگو، مقداردهی اعضا با توانهای ۲ هست (1, 2, 4, 8, 16, ...). این کار باعث میشه هر عضو، نماینده یک بیت منحصر به فرد در یک عدد باشه و بتونیم اونها رو بدون تداخل با هم ترکیب کنیم.
[Flags] // این اتریبیوت مهمه!
public enum BorderSides
{
None = 0,
Left = 1, // 2^0
Right = 2, // 2^1
Top = 4, // 2^2
Bottom = 8, // 2^3
// میتونیم ترکیبات رایج رو هم از قبل تعریف کنیم
LeftRight = Left | Right,
All = Left | Right | Top | Bottom
}
3️⃣ کار با Flags: عملگرهای بیتی
برای کار با Flags، از عملگرهای بیتی (Bitwise Operators) استفاده میکنیم:
🔹️ | (OR):
برای اضافه کردن یا ترکیب کردن چند فلگ.
🔹️ & (AND):
برای چک کردن اینکه آیا یه فلگ خاص در مجموعه وجود داره یا نه.
🔹️ ^ (XOR):
برای حذف کردن (toggle) یک فلگ اگه وجود داشته باشه.
// ترکیب کردن دو فلگ
BorderSides leftRight = BorderSides.Left | BorderSides.Right;
// چک کردن وجود یک فلگ
if ((leftRight & BorderSides.Left) != 0)
{
Console.WriteLine("Includes Left"); // اجرا میشه
}
// حذف یک فلگ
leftRight ^= BorderSides.Left; // حالا فقط Right باقی میمونه
// جادوی ToString() با اتریبیوت [Flags]
Console.WriteLine(leftRight.ToString()); // خروجی: Right
اگه اتریبیوت
[Flags] رو نذارید، ToString() به جای اسم اعضا، مقدار عددی اونها رو برمیگردونه.🤔 حرف حساب و تجربه شما
الگوی [Flags] یکی از اون ترفندهای کلاسیک و قدرتمند #C هست که به شما اجازه میده با حجم کمی از داده، اطلاعات زیادی رو به صورت بهینه مدیریت کنید.
🔖 هشتگها:
#CSharp #DotNet #Enum #Flags #Bitwise