理解 C# 設置標誌枚舉:指派標誌
在使用C#處理權限、配置或設定時,我們經常遇到需要將多個值存儲在單個變數中的情況。 我們可以使用Flag Enums來替換為每個設定使用單獨的布林值。 此方法利用二進制運算來高效地在單個整數值中管理多個選項。
在本文中,我們將基於Tim Corey的影片Binary in C#: Assigning Flags in 10 Minutes or Less來深入探討如何在C#中設置Flag Enums。 Tim演示了如何使用二進制運算分配多個值,使我們的代碼更高效且可讀。 讓我們開始探索。
Flag Enums介紹
Tim首先解釋這堂課程是C#二進制理解系列的一部分。 在這段視頻中,他專注於如何使用二進制運算分配標誌。 標誌允許我們在單個整數中存儲多個值,使權限管理變得更加簡單和有效。
使用位或運算指派多個標誌
Tim演示了如何使用位或運算 (|)運算符。 他創建了一個列舉SystemPermissions,其中包含不同的權限級別,如SQL、Redis和BuildSystem。 我們可以將所有權限存儲在一個值中,而不是使用多個變數。
將多個權限指派給變數的範例:
// Assume that SystemPermissions is an enum with values SQL, Redis, and BuildSystem
SystemPermissions TimPermissions = SystemPermissions.SQL | SystemPermissions.Redis;
// Print the current permissions - it will include both SQL and Redis
Console.WriteLine(TimPermissions);
// Assume that SystemPermissions is an enum with values SQL, Redis, and BuildSystem
SystemPermissions TimPermissions = SystemPermissions.SQL | SystemPermissions.Redis;
// Print the current permissions - it will include both SQL and Redis
Console.WriteLine(TimPermissions);
顯示二進制表示形式
為了更好地理解正在發生的事情,Tim建議使用Convert.ToString(value, 2)將整數值轉換為其二進制形式。 這使我們能夠可視化哪些位被設置:
// Convert the permissions to a binary string to see the set bits
Console.WriteLine(Convert.ToString((int)TimPermissions, 2));
// Convert the permissions to a binary string to see the set bits
Console.WriteLine(Convert.ToString((int)TimPermissions, 2));
這表明不同的位位置對應於不同的權限,展示了我們如何能夠在一個整數中存儲多個設置。
使用或等於添加更多權限
Tim解釋說,我們可以動態地使用`|=運算符來添加更多的權限:
// Add the BuildSystem permission to the existing permissions
TimPermissions |= SystemPermissions.BuildSystem;
// Print the updated permissions - it now includes SQL, Redis, and BuildSystem
Console.WriteLine(TimPermissions);
// Add the BuildSystem permission to the existing permissions
TimPermissions |= SystemPermissions.BuildSystem;
// Print the updated permissions - it now includes SQL, Redis, and BuildSystem
Console.WriteLine(TimPermissions);
理解32位限制
Tim強調了一個重要的考慮因素:C#中的整數數據類型有32位限制。 這意味著我們只能在int中存儲最多32個唯一的標誌。 如果我們需要超過32個標誌,應考慮使用long(64位)甚至多個值。 然而,在大多數情況下,32個標誌已經足夠了。
在數據庫中儲存標誌
使用旗標枚舉的一個最大優勢是它們可以高效地存儲於數據庫中。 我們可以存儲一個整數值來表示所有權限,而不是存儲多個布林列。 Tim解釋這種方法顯著減少了數據庫的複雜性和存儲需求。
例如,如果TimPermissions被儲存為37,它代表以下的組合:
- SQL (位元 1)
- Redis (位元 3)
- BuildSystem (位元 5)
當我們從數據庫檢索該值時,可以輕鬆解碼以確定活動的權限。
結論
Tim總結了Flag Enums的強大功能。 利用二進制運算,我們可以在單個整數中高效地管理多個狀態。 這項技術提升了性能,簡化了數據存儲,並使我們的代碼更易讀。
依循此方法,您可以使用C# Flag Enums實現一個乾淨且可擴展的權限管理系統。 觀看完整影片以獲得更好的理解。
