Có một số câu hỏi liên quan here và here, nhưng chúng không thực sự mang lại cho tôi câu trả lời thỏa đáng. Vấn đề là các enums lồng trong một lớp trong C# không thể có cùng tên như một thuộc tính của lớp. Ví dụ của tôi:Xung đột Enum và Xung đột đặt tên thuộc tính
public class Card
{
public enum Suit
{
Clubs,
Diamonds,
Spades,
Hearts
}
public enum Rank
{
Two,
Three,
...
King,
Ace
}
public Suit Suit { get; private set; }
public Rank Rank { get; private set; }
...
}
Có một vài tùy chọn để giải quyết vấn đề này, nhưng có vẻ như không phù hợp với tôi.
Tôi có thể di chuyển các enums ra ngoài lớp học, nhưng sau đó bạn chỉ cần nói Suit
thay vì Card.Suit
, điều này có vẻ sai với tôi. Suit
nằm ngoài ngữ cảnh của Card
là gì?
Tôi có thể di chuyển chúng ra ngoài lớp và thay đổi chúng thành một thứ như CardSuit
và CardRank
, nhưng sau đó tôi cảm thấy như tôi đang nướng thông tin ngữ cảnh vào tên của enum, khi điều đó phải được xử lý bởi một lớp hoặc tên không gian tên.
Tôi có thể thay đổi tên của các enums thành Suits
và Ranks
, nhưng điều này vi phạm Microsoft's naming guidelines. Và nó không cảm thấy đúng.
Tôi có thể thay đổi tên thuộc tính. Nhưng với cái gì? Nó cảm thấy trực giác với tôi muốn nói Suit = Card.Suit.Spades
.
Tôi có thể di chuyển các enums vào một lớp tĩnh riêng biệt được gọi là CardInfo
chỉ chứa các enums này. Nếu tôi không thể nghĩ ra điều gì khác, tôi nghĩ đây là lựa chọn tốt nhất.
Vì vậy, tôi tự hỏi những gì người khác đã làm trong các tình huống tương tự. Nó cũng sẽ được tốt đẹp để biết lý do tại sao điều này là không được phép. Có lẽ Eric Lippert hay ai đó có thể kêu gọi quyết định cấm nó? Dường như nó chỉ tạo ra sự mơ hồ trong lớp học và điều này có thể được giải quyết bằng cách buộc sử dụng this.Suit
cho tên thuộc tính. (Tương tự như định hướng giữa người dân địa phương và các thành viên.) Tôi cho rằng điều này đã bị bỏ sót do điều "every feature starts with -100 points", nhưng tôi sẽ tò mò về các cuộc thảo luận xung quanh vấn đề này.
Cảm ơn phản hồi, mọi người. Tôi đang đi với 'CardInfo', nhưng tôi không nghĩ có một câu trả lời kinh điển ở đây. Có rất nhiều lựa chọn phong nha, và tôi nghĩ nó đi theo phong cách. –
Làm tổ 'enum' là ok nếu bạn định sử dụng chúng chỉ (chủ yếu?) Bên trong lớp. Sau đó, bạn phải đặt tên 'enum' * hơi * khác (thêm * Loại *, * Chế độ *, * Tùy chọn *, v.v ...) để tránh xung đột tên với trường/thuộc tính. Nếu có nhiều người dùng 'enum' bên ngoài lớp, thì việc lồng nhau là một ý tưởng tồi. Bạn có thể khai báo nó trong cùng một tệp cs (để có ít nhất một số loại quan hệ với lớp mà nó được sử dụng). Làm tổ là không mong muốn trong wpf quá (không nhất thiết phải 'enum', nhưng nói chung). – Sinatr