2009-03-05 33 views
67

Tôi đã làm một số đọc trên enums và tìm thấy chúng rất giống với khai báo hằng số. Làm thế nào tôi có thể biết khi nào nên sử dụng một hằng số chứ không phải là một enum hoặc ngược lại. Một số lợi thế của việc sử dụng enums là gì?Enums và Constants. Sử dụng khi nào?

+0

cũng xem http://stackoverflow.com/questions/755685/c-static-readonly-vs-const –

+0

xem thêm http://stackoverflow.com/questions/11575376/why-use-enums-instead-of -constants cho câu hỏi tương tự cho Java (câu trả lời chủ yếu áp dụng cho C# quá). –

Trả lời

68

Sử dụng enums khi bạn muốn xác định phạm vi giá trị có thể có. Màu sắc là một ví dụ rõ ràng như:

public enum Colour 
{ 
    White, 
    Red, 
    Blue 
} 

Hoặc có thể là một tập hợp của những thứ có thể như: (Ví dụ tôi lấy trộm từ here như tôi là lười biếng)

[FlagsAttribute] 
enum DistributedChannel 
{ 
    None = 0, 
    Transacted = 1, 
    Queued = 2, 
    Encrypted = 4, 
    Persisted = 16, 
    FaultTolerant = Transacted | Queued | Persisted 
} 

Constants nên được cho một giá trị duy nhất , như PI. Không có nhiều giá trị PI, chỉ có PI.

+0

Điều gì sẽ xảy ra nếu bạn sử dụng '.ToString()' trên enum rất nhiều, bất kỳ giá trị nào trong việc sử dụng một lớp có các chuỗi const trông và hoạt động giống như một enum nhưng ngăn chặn một lời gọi đến 'ToString()'? [Ví dụ] (https://hastebin.com/exehipiwut.cs) – Sinjai

+0

Chờ đã, tôi nghĩ tôi đã trả lời câu hỏi của riêng mình. Mã trong ví dụ đó sẽ không hoạt động: bạn sẽ phải lấy đầu vào như một chuỗi, nó sẽ không thực sự hoạt động giống như một enum. – Sinjai

16

Hằng số là một tính năng ngôn ngữ cho biết biến không thay đổi giá trị (do đó trình biên dịch có thể thực hiện tối ưu hóa xung quanh kiến ​​thức đó) trong đó enum là một kiểu cụ thể.

Hằng số có thể là bất kỳ loại dữ liệu nào nhưng enum là enum.

Tôi sử dụng enum bất kỳ nơi nào bạn có thể có một số tùy chọn và muốn cải thiện khả năng đọc của mã. tức là bạn có thể có các cấp độ dấu vết dưới dạng một giá trị int có giá trị 0, 1, 2 hoặc dưới dạng enum dưới dạng lỗi, cảnh báo và thông tin.

Enum cũng có khả năng được sử dụng như các toán tử bitwise, ví dụ: FontStyle.Bold | FontStyle.Italic sẽ cung cấp cho bạn phông chữ đậm và nghiêng.

5

Ngoài câu trả lời của Robert:

  1. Sử dụng enum cho một tập hữu hạn các giá trị được đặt tên. Bạn không thực sự quan tâm đến giá trị số đằng sau mỗi biểu tượng (nhưng bạn vẫn có khả năng áp đặt chúng, ví dụ như khả năng tương thích với hệ thống cũ).

  2. Robert: Có, Enum có thể được sử dụng làm trường bit. Sử dụng thuộc tính Flags (và đảm bảo các thành viên của enum có các giá trị số phù hợp).

3

Hằng số C# tương tự như biến trong đó nó cung cấp tên được xác định cho giá trị. Tuy nhiên, một hằng số khác với một biến chuẩn vì một khi được xác định, giá trị được gán cho hằng số không bao giờ có thể thay đổi được. Lợi ích chính của hằng số là sự hỗ trợ của họ trong việc tạo mã tự viết cũng như cho phép khai báo các giá trị quan trọng ở một nơi duy nhất, cho phép bảo trì dễ dàng nếu giá trị cần được cập nhật và phần mềm được biên dịch lại.

Trong khi Danh sách liệt kê có ích để xác định trình tự và trạng thái, đặc biệt khi có tiến triển tự nhiên qua các trạng thái đó. Điều này là do mỗi hằng số trong danh sách có thể được định dạng và so sánh bằng cách sử dụng tên hoặc giá trị của nó. Một enum cũng có thể được sử dụng để xác định một tập hạn chế các giá trị hợp lệ.

+0

"Danh sách liệt kê"? –

22

Điều còn thiếu trong các câu trả lời khác là enums có loại cơ sở số nguyên. Bạn có thể thay đổi mặc định từ int thành bất kỳ loại tích phân nào khác ngoại trừ char như sau:

enum LongEnum : long { 
    foo, 
    bar, 
} 

Bạn có thể bỏ rõ ràng và rõ ràng loại cơ sở hữu ích trong chuyển đổi câu lệnh. Cẩn thận rằng người ta có thể bỏ bất kỳ giá trị nào của kiểu cơ sở vào một enum, ngay cả khi enum không có thành viên nào với giá trị thích hợp.Vì vậy, việc sử dụng luôn phần mặc định trong chuyển đổi là một ý tưởng hay. BTW, .NET chính nó cho phép thậm chí nổi điểm enums có giá trị, nhưng bạn không thể xác định chúng trong C#, mặc dù tôi nghĩ rằng bạn vẫn có thể sử dụng chúng (ngoại trừ trong chuyển đổi).

Hơn nữa, việc sử dụng enums mang đến cho bạn nhiều loại an toàn hơn. Nếu bạn định sử dụng ví dụ: int hằng số như các tham số phương thức, sau đó tôi có thể gọi phương thức với bất kỳ giá trị int nào. Cấp, thông qua đúc nó có thể xảy ra với enums, quá, nhưng nó sẽ không xảy ra vô tình. Tồi tệ hơn là khả năng nhầm lẫn thứ tự các tham số.

void method(int a, int b) {...} 

Nếu hằng số có thể đi vào và hằng số B chỉ có thể đi vào b, sau đó sử dụng hai loại enum khác nhau sẽ phát hiện bất kỳ hành vi lạm dụng nào trong quá trình biên dịch.

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