相关疑难解决方法(0)

枚举和匹配属性的C#命名约定

我经常发现自己实现了一个类来维护某种自己的状态属性作为枚举:我有状态类型的状态枚举和状态属性.我该如何解决这个名称冲突?

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指南,这应该仅用于标记枚举.但我越来越喜欢它了.我现在也将它用于常规枚举.

.net c# enums naming-conventions

90
推荐指数
5
解决办法
5万
查看次数

枚举和属性命名冲突

使用具有枚举属性的类时,通常会在属性名称和枚举类型之间产生命名冲突.例:

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等?

.net c#

42
推荐指数
2
解决办法
9922
查看次数

嵌套枚举和属性命名冲突

这里这里有一些相关的问题,但它们并没有真正给我满意的答案.问题是嵌套在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

我可以移动它们的类外,并将其更改为类似CardSuitCardRank,但后来我觉得我在烤的上下文信息到枚举时,应该由一个类或命名空间名称进行处理的名称.

我可以改变枚举到的名字SuitsRanks,但是这违反了微软的命名规则.它感觉不对劲.

我可以更改属性名称.但到了什么?我觉得直觉对我来说是对的Suit = Card.Suit.Spades.

我可以将枚举移动到一个单独的静态类中,该类CardInfo只包含这些枚举.如果我不能提出任何其他建议,我认为这是最好的选择.

所以我想知道其他人在类似的情况下做了什么.知道为什么不允许这样做也很好.也许埃里克·利珀特(Eric Lippert)或其他人可能会决定禁止它?它似乎只会类中产生歧义,这可以通过强制使用this.Suit …

.net c# enums

29
推荐指数
2
解决办法
4593
查看次数

标签 统计

.net ×3

c# ×3

enums ×2

naming-conventions ×1