Với trường hợp tôi có một đối tượng có thể ở một hoặc nhiều trạng thái đúng/sai, tôi luôn hơi mờ về lý do tại sao các lập trình viên thường sử dụng cờ + bitmask thay vì chỉ sử dụng một vài giá trị boolean.Tại sao sử dụng cờ + bitmask thay vì một loạt các boolean?
Toàn bộ khuôn khổ .NET. Không chắc chắn nếu đây là ví dụ tốt nhất, nhưng khuôn khổ .NET có những điều sau đây:
public enum AnchorStyles
{
None = 0,
Top = 1,
Bottom = 2,
Left = 4,
Right = 8
}
Vì vậy, cho một kiểu neo, chúng ta có thể sử dụng bitmask để tìm ra trạng thái nào được chọn. Tuy nhiên, có vẻ như bạn có thể thực hiện điều tương tự với lớp/cấu trúc AnchorStyle với các thuộc tính bool được xác định cho mỗi giá trị có thể, hoặc một mảng các giá trị enum riêng lẻ.
Tất nhiên, lý do chính cho câu hỏi của tôi là tôi tự hỏi liệu tôi có nên làm theo một thực hành tương tự với mã của riêng tôi hay không.
Vì vậy, tại sao sử dụng phương pháp này?
- Ít tiêu thụ bộ nhớ? (nó không dường như như nó sẽ tiêu thụ ít hơn một mảng/struct của bools)
- Hiệu suất stack/heap tốt hơn so với cấu trúc hoặc mảng?
- Hoạt động so sánh nhanh hơn? Thêm/xóa giá trị nhanh hơn?
- Thuận tiện hơn cho nhà phát triển đã viết nó?
Không phải là tôi thấy rằng một đối số mạnh mẽ, nhưng nó ** không ** tiêu thụ ít bộ nhớ hơn. Nó sử dụng hết một int (4 byte) trong khi mỗi bool sử dụng hết một byte. Vì vậy, 4 bools sử dụng lên giống như một int. 32 bool sử dụng hết 32 byte, trong khi tất cả những bools có thể ở trong cùng một enum. Và nếu bạn đi đến đường dẫn không được đề nghị, bạn có thể tạo ra enums dài 8 byte (sizeof (long)). –
Cảm ơn bạn đã làm rõ điều đó. Nó dẫn tôi đến bài đăng này: http://stackoverflow.com/questions/294905/why-in-net-system-boolean-takes-4-byte –
Vì vậy, từ các phản ứng rõ ràng là các cờ enum có trọng lượng nhẹ hơn các cấu trúc/mảng của bools về bộ nhớ. Tuy nhiên, có vẻ như có một số lớp khung công tác .NET phù hợp với nhiệm vụ, chẳng hạn như BitVector32 hoặc BitArray. Điều gì về một cấu trúc sử dụng một BitVector32 (được hỗ trợ bởi một uint) để lưu trữ và cung cấp các thuộc tính nhận/đặt bit (như bools) tại các chỉ mục cụ thể? Windows Forms dường như làm điều này. Thêm mã cho nhà phát triển, nhưng có vẻ như nó sẽ hoạt động tốt và việc đóng gói sẽ giúp người tiêu dùng API hạ lưu dễ sử dụng hơn. hmm? –