2010-09-14 37 views
8

1) Tôi nhận thức được những lợi ích sau:Lợi ích của việc sử dụng enums qua trực tiếp sử dụng các loại tích phân?

  • chúng làm tăng mức độ trừu tượng kể từ khi bạn ngay lập tức nhìn thấy những gì giá trị không thể thiếu cơ bản đại diện.

  • Bạn có thể sử dụng chúng thay vì con số ma thuật và bằng cách đó làm cho mã dễ hiểu hơn

  • Họ cũng hạn chế các giá trị một biến enum có thể có và khi làm như vậy làm cho ứng dụng an toàn hơn, vì các lập trình viên biết được các giá trị hợp lệ cho biến, vì vậy tôi đoán chúng phân loại cung cấp loại an toàn

Có bất kỳ lợi ích nào khác mà chúng cung cấp trực tiếp bằng giá trị tích phân không?

2) Tại sao họ sử dụng tích phân làm loại cơ bản chứ không phải chuỗi?

cảm ơn bạn

+1

Xem thêm http://stackoverflow.com/questions/672102/why-no-non-integral-enums –

+7

Một điểm chọn nit là enum không có gì để hạn chế các giá trị mà một biến có thể có. Bạn có thể có 'MyEnum evil = (MyEnum) 666;' và điều này biên dịch tốt, ngay cả khi giá trị có thể không so sánh đúng với bất kỳ giá trị được chỉ định nào trong enum. Enums là một cách để giúp thể hiện ý nghĩa của các giá trị cụ thể, nhưng không có gì buộc các giá trị enum thực sự có ý nghĩa. –

Trả lời

8

Bạn đã liệt kê rất nhiều lý do chính khiến enums thích hợp hơn với các loại tích phân.

  • hằng đặt tên là an toàn hơn và dễ đọc hơn con số kỳ diệu

  • Enums mô tả để các lập trình viên những gì họ đang cho. Giá trị tích phân không.

  • Đương nhiên hạn chế các thiết lập các giá trị có thể được thông qua vào. (Bạn đã có những nổi của tảng băng type-an toàn ... nhưng nhìn sâu hơn ...)

Bạn cũng có thể thêm:

  • Tăng cường an toàn loại an toàn. Nếu bạn chấp nhận một 'int', sau đó bất kỳ int có thể được thông qua in Nếu bạn chấp nhận một VehicleType, sau đó chỉ có một VehicalType có thể được thông qua in Tôi không chỉ nói về một người đi qua trong 6 khi số lượng lớn nhất cho phép là 5. Tôi có nghĩa là những gì nếu bạn vượt qua trong FuelType.Unleaded đến một chức năng mà nghĩ rằng nó có nghĩa là VehicleType.Aeroplane? Với enums trình biên dịch sẽ cho bạn biết bạn là một thằng ngốc. Một loại tích phân nói "yeah, 5 là tốt với tôi" và chương trình của bạn thể hiện hành vi kỳ lạ thực sự có thể cực kỳ khó khăn để theo dõi.

  • Tái cấu trúc dễ dàng hơn. Cũng giống như với bất kỳ hằng số phép thuật nào, Nếu bạn chuyển giá trị 5 vào một trăm vị trí trong chương trình của mình, bạn sẽ gặp rắc rối nếu bạn quyết định thay đổi 5 để có một ý nghĩa khác. Với một enum (miễn là bạn không có vấn đề tương thích ngược nhị phân) bạn có thể thay đổi các giá trị cơ bản. Bạn cũng có thể thay đổi kiểu cơ bản của một enum nếu bạn muốn (byte -> int -> long) mà không cần phải làm gì hơn là biên dịch lại mã máy khách.

  • Bitfields dễ dàng hơn nhiều khi làm việc khi các bit và mặt nạ có thể được đặt tên. Và nếu bạn thêm các bit mới, bạn thường có thể sắp xếp mọi thứ để chỉ cập nhật các mặt nạ liên quan sẽ cho phép hầu hết mã hiện có của bạn xử lý các bitfield hoàn toàn mới mà không phải viết lại chúng từ đầu.

  • Tính nhất quán hỗ trợ chương trình. Nếu bạn cẩn thận với obfuscation và loại an toàn, enums cho phép bạn đại diện cho một danh sách các giá trị được đặt tên mà người dùng chọn từ với cùng một tên trong mã, nhưng không có chi phí hiệu quả của việc sử dụng chuỗi.

  • Mọi người đều hiểu tại sao các hằng số là mã tuyệt vời. Enums chỉ đơn giản là cung cấp cho bạn một cách để tổ chức một nhóm hằng số có liên quan. Bạn có thể đạt được điều tương tự một cách lộn xộn hơn bằng cách sử dụng một không gian tên của các const.

  • Sử dụng enum cho tham số thay vì bool không chỉ làm cho mã tự ghi nhận tài liệu, dễ đọc và ít bị lỗi hơn. Nó cũng làm cho nó dễ dàng hơn nhiều để thêm một tùy chọn thứ ba khi bạn nhận ra rằng hai tùy chọn là không đủ.

Như với tất cả các công cụ, enums có thể bị lạm dụng. Chỉ cần sử dụng chúng ở nơi chúng có ý nghĩa.

