枚举和匹配属性的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(); }
  }
}

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

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

注:这个问题在回答这个问题的评论中部分进行了辩论。 由于这不是主要问题,所以没有得到多大的知名度。

编辑:菲利普Ekberg建议国际海事组织优秀的解决方案,为'状态'的具体情况。 然而,我很有兴趣阅读关于枚举/属性名称不同的解决方案,例如Michael Prewecki的答案。

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


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

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

有一点没有提到的是,根据MSDN准则,标志枚举应该是你可能已经知道的复数名词(Status是一个简单的枚举,所以应该使用单数名词)。

州(enum称为国家)是呼号,“状态”是名词的主格,英语与大多数我们的语言一样从拉丁文吸收。 Vocative是你为其状况命名的名词,而nominative是动词的主语。

换句话说,当汽车行驶时,这就是动词 - 移动就是它的状态。 但是汽车并没有熄灭,它的引擎确实如此。 它也不是从引擎开始的(你可能在这里选择了一个例子,所以这可能是不相关的)。

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;

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


“关”,“开始”和“移动”的定义就是我所说的“国家”。 当你暗示你正在使用“国家”时,它就是你的“身份”。 所以!

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 =====

}

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

当一些东西被设置为一个国家时,它被定义为“事物”状态

示例:汽车状态处于运行状态,停止状态等。

你想在第二个例子中达到什么样的目的是这样的:

myDataReader.Type = DataReader.Database.OleDb

你可能会认为这与我一直在向别人讲道的事情有关,你需要遵循一个标准。 但是,你正在遵循一个标准! Sql-case也是一个特例,因此需要一些具体的解决方案。

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

使用“Type”查看的另一个案例是“Animal”,其中Type定义了种类。

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

        public Type Species{ get; set; }

    }

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


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

更好的是,把你的enum放在课外:

public enum Status
{
    Off,
    Starting,
    Moving
}

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

UPDATE

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

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

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

虽然有些评论者认为Status没有超出Class Car范围的含义,但您设置公共财产的事实意味着该程序的其他部分将使用该枚举:

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

对我而言,这是一种代码味道。 如果我要在Car外看到这种状态,我也可以在外面定义它。

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

public enum CarStatus
{...}

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

但是,如果这个枚举将在汽车类内部使用,那么我可以在那里声明枚举。

链接地址: http://www.djcxy.com/p/54413.html

上一篇: C# naming convention for enum and matching property

下一篇: Determine if two given time ranges overlap