2010-08-10 30 views
10

Đã xem cách enums có thể được sử dụng như cờ bit bằng cách trang trí chúng với thuộc tính flags và toán tử bitwize (xem bên dưới).Sử dụng thực tế cờ bit trong .NET framework

Có bất kỳ vị trí nào trong khuôn khổ .NET mà mẫu này được sử dụng không? Tôi thích video này nhưng muốn xem một số ví dụ thực tế đời sống hơn

[Flags] 
enum Days2 : int 
{ 

    None = 0x0, 
    Sunday = 0x1, 
    Monday = 0x2, 
    Tuesday = 0x4, 
    Wednesday = 0x8, 
    Thursday = 0x10, 
    Friday = 0x20, 
    Saturday = 0x40 
} 

    Days2 meetingDays = Days2.Tuesday | Days2.Thursday; 

    // Set an additional flag using bitwise OR. 
    meetingDays = meetingDays | Days2.Friday; 

    Console.WriteLine("Meeting days are {0}", meetingDays); 

Trả lời

11

Có - nhìn vào MethodBase.Attributes ví dụ, nói rằng cho dù một thành viên là công khai, tĩnh, vv

FileAccessFileOptions là những ví dụ tập tin dựa trên, quá.

Nếu bạn mở phản xạ, hãy tìm FlagsAttribute và sau đó nhấn "Phân tích" (Ctrl-R) và mở rộng "được sử dụng bởi" bạn sẽ thấy vô số loại sử dụng nó. Phải mất một thời gian mặc dù :)

+1

Doh! Tôi biết nên có một cách để tìm thấy nó trong phản xạ, chứ không phải là thủ công một số mã. –

2

Có nhiều nơi trong đó FlagsAttribute được sử dụng để liệt kê trong BCL.

Dưới đây là một ví dụ - tham số BindingFlags được sử dụng trong mã phản chiếu.

2

Có rất nhiều nơi nó được sử dụng, nó được sử dụng trong khuôn khổ NET trong các thuộc tính tập tin, tôi đã nhìn thấy nó được sử dụng như cờ an ninh tức

enum Roles 
{ 
    None = 0, 
    User = 1, 
    Admin = 2, 
    Superman = 4 
} 

if (_user.Roles & Roles.Admin != Roles.None) { user-is-admin } 
if (_user.Roles & Roles.Superman != Roles.None) { user-is-also-superman } 

Họ về cơ bản tuyệt vời cho bất kỳ kịch bản mà bạn có một lựa chọn các thuộc tính có thể cho một cái gì đó, nếu bạn có một cái gì đó có thể là một sự lựa chọn của màu sắc ví dụ hoặc một lựa chọn của các dân tộc hoặc vv

Một nơi phổ biến để xem chúng là hộp thoại winforms có thuộc tính tạo thành chúng, bạn có thể hoặc chúng với nhau cho một hộp thông báo để quyết định lựa chọn các nút bạn nhận được như Ok | Hủy | Bỏ qua, v.v.

5

Một trong những enums [Flags] phổ biến nhất mà bạn sẽ thấy là tùy chọn regex enum. Dưới đây là một ví dụ:

Regex rxInsensitive = new Regex(@"\b(?<word>\w+)\s+(\k<word>)\b", 
      RegexOptions.Compiled | RegexOptions.IgnoreCase); 

More đây: http://msdn.microsoft.com/en-us/library/system.text.regularexpressions.regexoptions.aspx

Những năm trước đây tôi đã viết một hướng dẫn về sử dụng enums bit trong Net, có lẽ điều này sẽ giúp: http://www.johnsample.com/articles/BitwiseEnums.aspx

2

Có rất nhiều ví dụ trong mscorlib và System assemblies, mặc dù số lượng bạn sẽ gặp phải trong sử dụng hàng ngày là một câu hỏi phức tạp hơn.

Ví dụ: System.Threading.ThreadState là kết hợp của trạng thái luồng hiện tại và các yêu cầu đang chờ xử lý.

Tôi thực sự đổ ra tất cả các enums cờ trong hệ thống và mscorlib, chỉ dành riêng cho tiếng cười khúc khích, và sau đó đã đi tìm kiếm những thú vị:

Dim types = (From t In Reflection.Assembly.GetAssembly(GetType(Int32)).GetTypes() Select t).Concat(_ 
       (From t In Reflection.Assembly.GetAssembly(GetType(Uri)).GetTypes() Select t)) 

    For Each t As Type In types 
     If t.IsEnum AndAlso (From att In t.GetCustomAttributes(True) Where TypeOf (att) Is FlagsAttribute).Any() Then 
      Console.WriteLine("Flag Enum: {0}", t.ToString()) 
     End If 
    Next 
    Console.ReadLine() 
2

Làm thế nào về khi thiết font style tùy chọn, chẳng hạn như:

this.Font = new Font(this.Font, FontStyle.Bold | FontStyle.Italic); 
Các vấn đề liên quan