Có an toàn để giả định rằng các giá trị này loại trừ lẫn nhau không?
Nếu bạn đang có kế hoạch tương thích trong tương lai, thì không. Các tác giả có thể thêm một giá trị có thể được kết hợp với một trong các giá trị hiện tại để bao quát một trạng thái rộng hơn. Bạn tốt hơn hết mặt nạ.
Chúng có thể không, nhưng được xác định theo cách này để tùy chọn đó mở.
Tại sao họ lại chọn đường dẫn này?
Có lẽ, để mọi người không cho rằng giá trị loại trừ lẫn nhau.
Chủ yếu, nó cho phép một để làm các xét nghiệm mặt nạ đó bao gồm nhiều hơn một giá trị trong một thử nghiệm duy nhất:
if (state & (EntityState.Deleted | EntityState.Modified | EntityState.Added) != 0) …
này hoạt động vì các giá trị cho enum
sử dụng một phong cách bố trí cờ nơi từng có bit khác nhau thiết lập (hoặc là cố ý quy định tại các điều khoản của người khác):
Detached = 1,
Unchanged = 2,
Added = 4,
Deleted = 8,
Modified = 16
Bởi vì điều này, EntityState.Deleted | EntityState.Modified | EntityState.Added
có giá trị 8 | 16 | 4
đó là 28
. Nó sẽ không hoạt động nếu các giá trị mà chỉ tăng lên:
Detached = 1,
Unchanged = 2,
Added = 3,
Deleted = 4,
Modified = 5
Bây giờ EntityState.Deleted | EntityState.Modified | EntityState.Added
sẽ có một giá trị của 7
mà là giống như EntityState.Detached | Entity.Unchanged | Entity.Deleted
.
FlagsAttribute
được sử dụng để cung cấp siêu dữ liệu cho biết bạn đang sử dụng phương pháp tiếp cận cũ hơn là sau, vì vậy mặt nạ có thể hoạt động. Hiệu ứng duy nhất nó có trực tiếp trên chính loại đó là cách hoạt động của ToString()
, đó là cung cấp một giá trị có ý nghĩa hơn khi thực hiện phương pháp này hơn là không.
Theo @CodeCaster, nó không phải thuộc tính '[Flags]' cho phép người ta thực hiện các kiểm tra mặt nạ "(http: // stackoverflow.com/questions/8447/what-does-the-flags-enum-thuộc tính-mean-in-c). – haim770
@ haim770 nó không phải. Đó là bố cục kiểu cờ cho phép điều đó. '[Flags]' đánh dấu một enum khi sử dụng bố trí kiểu cờ. –
@JonHanna Bạn có thể xây dựng trên bố cục kiểu cờ không? Hoặc một liên kết sẽ được đánh giá cao. – Alireza