2012-10-03 16 views
13

Hãy tưởng tượng điều này enum trong một DLL.Việc thêm các giá trị enum có phá vỡ tính tương thích nhị phân không?

public enum Colors 
{ 
    Red, 
    Green 
} 

Việc thêm giá trị enum có phá vỡ tính tương thích nhị phân không? Nếu tôi thay đổi nó, các EXE hiện tại có bị phá vỡ không?

public enum Colors 
{ 
    Red, 
    Green, 
    Blue 
} 

tôi thấy this answer, nhưng nó dường như để giải quyết trường hợp của chèn một giá trị. Nếu tôi thêm giá trị vào kết thúc chỉ, thì có được không?

Trả lời

17

Không, điều này không phá vỡ khả năng tương thích nhị phân (trong nhiều như: lắp ráp vẫn sẽ tải vv), bởi vì enums về cơ bản là hằng số nguyên nguyên. Chèn các giá trị ở giữa rõ ràng là một ý tưởng thực sự nguy hiểm, nhưng bạn đã loại trừ điều đó.

Tuy nhiên, nó có thể gây ra một số vấn đề khác mà bạn cần để bảo vệ chống lại:

  • một số mã (switch báo cáo đặc biệt) có thể không lường trước những giá trị mới; kỹ thuật này là một vấn đề trước khi quá, vì sự đếm không giá trị kiểm tra (biến enum có thể chứa các giá trị không xác định)
  • bất cứ điều gì mà truy vấn enums sẵn là sẽ nhận được kết quả khác nhau
    • nói riêng, serialization và deserialization có thể thất bại bất ngờ nếu có dữ liệu sử dụng enums mà chưa được mong đợi của khách hàng đặc biệt
+1

Tuyệt vời. Tôi có thể làm gì để chống lại vỡ? Rõ ràng, nếu tôi có nó theo cách của tôi, tôi sẽ không được thêm vào enums, nhưng với hoàn cảnh, cách an toàn nhất để tiếp cận điều này là gì? Trong trường hợp báo cáo chuyển đổi (chơi không mong muốn), sẽ có khe 'default:' được chỉ định làm cứng nó trước các thay đổi? – TheBuzzSaw

+1

@ TheBuzzSaw Cách tốt nhất để chống lại vỡ là không sử dụng enums cho bất cứ điều gì mà bạn mong đợi sẽ không giữ nguyên cho đến cuối thời gian. – Servy

+0

@Servy Đồng ý ... nhưng kể từ khi tôi bị mắc kẹt với enums ngay bây giờ, những gì khác bạn có? ;) – TheBuzzSaw

3

Nó nên được tốt, giả sử bạn chỉ thêm đến cùng. Tuy nhiên, nguy cơ phá vỡ sẽ đến từ thực tế là các giá trị enum được xác định ngầm, bắt đầu từ 0. Vì vậy, nếu ai đó kiên trì các giá trị cho DB, bạn có nguy cơ thay đổi giá trị mà chúng ánh xạ tới.

Ví dụ, nếu bạn thay đổi enum của bạn là:

public enum Colors 
{ 
    Blue, 
    Red, 
    Green 
} 

Bất cứ ai lưu trữ các giá trị trong DBS của họ sẽ thấy rằng điều đó đã từng đỏ, bây giờ là màu xanh, và những gì là màu xanh lá cây tại là Màu đỏ.

Tốt nhất, bạn nên xác định enum của bạn như vậy:

public enum Colors 
{ 
    Red = 0, 
    Green = 1 
} 

Và sau đó, khi bạn thêm một hình mới, bạn nên có:

public enum Colors 
{ 
    Red = 0, 
    Green = 1, 
    Blue = 2 
} 

Điều này sẽ giúp ngăn chặn bất kỳ vấn đề versioning tiềm năng .

+0

+1. Tôi cũng sẽ kiểm tra màu xanh lá cây nếu tôi có thể. Đây là một cách thông minh để làm cho enums chắc chắn hơn. – TheBuzzSaw

+0

Lưu ý rằng các đặc tả nêu rõ rằng, nếu bạn không chỉ định bất kỳ giá trị nào, nó sẽ bắt đầu bằng 0 và tăng thêm một giá trị cho mỗi giá trị, vì vậy nó không giống như số nguyên sao lưu là hành vi không xác định cho trường hợp đầu tiên. Bạn chỉ có thể thêm vào cuối. – Servy

+0

Phải, nhưng bạn phải thêm nó vào cuối hoặc nếu không nó sẽ bị hỏng. –