Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 嵌套枚举样式和约定_C#_Convention - Fatal编程技术网

C# 嵌套枚举样式和约定

C# 嵌套枚举样式和约定,c#,convention,C#,Convention,我有一个控制类操作方式的枚举。此枚举仅适用于该类,因此感觉它应该是嵌套的。但是,该类需要一个枚举实例作为成员,理想情况下,该实例的命名方式与枚举相同。当然,这是不可能的 我主要关心的是提供一个干净清晰的API。我看到的两个选择是: 嵌套枚举并将实例成员或枚举本身命名为“不完美” 将枚举放在类之外,这可能会污染名称空间,但不会真正污染名称空间,并且可能会降低发现能力。(现在写这篇文章,我觉得发现能力可能不是一个问题,因为只有一个使用点,一个属性) 对于这种情况,是否有公认的惯例?下面是一个演示用例

我有一个控制类操作方式的枚举。此枚举仅适用于该类,因此感觉它应该是嵌套的。但是,该类需要一个枚举实例作为成员,理想情况下,该实例的命名方式与枚举相同。当然,这是不可能的

我主要关心的是提供一个干净清晰的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…
好吧,现在你可以注释了。:)我选择了这条路线,因为这肯定是最常见的,我通常习惯于这样做,我找不到任何证据支持这种选择。