我经常发现自己实现了一个类来维护某种自己的状态属性作为枚举:我有状态类型的状态枚举和状态属性.我该如何解决这个名称冲突?
public class Car
{
public enum Status
{
Off,
Starting,
Moving
};
Status status = Status.Off;
public Status Status // <===== Won't compile =====
{
get { return status; }
set { status = value; DoSomething(); }
}
}
Run Code Online (Sandbox Code Playgroud)
如果Status enum对于不同的类型是通用的,我会把它放在课外,问题就会解决.但Status仅适用于Car,因此在类外声明枚举是没有意义的.
在这种情况下你使用什么命名约定?
注意:在回答这个问题的评论中,对这个问题进行了部分辩论.由于这不是主要问题,因此没有太多可见性.
编辑:Filip Ekberg建议IMO针对"状态"的具体案例提供出色的解决方法.然而,我很有兴趣阅读关于枚举/属性名称不同的解决方案,如Michael Prewecki的回答.
EDIT2(2010年5月):我最喜欢的解决方案是按照Chris S的建议复数枚举类型名称.根据MS指南,这应该仅用于标记枚举.但我越来越喜欢它了.我现在也将它用于常规枚举.
使用具有枚举属性的类时,通常会在属性名称和枚举类型之间产生命名冲突.例:
enum Day{ Monday, Tuesday, ... }
class MyDateClass
{
private Day day;
public Day Day{ get{ return day; } }
}
Run Code Online (Sandbox Code Playgroud)
由于只有标志枚举应具有多个名称,因此将枚举"Days"命名为非标记枚举的方式.在上面的示例中,您可以对枚举或属性使用"WeekDay"之类的变体.但是在一般情况下没有像这样的好的变化,所以你最终使用像"FooMode"或"BarKind"这样的属性来获得具有Foo和Bar类型的枚举属性的对象.不那么优雅.
在这种情况下,您通常如何命名枚举和属性?
感谢您的快速回复.另一个问题:为什么不建议嵌套公共枚举,如果要嵌套公共枚举,如何解决命名问题?
class Vehicle
{
enum Kind{ Car, Bike }
public Kind Kind{ get{ return ... } }
}
class Meal
{
enum Kind{ Dessert, MainCourse }
public Kind Kind{ get{ return ... } }
}
Run Code Online (Sandbox Code Playgroud)
在上面的场景中,假设Meal和Vehicle共享相同的命名空间,我不能在其中任何一个类之外移动"Kind"而不分别将它重命名为MealKind和VehicleKind.我喜欢这个样子
myVehicle.Kind = Vehicle.Kind.Car
Run Code Online (Sandbox Code Playgroud)
但这不是guidlines推荐的内容.这里最好的做法是什么?永远不要使用嵌套的公共枚举,而是将它们命名为VehicleKind等?
这里和这里有一些相关的问题,但它们并没有真正给我满意的答案.问题是嵌套在C#中的类的枚举不能与类的属性具有相同的名称.我的例子:
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; }
...
}
Run Code Online (Sandbox Code Playgroud)
有一些选项可以解决这个问题,但它们对我来说似乎并不合适.
我可以在课堂外移动枚举,但是你只会说Suit而不是Card.Suit,这对我来说似乎不对.什么是Suit外界的背景Card?
我可以移动它们的类外,并将其更改为类似CardSuit和CardRank,但后来我觉得我在烤的上下文信息到枚举时,应该由一个类或命名空间名称进行处理的名称.
我可以改变枚举到的名字Suits和Ranks,但是这违反了微软的命名规则.它感觉不对劲.
我可以更改属性名称.但到了什么?我觉得直觉对我来说是对的Suit = Card.Suit.Spades.
我可以将枚举移动到一个单独的静态类中,该类CardInfo只包含这些枚举.如果我不能提出任何其他建议,我认为这是最好的选择.
所以我想知道其他人在类似的情况下做了什么.知道为什么不允许这样做也很好.也许埃里克·利珀特(Eric Lippert)或其他人可能会决定禁止它?它似乎只会在类中产生歧义,这可以通过强制使用this.Suit …