Các [Flags]
thuộc tính nên được sử dụng bất cứ khi nào đếm được đại diện cho một tập hợp các giá trị có thể, chứ không phải là một giá trị duy nhất. Các bộ sưu tập như vậy thường được sử dụng với các toán tử bitwise, ví dụ:
var allowedColors = MyColor.Red | MyColor.Green | MyColor.Blue;
Lưu ý rằng [Flags]
thuộc tính không tự kích hoạt tính năng này - tất cả những gì nó làm là cho phép biểu diễn đẹp theo .ToString()
phương thức:
enum Suits { Spades = 1, Clubs = 2, Diamonds = 4, Hearts = 8 }
[Flags] enum SuitsFlags { Spades = 1, Clubs = 2, Diamonds = 4, Hearts = 8 }
...
var str1 = (Suits.Spades | Suits.Diamonds).ToString();
// "5"
var str2 = (SuitsFlags.Spades | SuitsFlags.Diamonds).ToString();
// "Spades, Diamonds"
Cũng cần lưu ý rằng [Flags]
không tự động tạo ra sức mạnh giá trị enum của hai. Nếu bạn bỏ qua các giá trị số, enum sẽ không hoạt động như người ta có thể mong đợi trong các hoạt động theo bit, bởi vì theo mặc định, các giá trị bắt đầu bằng 0 và tăng dần.
Khai báo không chính xác:
[Flags]
public enum MyColors
{
Yellow, // 0
Green, // 1
Red, // 2
Blue // 3
}
Các giá trị, nếu được khai báo theo cách này, sẽ là Vàng = 0, Xanh = 1, Đỏ = 2, Xanh = 3. Điều này sẽ khiến nó vô dụng dưới dạng cờ.
Đây là một ví dụ về một tuyên bố chính xác:
[Flags]
public enum MyColors
{
Yellow = 1,
Green = 2,
Red = 4,
Blue = 8
}
Để lấy các giá trị riêng biệt trong tài sản của bạn, người ta có thể làm điều này:
if (myProperties.AllowedColors.HasFlag(MyColor.Yellow))
{
// Yellow is allowed...
}
hoặc trước .NET 4:
if((myProperties.AllowedColors & MyColor.Yellow) == MyColor.Yellow)
{
// Yellow is allowed...
}
if((myProperties.AllowedColors & MyColor.Green) == MyColor.Green)
{
// Green is allowed...
}
Dưới vỏ bọc
Điều này hoạt động bởi vì bạn đã sử dụng quyền hạn của hai trong bảng liệt kê của bạn. Dưới vỏ bọc, các giá trị liệt kê của bạn trông như thế này trong các số nhị phân và số không:
Yellow: 00000001
Green: 00000010
Red: 00000100
Blue: 00001000
Tương tự như vậy, sau khi bạn đã đặt thuộc tính của mình làCoolors thành màu đỏ, xanh lục và xanh lam bằng cách sử dụng toán |
tử nhị phân OR theo bit , cho phépCoolors trông như sau:
myProperties.AllowedColors: 00001110
Vì vậy, khi bạn truy xuất giá trị, bạn thực sự đang thực hiện bitwise VÀ &
trên các giá trị:
myProperties.AllowedColors: 00001110
MyColor.Green: 00000010
-----------------------
00000010 // Hey, this is the same as MyColor.Green!
Giá trị Không = 0
Và liên quan đến việc sử dụng 0
trong bảng liệt kê của bạn, trích dẫn từ MSDN:
[Flags]
public enum MyColors
{
None = 0,
....
}
Sử dụng Không làm tên của hằng số liệt kê cờ có giá trị bằng không. Bạn không thể sử dụng hằng số liệt kê Không có trong thao tác bitwise để kiểm tra cờ vì kết quả luôn bằng không. Tuy nhiên, bạn có thể thực hiện so sánh logic, không theo bit, giữa giá trị số và hằng số liệt kê Không để xác định xem có bất kỳ bit nào trong giá trị số được đặt hay không.
Bạn có thể tìm thêm thông tin về thuộc tính cờ và cách sử dụng tại msdn và thiết kế cờ tại msdn