Enums và Hằng số. Sử dụng cái nào khi nào?


95

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



xem thêm stackoverflow.com/questions/11575376/… để biết câu hỏi tương tự cho Java (các câu trả lời hầu như cũng áp dụng cho C #).
Alexei Levenkov

Câu trả lời:


95

Sử dụng enum khi bạn muốn xác định một phạm vi giá trị mà một thứ có thể là. 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 những thứ có thể có như: (Ví dụ tôi đã ăn cắp từ đây vì tôi lười biếng)

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

Các hằng số phải dành cho một giá trị duy nhất, như PI. Không có phạm vi giá trị PI, chỉ có PI.

Các điểm khác cần xem xét là:

  • a: Hằng số không nhất thiết chỉ ra mối quan hệ giữa các hằng số, trong khi một phép liệt kê chỉ ra rằng một cái gì đó có thể là một trong những tập hợp được định nghĩa bởi enum.
  • b: Một kiểu liệt kê đã xác định có thể giúp bạn kiểm tra kiểu khi được sử dụng làm đối số. Hằng số chỉ là giá trị, vì vậy chúng không cung cấp thêm bất kỳ thông tin ngữ nghĩa nào.

1
Điều gì sẽ xảy ra nếu bạn sử dụng .ToString()rất nhiều trên enum, bất kỳ giá trị nào trong việc sử dụng một lớp có chuỗi const trông và hoạt động giống như một enum nhưng bỏ qua một lệnh gọi đến ToString()? Ví dụ
Sinjai

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

1
Tại sao bạn không thể chỉ có một lớp tĩnh Color với các màu không đổi thay vì enum? Có gì khác biệt?
WDUK

trong tuyên bố ngắn gọnType Safety"
ahmednabil88

30

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

enum LongEnum : long {
    foo,
    bar,
}

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

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

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

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


20

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

Hằng có thể là bất kỳ kiểu dữ liệu nào nhưng một enum là một enum.

Tôi sử dụng một enum bất kỳ nơi nào mà 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 mức theo dõi dưới dạng int với các giá trị 0, 1, 2 hoặc 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, tức là FontStyle.Bold | FontStyle.Italic sẽ cung cấp cho bạn các phông chữ đậm và nghiêng.


8

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

  1. Sử dụng enum cho một tập hợ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 ký hiệu (nhưng bạn vẫn có khả năng áp đặt chúng, ví dụ: để tương thích với hệ thống kế thừa).

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


3

Hằng số AC # tương tự như một biến ở chỗ nó đặt tên xác định cho một giá trị. Tuy nhiên, một hằng số khác với một biến tiêu 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 chúng trong việc tạo mã tự lập tài liệu cũng như cho phép khai báo các giá trị khóa ở một nơi duy nhất, cho phép dễ dàng bảo trì 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 Enumerator hữu ích cho việc xác định trình tự và trạng thái, đặc biệt khi có một diễn tiế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ợp giới hạn các giá trị hợp lệ.


3

Một điều tôi thấy hữu ích khi sử dụng enumthay vì constlà bạn có thể lặp lại các giá trị trong một enum, khó hơn nhiều để làm điều đó với constcác giá trị.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.