C# 嵌套枚举样式和约定
我有一个控制类操作方式的枚举。此枚举仅适用于该类,因此感觉它应该是嵌套的。但是,该类需要一个枚举实例作为成员,理想情况下,该实例的命名方式与枚举相同。当然,这是不可能的 我主要关心的是提供一个干净清晰的API。我看到的两个选择是: 嵌套枚举并将实例成员或枚举本身命名为“不完美” 将枚举放在类之外,这可能会污染名称空间,但不会真正污染名称空间,并且可能会降低发现能力。(现在写这篇文章,我觉得发现能力可能不是一个问题,因为只有一个使用点,一个属性) 对于这种情况,是否有公认的惯例?下面是一个演示用例的片段:C# 嵌套枚举样式和约定,c#,convention,C#,Convention,我有一个控制类操作方式的枚举。此枚举仅适用于该类,因此感觉它应该是嵌套的。但是,该类需要一个枚举实例作为成员,理想情况下,该实例的命名方式与枚举相同。当然,这是不可能的 我主要关心的是提供一个干净清晰的API。我看到的两个选择是: 嵌套枚举并将实例成员或枚举本身命名为“不完美” 将枚举放在类之外,这可能会污染名称空间,但不会真正污染名称空间,并且可能会降低发现能力。(现在写这篇文章,我觉得发现能力可能不是一个问题,因为只有一个使用点,一个属性) 对于这种情况,是否有公认的惯例?下面是一个演示用例
public class MultiModeActionFacadeObject : IAction
{
public enum ActionMode // enum only applies to this class
{
Fast,
Accurate,
Intermediate
}
private readonly IAction _accurate, _fast, _intermediate;
internal MultiModeActionFacadeObject(IAction fastAction, IAction accurateAction, IAction intermediateAction)
{
_fast = fastAction;
_accurate = accurateAction;
_intermediate = intermediateAction;
}
// preference would be to call this member ActionMode, but obviously members can't share names
// although I believe this could be accomodated, outside of static members, by some changes to
// qualification requirements. That's not the concern here though.
public ActionMode Mode { get; set; }
public void DoWork(object onThis)
{
switch (Mode)
{
case ActionMode.Fast:
_fast.DoWork(onThis);
break;
case ActionMode.Accurate:
_accurate.DoWork(onThis);
break;
case ActionMode.Intermediate:
_intermediate.DoWork(onThis);
break;
}
}
}
将枚举放在类之外似乎更常见。将其保留在内部意味着每次设置模式时都需要指定ClassName.Enum:
var mma = new MultiModeActionFacadeObject(fastAction, accurateAction, intermediateAction)
{
Mode =
MultiModeActionFacadeObject.ActionMode.Accurate
};
同样,因为任何一种方式都是有效的,我不认为这是一个明确的“答案”。我本想就你的原始问题添加一条评论,但这需要50+个代表:)
通常(根据我的经验)enum
s应该加上Type
的后缀。(ActionModeType
)这只是一个观点,但它会解决您的问题。@Pierre Luccinoult这个例子有些做作,并努力说明类本身只是一个方便类(这就是为什么它被命名为facade)。我主要关心的是枚举属于哪里。除非我误解了你关于多态性的评论。@Pierre Luccinoult-当你需要两个快速调用,然后使用同一实例调用一个精确调用时,这支持用例…@EBrown我坚决反对这种约定。它们不是类型(它们是枚举),框架中没有使用过这样的后缀(我知道。为什么枚举需要嵌套?如果它只被这个类使用呢?不要嵌套它,然后你可以声明public ActionMode ActionMode…
好吧,现在你可以注释了。:)我选择了这条路线,因为这肯定是最常见的,我通常习惯于这样做,我找不到任何证据支持这种选择。