2017-12-13 90 views
6

Tôi đã rất ngạc nhiên, nhưng enums có thể được tạo ra với hàm tạo trong C#. Ví dụ, tôi có enum:Làm thế nào để ngăn chặn các nhà xây dựng enum

public enum Color 
{ 
    White = 1, 
    Red = 2 
} 

Sau đó, nó có thể được tạo ra như thế này:

var color = new Color(); 

Và giá trị sẽ là 0, mà thực sự là không có giá trị enum hợp lệ.

Vì vậy, chúng tôi có thể cấm các nhà thầu enum bằng cách nào đó không? Bất kỳ ý tưởng khác làm thế nào để tránh điều này?

Cảm ơn.

+3

'var color = (Color) 125;' cũng hoàn toàn hợp pháp. Bạn phải tự kiểm tra xem giá trị có hợp lệ khi đọc biến enum hay không ... – Haukinger

+1

Xem https://msdn.microsoft.com/en-us/library/ms182149.aspx Tại sao bạn cần gán giá trị cho một giá trị không cờ enum? – PaulF

+0

0 là mặc định cho bất kỳ loại giá trị nào cho dù đó là hợp lệ hay không và không thể thay đổi. Bạn đang sử dụng enum để làm gì? Có lẽ nếu chúng ta có nhiều ngữ cảnh hơn, chúng ta có thể đề nghị một sự thay thế. – Equalsk

Trả lời

9

Vì vậy, chúng tôi có thể cấm các nhà thầu enum bằng cách nào đó không?

No. Vấn đề không liên quan chặt chẽ đến bản thân nhà xây dựng: (Color)0 cũng hợp lệ vì loại cơ bản có thể có giá trị 0.

Bất kỳ ý tưởng nào khác về cách tránh điều này?

Không, đây thực chất là vấn đề lớn hơn. Cách duy nhất bạn có thể ngăn chặn điều này là bằng cách kiểm tra các giá trị đầu vào của bạn về tính hợp lệ.

Bạn phải luôn có giá trị enum 0 enum theo Code Analysis.

+1

Bạn thậm chí không cần phải truyền '0' để gán nó vào một enum. –

+0

@MatthewWatson Đồng ý, nhưng nếu không mẫu mã sẽ khó hiểu. –

1

Không có cách nào để tránh nó nói chung. Bạn có thể có một cảnh báo phân tích tĩnh, nhưng nó không giải quyết được vấn đề tiềm ẩn mà enum chỉ là một số và vì vậy nó có thể có giá trị 123. Thông thường nó sẽ có giá trị bằng 0 (ví dụ nếu bạn mới, hoặc không chỉ định nó).

Để xem các vấn đề rõ ràng hơn, hãy xem xét điều này:

var colors = new Color[100]; 

colors[0] là gì bây giờ? Số không, giống như bất kỳ số nào chưa được khởi tạo. Vì vậy, một enum cho phép bạn đặt tên cho các giá trị - nó không không đảm bảo rằng các biến của loại sử dụng một trong những giá trị được đặt tên đó. Một thực hành tốt nhất là luôn luôn có một giá trị tên cho số không trong enum của bạn (thường trong trường hợp này nó sẽ được gọi là "Không", "Uninitialised", "NotSet" hoặc tương tự). Một khi bạn có điều đó, các giá trị uninitialized sẽ có ý nghĩa.

1

public enum Color thực sự là dạng rút gọn của khai báo đầy đủ của một enum, là public enum Color : int.

An enum luôn là có loại cơ sở cơ bản và chỉ về mặt kỹ thuật là biến của loại đó. Theo mặc định, loại này là số nguyên 32 bit, có nghĩa là bất kỳ số nguyên 32 bit nào cũng có thể được gán cho một enum như vậy.

Định nghĩa enum thực tế chỉ được đặt tên thành viên của loại đó để dễ sử dụng trong lập trình, cho phép bạn thay đổi hoặc thậm chí bỏ qua hoàn toàn các giá trị cơ bản mà không cần thay đổi mã.

Nhưng trong nội bộ, tất cả enums loại Color của bạn (tên khủng khiếp, bằng cách này) là những giá trị chỉ Int32, và as Anders Forsgren pointed out, giống như bất kỳ giá trị Int32 khác, họ sẽ mặc định 0 trong mảng và bất kỳ loại biến toàn cục. Đây cũng là lý do tại sao các hướng dẫn chính thức khuyên bạn nên luôn đặt định nghĩa 0 trong enum của bạn.

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