2008-10-17 40 views
37

Khi sử dụng một lớp có thuộc tính enum, thường có xung đột tên giữa tên thuộc tính và loại enum. Ví dụ:Xung đột đặt tên và thuộc tính

enum Day{ Monday, Tuesday, ... } 

class MyDateClass 
{ 
    private Day day; 

    public Day Day{ get{ return day; } } 
} 

Vì chỉ có cờ enums nên có tên số nhiều, đặt tên cho các enum "Ngày" không phải là cách để đi cho một enum phi cờ. Trong ví dụ trên, bạn có thể sử dụng một số biến thể như "WeekDay" cho enum hoặc thuộc tính. Nhưng trong trường hợp chung không có biến thể tốt như vậy, do đó bạn sẽ sử dụng các thuộc tính như "FooMode" hoặc "BarKind" cho một đối tượng có thuộc tính enum của kiểu Foo và Bar. Không quá tao nhã.

Làm thế nào để bạn thường đặt tên cho enums và thuộc tính trong trường hợp này?


Cảm ơn phản hồi nhanh. Một câu hỏi khác: tại sao nó không được khuyến khích để làm tổ enums công cộng, và làm thế nào để bạn giải quyết các vấn đề đặt tên nếu bạn muốn làm tổ enums công cộng?

class Vehicle 
{ 
    enum Kind{ Car, Bike } 

    public Kind Kind{ get{ return ... } } 
} 

class Meal 
{ 
    enum Kind{ Dessert, MainCourse } 

    public Kind Kind{ get{ return ... } } 
} 

Trong trường hợp trên, Bữa ăn và Xe có chung không gian tên, tôi không thể di chuyển "Loại" bên ngoài một trong các lớp mà không đổi tên nó là MealKind và VehicleKind tương ứng. Tôi thích giao diện của

myVehicle.Kind = Vehicle.Kind.Car 

Nhưng đó không phải là những gì các hướng dẫn đề xuất. Thực hành tốt nhất ở đây là gì? Không bao giờ sử dụng các enums công cộng lồng nhau và thay vào đó đặt tên cho chúng là VehicleKind, vv?

+0

Nó sẽ không hoạt động trong một kịch bản lồng nhau. Sau đó, rõ ràng là một cuộc đụng độ tên. Tôi thậm chí không nghĩ rằng sử dụng một 'sử dụng' bí danh sẽ làm việc trong trường hợp này. – leppie

+1

Enum lồng nhau làm cho mã dài hơn và được gắn chặt với lớp. Oh, và trong ví dụ của bạn, bạn có thể muốn lấy xe và xe đạp từ xe và tráng miệng và MainCourse từ bữa ăn, vì vậy không cần phải enum :) – OregonGhost

+0

Giả sử bạn cần enum (tức là loại phải được sử dụng như một giá trị, không một phân lớp), không phải là nó đẹp hơn khi có các enum lồng nhau công khai hơn là có rất nhiều enums bắt đầu với tên lớp như VehicleKind? Ví dụ khi đổi tên lớp, tất cả các enums chỉ thuộc lớp đó phải được đổi tên ... – AndersF

Trả lời

8

Miễn là liệt kê không được lồng trong MyDateClass, tôi không thấy đó là vấn đề. Nó không phổ biến (theo kinh nghiệm của tôi) để có một tài sản có cùng tên với kiểu nó trả về. Tôi sẽ xem liệu tôi có thể tìm thấy một số ví dụ trong khuôn khổ ...

EDIT: ví dụ đầu tiên: DateTimeOffset.DateTime (không phải là một enum, nhưng đó là một chút không thích hợp)

+0

Đó là khá phổ biến cho các lớp phát ra dịch vụ web. – leppie

29

Không có xung đột. Trên thực tế, số .NET Framework style guide encourages you to do this, ví dụ: nếu bạn có một lớp có một thuộc tính duy nhất của một kiểu (không quan trọng nếu enum hoặc class), thì bạn nên đặt tên nó giống nhau. Ví dụ điển hình là thuộc tính Màu của loại Màu. Nó là tốt, trừ khi có hai màu sắc - trong trường hợp đó cả hai nên thêm một cái gì đó vào tên (tức là BackColor và ForeColor, thay vì màu sắc và BackColor).

+0

Ví dụ kinh điển về điều này trong tâm trí của tôi là DbCommand.CommandType là loại CommandType. –

+8

Lưu ý rằng điều này không hoạt động khi enum được lồng vào bên trong loại khai báo trường enum, như đã đề cập trong các câu trả lời khác. – yoyo

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