2012-05-15 32 views
6

Tôi có một nhóm các giá trị đại diện cho một trạng thái (ON, OFF, READY, ...). Những giá trị này cũng được lưu trữ trong một DB như một trường int, vì vậy tôi tự hỏi nếu thực hành tốt nhất sẽ nói để làm cho điều này một enum hoặc chỉ bó của các loại int int trên một lớp. Enum có vẻ như phù hợp với việc đọc/mã hóa của con người, nhưng có vẻ như nó ẩn số mà các giá trị ánh xạ tới (hoặc các giá trị khác được lấy từ một DB sẽ được khởi tạo tới trạng thái không chính xác). Ai đó có thể đến sau và thêm một giá trị mới vào enum hoặc một cái gì đó và ném toàn bộ điều đó đi.C# Enum hoặc int hằng số

Cách tiếp cận nào tốt hơn?

+1

Cũng đúng với số nguyên! Bạn có thể đặt giá trị bạn muốn cho mỗi enum và trình biên dịch sẽ thực thi (một chút) mã của bạn. Ít nhất bạn sẽ không thể viết: myVar.MyEnum = 12345; –

+1

Tôi sẽ đi 'enum' cho ví dụ của bạn. Pi là hằng số, như tốc độ ánh sáng. Bộ trạng thái của bạn không, theo quan điểm khiêm tốn của tôi. – Ste

Trả lời

10

Tôi nghĩ rằng enum vẫn là lựa chọn tốt nhất để dễ đọc. Tuy nhiên, vì giá trị của nó được lưu trữ trong DB, bạn nên xác định các giá trị một cách rõ ràng:

enum State { On = 1, Off = 2, Ready = 3}; 
+0

+1 @OxedFrederik không chỉ đơn giản là ** tuyên bố ** một enum nhưng trong mô hình của bạn ** kiểm tra ** nó hợp lệ. Bạn có thể truyền bất kỳ số nguyên nào vào một enum. Cá nhân tôi yêu giải pháp được đăng bởi Kevin. –

0

Bạn có thể xác định giá trị trong Enum mình quá, ví dụ:

enum STATE {ON=2, OFF=9, READY=14}; 
3

như thế nào ai đó thêm một enum mới giá trị bất kỳ khác với một int liên tục mới?

Hãy nhớ rằng, bạn có thể đặt enum thành giá trị số nguyên cụ thể.

Embrace readability!

Là một tiền thưởng thêm, bây giờ bạn có thể sử dụng gõ mạnh để ngăn chặn tai quái như

Widget.state = 474; 

đâu 474 không tương ứng với trạng thái trong cơ sở dữ liệu của bạn.

+0

Điều này là đúng, nhưng khu vực dễ bay hơi nhất đối với loại điều này là tại các ranh giới ứng dụng, nơi sự tuần tự xảy ra. Điều này có nghĩa là bạn kết thúc với các câu lệnh như 'Widget.state = (StateEnum) stateId' và C# không ** không ** quan tâm nếu' stateId' là một giá trị hợp lệ trong 'StateEnum' và sẽ ** không ** ném một ngoại lệ nếu 'stateId' là 474. – Nick

+0

@Nick yes, khử trùng đầu vào của bạn. [Thậm chí còn có các phương pháp enum để hỗ trợ trong việc này.] (Https://msdn.microsoft.com/en-us/library/system.enum.isdefined.aspx) – MushinNoShin

1

Tôi sẽ đi với một enum và chắc chắn rằng nó rất tốt tài liệu mà bảng enum tương ứng với.

Nguy hiểm với một loạt các const ints là loại chuyển tải không có dấu hiệu của những gì các giá trị hợp lệ và ai đó có thể rất dễ dàng chỉ định bất kỳ giá trị cũ. Người dùng độc hại mã của bạn vẫn có thể thực hiện việc đó bằng dàn diễn viên nhưng bạn không thể ngăn một số người tự bắn mình ...

0

Tôi sẽ nói Enums. Chúng cung cấp cho bạn tùy chọn định dạng máy cho định dạng có thể đọc được của con người. Đảm bảo bạn ghi rõ tài liệu theo cách này

///Summary 
/// About State Enum 
///Summary 
enum State : int 
{ 
    ///Summary 
    /// About Off Enum Value 
    ///Summary 
    Off = 0, 
    ///Summary 
    /// About On Enum Value 
    ///Summary 
    On, 
    ///Summary 
    /// About Ready Enum Value 
    ///Summary 
    Ready 
}; 

Không cần gán giá trị cho từng thành viên. Bắt đầu từ 0 và phần còn lại sẽ được tăng lên tự động.

Kể từ khi enum của bạn là về on/off, bạn có thể sử dụng nó theo cách boolean. 0 là viết tắt của False hoặc off và 1 thành true hoặc on.

Bạn cũng có thể chuyển đổi enum của bạn để int như

int value = (int)State.On; // value will have 1 

Lưu giá trị trong cơ sở dữ liệu như int. và trong khi lấy bạn có thể làm như thế này

State st = (State)int.Parse(mydatabasevalue); 
1

Nếu giá trị của bạn sẽ hiếm khi thay đổi, hoặc nếu bạn không có vấn đề với việc hiệu chỉnh và biên dịch lại mã của bạn, sau đó chắc chắn sử dụng một enum với lời tuyên bố rõ ràng về các giá trị số nguyên cho mỗi .Nếu không, tôi sẽ tạo ra một wrapper đối tượng mà kéo các giá trị từ cơ sở dữ liệu (bạn luôn có thể cache các giá trị cho một chút nếu bạn đang lo lắng về hiệu năng). Sau đó, thực hiện tất cả các so sánh của bạn với trình bao bọc đối tượng đó. Trừ khi bạn có thể đảm bảo các giá trị trong cơ sở dữ liệu sẽ không thay đổi mà không có mã đang được cập nhật bằng cách sử dụng một enum trong mã của bạn chỉ là dễ bay hơi và nguy hiểm. Nếu bạn thực sự mạo hiểm và muốn nhận được vào mã phát, bạn có thể làm một số điều khá thú vị với điều đó.

Các vấn đề liên quan