2008-10-16 41 views

Trả lời

15

Để cung cấp một câu trả lời hơi khác nhau ... trong khi các giá trị là kiểu an từ quan điểm đúc, họ vẫn không được kiểm soát một khi họ đã được đúc - tức là

enum Foo { A = 1, B = 2, C = 3 }  
static void Main() 
{ 
    Foo foo = (Foo)500; // works fine 
    Console.WriteLine(foo); // also fine - shows 500 
} 

Vì lý do này, bạn nên tham gia quan tâm để kiểm tra các giá trị - ví dụ với một default trong một switch mà ném một ngoại lệ.

Bạn cũng có thể kiểm tra (đối với [Flags] giá trị phi) thông qua:

bool isValid = Enum.IsDefined(typeof(Foo), foo); 

+0

+1 cho mẹo Enum.IsDefined. – OregonGhost

+0

Ồ, đây là một mẹo hay. Tôi không biết điều này .. luôn luôn giả định nó sẽ ném một InvalidCastException hoặc một cái gì đó. Chắc chắn +1 từ tôi! –

+0

+1. Enum.IsDefined là một anh hùng vô danh tuyệt vời ... –

11

Có.

Sau đây là từ http://www.csharp-station.com/Tutorials/Lesson17.aspx

Enums được đánh mạnh hằng số. Chúng chủ yếu là các kiểu duy nhất cho phép bạn gán các tên biểu tượng cho các giá trị tích phân. Trong truyền thống C#, chúng được đánh máy mạnh mẽ, có nghĩa là một enum của một kiểu có thể không được gán ngầm cho một enum của một kiểu khác mặc dù giá trị cơ bản của các thành viên của chúng là như nhau. Dọc theo cùng một dòng, các loại tích phân và enums không hoàn toàn có thể hoán đổi cho nhau. Tất cả các bài tập giữa các loại enum khác nhau và các kiểu tích phân đòi hỏi một diễn viên rõ ràng.

0

Yes they are.

Enums được nhập mạnh mẽ hằng số. Về cơ bản, chúng là các loại duy nhất mà cho phép bạn chỉ định tên tượng trưng cho giá trị tích phân. Trong truyền thống C#, chúng được nhập mạnh mẽ, có nghĩa là một enum của một loại có thể không được gán hoàn toàn vào một enum một loại khác mặc dù giá trị cơ bản của các thành viên của chúng là giống nhau. Dọc theo cùng một dòng, loại tích phân và enums không phải là ngầm hoán đổi cho nhau. Tất cả các bài tập giữa các loại khác nhau enum và các loại không thể tách rời yêu cầu một diễn viên rõ ràng .

+0

Loại tích phân: ngoại trừ chữ số 0, * là * ẩn. –

0

Có.

C#: loại enum:

-Một kiểu liệt kê an toàn các giá trị được đặt tên.

-Prevents lỗi lập trình

-user có thể kiểm soát loại cơ bản (mặc định là int)

-Cũng có thể kiểm soát giá trị tiềm ẩn

0

Về mặt kỹ thuật không vì bạn có thể đại diện cho một Enum như giá trị cơ bản của nó (int, dài, vv). Tuy nhiên, nếu bạn đảm bảo rằng bạn chỉ sử dụng enum theo tên được cung cấp, bạn sẽ nhận được các lỗi biên dịch thời gian nếu bạn thay đổi tên của một giá trị được liệt kê mà không cập nhật các tham chiếu của nó. Về vấn đề này có nó là loại an toàn.

0

Tôi muộn để đảng ở đây, nhưng tôi muốn ném ra một chút gì đó thêm ... Bản cập nhật cho số .NET Framework Design Guidelines từ Krzysztof Cwalina. Ngoài mẹo tuyệt vời trên để kiểm tra để đảm bảo giá trị hợp lệ được chuyển đến Enums của bạn, điều này cung cấp hướng dẫn và lời khuyên khác về cách sử dụng chúng hiệu quả, một loạt các gotchas (đặc biệt là Flags enums), v.v.

2

Đối với những người đề xuất sử dụng Enum.IsDefined để thực hiện xác thực đối số ... không! Per Brad Abrams (từ số Framework Design Guidlines Update on Enum Design):

Thực sự có hai vấn đề với Enum.IsDefined(). Đầu tiên nó tải phản xạ và một loạt các siêu dữ liệu kiểu lạnh làm cho nó trở thành một cuộc gọi khủng khiếp. Thứ hai, như là lưu ý ám chỉ đến có một vấn đề versioning ở đây.

+0

Cuộc gọi tốt; Tôi đã bỏ lỡ toàn bộ ghi chú đó trong lần đọc đầu tiên của tôi về điều đó hôm nay. –

+0

@ John Rudy: Cảm ơn! Tôi đã biết về những vấn đề đó rồi nhưng rất tốt để có thể chỉ ra một số tài liệu về nó, đặc biệt là với một ví dụ. –

0

vâng họ r mạnh mẽ-gõ Safed u có thể không nó không làm chuyển đổi impilcit của enum biến liên tục với giá trị integeral u hv 2 expilcitly làm dat ví dụ ngày enum { mặt trời, mon } int e = (int) days.sun; console.writeline (e);

0

C# enums là loại ý nghĩa an toàn

  1. Bạn có thể không mặc nhiên chuyển đổi từ loại cơ bản cho enum thực tế
  2. Ngoài ra, bạn không thể gán giá trị là một enum để enum khác, mặc dù các loại cơ bản của cả hai enums đều giống nhau. Một diễn viên rõ ràng là luôn luôn cần thiết.
  3. Enums giúp mã của bạn dễ đọc hơn và dễ bảo trì hơn.

Tôi đã đi qua một video hướng dẫn tuyệt vời về enums giải phóng bản chất an toàn loại của chúng. Có một cái nhìn herethere.