Trả lời
Để 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);
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.
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 .
Loại tích phân: ngoại trừ chữ số 0, * là * ẩn. –
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
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.
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.
Đố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.
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. –
@ 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ụ. –
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);
C# enums là loại ý nghĩa an toàn
- Bạn có thể không mặc nhiên chuyển đổi từ loại cơ bản cho enum thực tế
- 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.
- 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 here và there.
- 1. Mã C sau có an toàn không?
- 2. C socket API có an toàn không?
- 3. Mảng an toàn không có khóa an toàn
- 4. Mã an toàn và không an toàn
- 5. Chuỗi an toàn của Netty Channel.write có an toàn không?
- 6. Nhập bitflags an toàn (r) vào C++?
- 7. FormsAuthentication: Có an toàn không?
- 8. SecureString có an toàn không?
- 9. Luồng có an toàn không?
- 10. TempData: Có an toàn không?
- 11. DWScript có an toàn không?
- 12. Mã không an toàn trong C#
- 13. Xóa C# Con trỏ Không an toàn
- 14. C#: Chuyển nhượng trường này có an toàn không?
- 15. Chuẩn C mktime thread có an toàn trên Linux không?
- 16. Chủ đề chuỗi C# có an toàn không?
- 17. (bool | bool) có an toàn không?
- 18. An toàn loại an toàn()
- 19. C++ an toàn ngoại lệ
- 20. C++ so với C# loại an toàn
- 21. Có an toàn cho init thread an toàn với VC2010 không?
- 22. Chủ đề SecureRandom có an toàn không?
- 23. Có an toàn threado MongoDB không?
- 24. Chủ đề NSPersistentStoreCoordinator có an toàn không?
- 25. Chủ đề EPiServer có an toàn không?
- 26. Chủ đề DocumentBuilder.parse() có an toàn không?
- 27. Trong Delphi, ThreadDebugString có an toàn không?
- 28. Chủ đề console.writeline có an toàn không?
- 29. Chủ đề này có an toàn không?
- 30. Cửa sổ Win32 có an toàn không?
+1 cho mẹo Enum.IsDefined. – OregonGhost
Ồ, đâ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! –
+1. Enum.IsDefined là một anh hùng vô danh tuyệt vời ... –