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

时间:2009-01-30 10:24:29

标签: c# .net enums naming-conventions

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

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(); }
  }
}

如果状态枚举对于不同的类型是通用的,我会把它放在课外,问题就解决了。但Status仅适用于Car,因此在类外声明枚举是没有意义的。

在这种情况下你使用什么命名约定?

注意:this question答案的评论中对此问题进行了部分辩论。由于它不是问题,因此没有太多可见性。

编辑:Filip Ekberg建议IMO针对“状态”的具体案例提供出色的解决方法。然而,我很有兴趣阅读枚举/属性名称不同的解决方案,如Michael Prewecki的回答

EDIT2(2010年5月):我最喜欢的解决方案是按照Chris S.的建议复数枚举类型名称。根据MS指南,这应仅用于标记枚举。但我越来越喜欢它了。我现在也将它用于常规枚举。

8 个答案:

答案 0 :(得分:34)

“关闭”,“开始”和“移动”的定义是我称之为“状态”的。当你暗示你正在使用“状态”时,它就是你的“状态”。原来如此!

public class Car
{
  public enum State
  {
    Off,
    Starting,
    Moving
  };

  State state = State.Off;

  public State Status
  {
    get { return state ; }
    set { state= value; DoSomething(); }
  }
}

如果我们从你所说的那个中使用“Type”这个词的另一个例子,那么在这种情况下:

public class DataReader
{
    public enum Type
    {
        Sql,
        Oracle,
        OleDb
    }

    public Type Type { get; set; } // <===== Won't compile =====

}

你真的需要看到枚举和枚举之间有区别吗,对吧?但是在创建框架或谈论架构时,您需要关注相似性,好吧,让我们找到它们:

当某件事设置为某个州时,它被定义为“事物”状态

示例:Car的状态处于Running State,Stopped State等状态。

你想在第二个例子中想要实现的是:

myDataReader.Type = DataReader.Database.OleDb

你可能会认为这反对我一直在向别人讲道,你需要遵循一个标准。但是,你遵循标准! Sql-case也是一个特定的案例,因此需要一些特定的解决方案。

但是,枚举可以在System.Data空间内重复使用,这就是模式的全部内容。

使用“类型”查看的另一个案例是“动物”,其中“类型”定义“物种”。

public class Animal
    {
        public enum Type
        {
            Mammal,
            Reptile,
            JonSkeet
        }

        public Type Species{ get; set; }

    }

这是一个模式,你不需要特别“知道”这个对象而你没有指定“AnimalType”或“DataReaderType”,你可以在你选择的命名空间中重用枚举。 / p>

答案 1 :(得分:30)

我会在讨论中添加1欧元,但可能不会添加任何新内容。

显而易见的解决方案是将状态移出嵌套的枚举。大多数.NET枚举(除了可能是Windows.Forms命名空间中的一些)都没有嵌套,这使得使用API​​的开发人员很烦人,必须在类名前加上。

未提及的一件事是根据MSDN指南的标记枚举应该be pluralized nouns您可能已经知道(状态是一个简单的枚举,所以应该使用单数名词)

状态(enum called States)是一种称呼,“状态”是一个名词的主格,英语就像我们大部分语言从拉丁语中吸收的那样。 Vocative是你为其条件命名的名词,而主格是动词的主语。

所以换句话说,当汽车正在移动时,那就是动词 - 移动就是它的状态。但是汽车没有发动,它的引擎确实如此。也没有启动,引擎确实(你可能在这里选了一个例子,所以这可能是无关紧要的)。

public class Car
{
  VehicleState _vehicleState= VehicleState.Stationary;

  public VehicleState VehicleState 
  {
    get { return _vehicleState; }
    set { _vehicleState = value; DoSomething(); }
  }
}

public enum VehicleState
{
    Stationary, Idle, Moving
}

国家是这样一个广义名词,描述它所指的是什么状态不是更好吗?就像我上面做的那样

我视图中的类型示例并未引用读者类型,而是引用其数据库。如果您描述读者的数据库产品并不一定与读者类型相关(例如读者的类型可能只是转发,缓存等等),我更愿意这样做。所以

reader.Database = Databases.Oracle;

实际上,这不会发生,因为它们被实现为驱动程序和继承链而不是使用枚举,这就是为什么上面的行看起来不自然。

答案 2 :(得分:9)

我认为这里的真正问题是枚举状态已封装在您的类中,因此Car.Status对属性Status和枚举Status

都不明确

更好的是,把你的枚举放在课堂之外:

public enum Status
{
    Off,
    Starting,
    Moving
}

public class Car
{
    public Status Status
    { ... }
}

<强>更新

由于下面的评论,我将在上面解释我的设计。

我是一个不相信枚举或类或任何其他对象应该驻留在 in 另一个类中的人,除非它在该类中完全是私有的。以上面的例子为例:

public class Car
{
    public enum Status
    {...}
    ...
    public Status CarStatus { get; set;}
}

虽然有些评论者会认为Status在Car类的范围之外没有任何意义,但是您设置 public 属性的事实意味着该程序的其他部分使用该枚举:

public Car myCar = new Car();
myCar.CarStatus = Car.Status.Off;

对我来说是代码味道。如果我要查看Car之外 的状态,我也可以在之外定义

因此,我可能会将其重命名为:

public enum CarStatus
{...}

public class Car
{
    ...
    public CarStatus Status { get; set; }
}

但是,如果该枚举将在中使用且仅在汽车类中使用,那么我可以在那里声明枚举。

答案 3 :(得分:4)

我知道我的建议违反了.NET命名约定,但我个人在枚举中加上'E'和枚举标记为'F'(类似于我们如何使用'I'作为前缀接口)。我真的不明白为什么这不是惯例。枚举/标志是一种特殊情况,如接口,永远不会改变它们的类型。它不仅清楚地说明了它是什么,因为前缀将过滤大多数其他类型/变量/等,因此输入intellisense非常容易,并且您不会有这些命名冲突。

这也解决了另一个问题,对于WPF中的示例,他们使用静态类,如枚举(例如FontWeights),它们具有预定义类型的实例,但您不知道是否不搜索它。如果他们只是用'E'作为前缀,那么您只需输入字符就可以找到这些特殊的静态类。

答案 4 :(得分:4)

匈牙利符号的仇恨者及其变种被诅咒。我使用后缀枚举的约定 - 等待它 - Enum。因此,我从来没有遇到过你所描述的问题,浪费时间担心要调用它们的代码,代码是可读的和自我描述的。

public class Car
{
  public enum StatusEnum
  {
    Off,
    Starting,
    Moving
  };

  public StatusEnum Status { get; set; }

}

答案 5 :(得分:2)

我将属性的名称更改为“CurrentStatus”。快点一点:)

答案 6 :(得分:1)

我建议在类型名称中添加“Option”(如果它包含位标志,则为Flag),即type为Car.StatusOption,属性为Car.Status。

与复数相比,这可以避免在创建枚举类型的集合时命名冲突,您通常希望将集合属性复数,而不是枚举类型。 / p>

答案 7 :(得分:0)

我通常在枚举前加上前缀,例如: CarStatus。我想这一切都取决于你正在使用的团队(如果他们有这种事情的任何规则/流程)和对象的使用。只需我2美分(: