Enums chắc chắn có thể làm cho mã dễ đọc hơn. Vẫn còn một vài điều cần chú ý (ít nhất là trong .net)
Vì lưu trữ cơ bản của enum là int, nên giá trị mặc định sẽ bằng 0, vì vậy bạn nên đảm bảo rằng 0 là mặc định hợp lý. (Ví dụ: cấu trúc có tất cả các trường được đặt thành 0 khi được tạo, vì vậy không có cách nào để chỉ định mặc định khác 0. Nếu bạn không có giá trị 0, bạn thậm chí không thể kiểm tra enum mà không truyền vào int phong cách xấu.)
Nếu enum của bạn là riêng tư đối với mã của bạn (không bao giờ được hiển thị công khai) thì bạn có thể dừng đọc tại đây.
Nếu enum của bạn được xuất bản theo bất kỳ cách nào đối với mã bên ngoài và / hoặc được lưu bên ngoài chương trình, hãy xem xét đánh số chúng một cách rõ ràng. Trình biên dịch sẽ tự động đánh số chúng từ 0, nhưng nếu bạn sắp xếp lại các enum của mình mà không cung cấp cho chúng các giá trị thì bạn có thể bị lỗi.
Tôi có thể viết hợp pháp
WriteMode illegalButWorks = (WriteMode)1000000;
file.Write( data, illegalButWorks );
Để chống lại điều này, bất kỳ mã nào sử dụng enum mà bạn không thể chắc chắn (ví dụ API công khai) cần kiểm tra xem enum có hợp lệ không. Bạn làm điều này thông qua
if (!Enum.IsDefined(typeof(WriteMode), userValue))
throw new ArgumentException("userValue");
Nhắc nhở duy nhất Enum.IsDefined
là nó sử dụng sự phản chiếu và chậm hơn. Nó cũng bị một vấn đề phiên bản. Nếu bạn cần kiểm tra giá trị enum thường xuyên, bạn sẽ tốt hơn nếu như sau:
public static bool CheckWriteModeEnumValue(WriteMode writeMode)
{
switch( writeMode )
{
case WriteMode.Append:
case WriteMode.OverWrite:
break;
default:
Debug.Assert(false, "The WriteMode '" + writeMode + "' is not valid.");
return false;
}
return true;
}
Vấn đề về phiên bản là mã cũ chỉ có thể biết cách xử lý 2 enum bạn có. Nếu bạn thêm giá trị thứ ba, Enum.IsDefined sẽ đúng, nhưng mã cũ không nhất thiết phải xử lý nó. Rất tiếc.
Thậm chí còn có nhiều điều thú vị hơn mà bạn có thể làm với [Flags]
enums và mã xác nhận cho điều đó hơi khác một chút.
Tôi cũng lưu ý rằng đối với tính di động, bạn nên sử dụng lệnh gọi ToString()
trên enum và sử dụng Enum.Parse()
khi đọc lại. Cả hai ToString()
và Enum.Parse()
cũng có thể xử lý [Flags]
enum, vì vậy không có lý do gì để không sử dụng chúng. Nhắc bạn, đó là một cạm bẫy khác, bởi vì bây giờ bạn thậm chí không thể thay đổi tên của enum mà không có thể phá mã.
Vì vậy, đôi khi bạn cần cân nhắc tất cả những điều trên khi bạn tự hỏi mình Tôi có thể thoát khỏi chỉ với một bool không?