我经常发现自己实现一个类保持某种自己的状态属性为一个枚举:我有一个状态枚举和状态类型之一的地位财产。 我应该如何解决这个名称冲突?
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(); }
}
}
如果状态枚举是共同的不同类型,我把它的类外,问题就迎刃而解了。 但状态适用于汽车仅因此它没有意义申报类的外部枚举。
你在这种情况下使用什么命名约定?
注意:这个问题在回答的意见被部分讨论这个问题 。 因为这不是主要问题,它并没有得到太多的知名度。
编辑:菲利普埃克伯格提出了“状态”的特定情况下的IMO优秀的解决方法。 然而,在枚举/属性的名称是不同的,如迈克尔Prewecki的答案,我会很有趣的阅读解决方案。
EDIT2(2010年5月):我最喜欢的解决办法是变复数枚举类型名,由克里斯·S.的建议根据MS的指导方针,这应该仅用于标志枚举。 但是我来喜欢它越来越多。 我现在用它定期枚举为好。
Answer 1:
我要添加1欧元,讨论,但它可能不会增加任何新的东西。
显而易见的解决方案是将状态出的是一个嵌套枚举。 大多数.NET枚举(可能除了一些在Windows.Forms的命名空间)没有嵌套,这让恼人用于开发消耗你的API,其前缀的类名。
尚未提到的一件事是,根据MSDN指引标志枚举应被使用复数名词 ,你可能已经知道(状态是一个简单枚举所以单数名词,应使用)。
国家(枚举称为美国)是呼,“状态”是一个名词的主格,英国人最喜欢我们的语言来自拉丁美洲吸收。 呼是你的名字作为其条件的名词和主格是动词的主语。
因此,换句话说,当汽车在行驶 ,这是动词-移动是其状态。 但汽车并没有熄灭,它的发动机一样。 它也没有启动,发动机做(你可能选择了一个例子这里,所以这可能是无关紧要的)。
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;
在现实中,因为它们可以作为驱动器以及一个继承链,而不是使用枚举这就是为什么线之上看起来不自然实现这永远不会发生。
Answer 2:
的“关”,“启动”和“移动”的定义是什么,我会称之为“国家”。 而当你在暗示你使用的是“国家”,这是你的“状态”。 所以!
public class Car
{
public enum State
{
Off,
Starting,
Moving
};
State state = State.Off;
public State Status
{
get { return state ; }
set { state= value; DoSomething(); }
}
}
如果我们从一个说,你想用“类型”等在此情况下另一个例子:
public class DataReader
{
public enum Type
{
Sql,
Oracle,
OleDb
}
public Type Type { get; set; } // <===== Won't compile =====
}
你真的需要看到有枚举和枚举之间的区别,对不对? 但是,创造一个框架或谈论你需要把重点放在simillarities体系结构时,确定可以找到它们:
当事情被设置为一个国家,它的定义为“东西”状态
例如:汽车的状态处于行驶状态时,停止状态,等等。
要在第二个例子中,以acheive什么是有些这样的:
myDataReader.Type = DataReader.Database.OleDb
你可能会认为这对说什么,我一直在宣扬给别人,你需要遵循的标准。 但是,你是以下标准! 在SQL-情况下是特定的情况下藏汉,因此需要稍微具体的解决方案。
然而,枚举将是可重复使用的内System.Data
空间,这就是模式是怎么一回事。
另一种情况看与“类型”是“动物”,其中Type定义的物种。
public class Animal
{
public enum Type
{
Mammal,
Reptile,
JonSkeet
}
public Type Species{ get; set; }
}
这也是继的模式,你不specificly需要“知道”这个对象,你是不是specifing“AnimalType”或“DataReaderType”,你可以在你选择的命名空间重新使用枚举。
Answer 3:
我觉得这里真正的问题是,枚举状态在您的类中封装,使得Car.Status
不明确双方的财产Status
和枚举Status
更重要的是,把你的枚举类的外:
public enum Status
{
Off,
Starting,
Moving
}
public class Car
{
public Status Status
{ ... }
}
UPDATE
由于下面的评论中,我将解释我上面的设计。
我是一个谁不相信,枚举或类或任何其他对象应驻留在另一个类中 ,除非它是类中完全私人的。 就拿上面的例子,例如:
public class Car
{
public enum Status
{...}
...
public Status CarStatus { get; set;}
}
虽然一些评论者会说,状态没有级车范围以外的任何意义,事实上,你要设置的公共属性意味着有将使用该枚举程序的其他部分:
public Car myCar = new Car();
myCar.CarStatus = Car.Status.Off;
这对我来说是一个代码味道。 如果我要去看看外面那个地位Car
,我还不如外面定义它。
因此,我可能只是将其重命名为:
public enum CarStatus
{...}
public class Car
{
...
public CarStatus Status { get; set; }
}
但是,如果将枚举内只在汽车类中使用,那么我很好声明枚举类型。
Answer 4:
我知道我的建议违背了.NET命名约定,但我与“E”和枚举标志用“F”个人前缀枚举(类似于我们如何前缀“我”接口)。 我真的不明白为什么这不是惯例。 枚举/标志是一样的接口,将永远不会改变他们的类型的一个特例。 它不仅使得它清楚什么,这是很容易的智能感知键入因为前缀将过滤大多数其他类型/变量/等,你不会有这些命名冲突。
而这也将解决,其中在WPF例子,他们使用静态类,如枚举(如FontWeights)具有类型预先定义的情况下,另一个问题,但你不会不知道,如果你不寻找它。 如果他们只是用“E”前缀他们,你必须做的就是键入字符来找到这些特殊的静态类。
Answer 5:
匈牙利表示法及其变种的仇敌被定罪。 我用枚举后面添加一个约定-等待它- Enum
。 我啥都不会有你所描述的问题,浪费时间去担心什么,打电话给他们,代码可读性和自描述的引导。
public class Car
{
public enum StatusEnum
{
Off,
Starting,
Moving
};
public StatusEnum Status { get; set; }
}
Answer 6:
我的属性的名称更改为类似“CurrentStatus”。 快速容易的:)
Answer 7:
我建议增加“选项”,类型名称(或者如果它包含位标志旗),即类型是Car.StatusOption和财产是Car.Status。
相比于复数化,创建枚举类型,你通常会想变复数的集合属性 ,不是枚举类型的集合时这避免了命名冲突。
Answer 8:
我通常前缀的枚举,如CarStatus。 我想这一切都取决于你的团队正在使用(如果他们有那种事的任何规则/过程)和对象的使用。 只是我的2美分(:
文章来源: C# naming convention for enum and matching property