2) Tại sao sử dụng byte hoặc int thay vì chuỗi? Đơn giản là chúng nhỏ và hiệu quả.

+0

A - “… nhưng không có chi phí hiệu quả khi sử dụng dây.” Loại chi phí hiệu quả nào? B - Từ nhận xét của bạn cho Caspar Kleijne: “Nhưng hãy cẩn thận“ nhược điểm lớn ”của biến chỉ đọc và tĩnh: giá trị không thể được sắp xếp một cách hiệu quả vào mã khách hàng của bạn - nó phải được lấy từ vị trí nguồn liên tục”. giải thích về ý nghĩa của các giá trị của các biến tĩnh và chỉ đọc phải được lấy từ vị trí nguồn của nó và cách/tại sao enums khác nhau theo cách đó? – user437291

+1

A: chi phí hiệu quả của chuỗi: Chúng sử dụng nhiều bộ nhớ hơn và tốn nhiều thời gian CPU hơn để so sánh/sao chép so với byte hoặc int. B: Trình biên dịch có thể xây dựng các giá trị "const" hoặc "enum" trực tiếp vào mã ("so sánh số này với số 5"). Biến chỉ đọc/tĩnh không được lưu trữ trong mã, nhưng ở vị trí dữ liệu trong bộ nhớ. Khi mã muốn sử dụng các giá trị, nó phải đọc chúng từ vị trí đó ("so sánh số này với giá trị được lưu trữ trong vị trí bộ nhớ X"). Đọc một vị trí bộ nhớ xa xôi thường tốn kém hơn (chậm hơn) so với sử dụng một giá trị không đổi (mặc dù điều này có thể không phải lúc nào cũng đúng). –

+0

cảm ơn tất cả các bạn, tạm biệt – user437291

1

Bạn cũng có thể phân tích cú pháp Enum từ biểu diễn chuỗi. Bạn có thể nhận được chuỗi đó từ nguồn dữ liệu hoặc mục nhập người dùng.

Tôi nghĩ bạn đã bán tôi trên Enums tại "số ma thuật".

5

Tôi sẽ phỏng đoán rằng chúng yêu cầu các loại tích phân cơ bản để đảm bảo tính đơn giản của việc so sánh và dễ dàng hỗ trợ cờ bit hơn. Nếu không có giới hạn đó, chúng tôi, hoặc trình biên dịch, hoặc thời gian chạy, có thể phải dùng đến một số sự mờ nhạt để làm những việc như kết hợp - hoặc chúng tôi sẽ gặp phải tình huống - như bạn nói - chúng tôi không nên quan tâm đến loại cơ bản (điểm trừu tượng) và khi chúng tôi cố gắng nói A | B chúng tôi nhận được lỗi thời gian chạy vì chúng tôi đã sử dụng loại cơ bản không có khả năng loại hoạt động đó.

2

Một lợi ích là khi bạn muốn sử dụng enum làm cờ.

Vì vậy, nếu bạn xác định một enum như thế này:

[Flags] 
public enum TestEnum{ A, B, C, D }; 

Sau đó, nếu bạn có một phương pháp mà chấp nhận một thể hiện của TestEnum như là một biến, bạn có thể kết hợp các giá trị từ enum, vì vậy bạn có thể gửi cho ví dụ A | B | C làm tham số cho phương thức. Sau đó, bên trong phương pháp, bạn có thể kiểm tra tham số như sau:

if ((paramname & TestEnum.A) > 0) 
{ 
    //do things related to A 
} 
if ((paramname & TestEnum.B) > 0) 
{ 
    //do things related to B 
} 
//same for C and D 

Ngoài ra, tôi nghĩ lý do bạn đề cập đủ tốt để sử dụng enums.

Cũng liên quan đến nhận xét rằng bạn có thể buộc một giá trị sai thành một mã có mã như thế này (TestEnum)500; thật khó để làm gì nếu bạn không muốn phá vỡ mã của mình.

Điểm mà giá trị 0 cho enum phải là giá trị mặc định hoặc trong trường hợp cờ "sự vắng mặt của tất cả các cờ khác" là rất quan trọng, vì dòng TestEnum myenum sẽ instanciate myenum là 0 bất kể bạn có xác định bất kỳ giá trị enum nào cho 0 hay không.

1

Lợi ích chính của enum là các hằng số có thể được tham chiếu một cách nhất quán, rõ ràng và an toàn. Khả năng đọc là tất nhiên lợi thế trên cùng của việc sử dụng điều tra.

Một ưu điểm khác là các hằng số được liệt kê được tạo tự động bởi trình biên dịch.
Ví dụ, nếu bạn đã có một hằng số loại được liệt kê cho các mã lỗi có thể xảy ra trong chương trình của bạn, định nghĩa enum của bạn có thể trông giống như thế này: enum ERROR_CODE { OUT_OF_MEMORY, FILE_NOT_FOUND }; OUT_OF_MEMORY được tự động gán giá trị 0 (0) bởi trình biên dịch vì nó xuất hiện đầu tiên trong định nghĩa.FILE_NOT_FOUND bằng 1, v.v. Nếu bạn đã tiếp cận cùng một ví dụ bằng cách sử dụng hằng số biểu tượng hoặc số Magic, bạn viết nhiều mã hơn để thực hiện tương tự.

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