是否可以限制 C# 中的公共枚举值?

Sem*_*ide 6 c# enums encapsulation private public

我目前正在为由展览组成的游览编写一个软件程序。展览对象在任何给定点都处于四种状态之一,由 ExhibitStates 枚举定义:

private enum ExhibitState { Ready, Active, Complete, Inactive };
Run Code Online (Sandbox Code Playgroud)

对于将要布置展览的开发人员,我希望他们只有两种“起始”状态可供选择:

public enum StartingExhibitState { Ready, Inactive };
Run Code Online (Sandbox Code Playgroud)

目前,我已将其设置为在初始化后,展览将立即设置其状态以匹配其起始状态,如下所示:

        switch (startingState) {
            case StartingExhibitState.Ready:
                SetState(ExhibitState.Ready);
                break;
            case StartingExhibitState.Inactive:
                SetState(ExhibitState.Inactive);
                break;
        }
Run Code Online (Sandbox Code Playgroud)

今天我发现自己想知道这是否是最佳实践。有没有更好的方法来限制哪些枚举选项是公共的,哪些是私有的?或者最好只拥有两个单独的枚举?

非常感谢您的参与。

Fab*_*bio 6

如果您创建第二个枚举 - 您的意图将通过设置方法的签名非常清楚地解释

public enum ExhibitState 
{ 
    Inactive = 0,
    Active = 1,
    Ready = 2,
    Complete = 3
};

public enum InitialStates 
{ 
    Inactive = ExhibitState.Inactive,
    Ready = ExhibitState.Ready
};

public void SetInitial(InitialStates state)
{
    SetState((ExhibitState)state);
}
Run Code Online (Sandbox Code Playgroud)

如果您更进一步,您可以添加编译器帮助以防止将错误值传递给方法。

public sealed class InitialState
{
    public static readonly InitialState Initial = new InitialState(ExhibitState.Initial);

    public static readonly InitialState Ready = new InitialState(ExhibitState.Ready);

    public ExhibitState State { get; }            

    private InitialState(ExhibitState state)
    {
        State = state;
    }
}
Run Code Online (Sandbox Code Playgroud)

构造函数是private为了防止从其他地方实例化类。
类标记为sealed以防止派生和更改其行为。

那么你的方法将如下所示

public void SetInitial(InitialState start)
{
    SetState(start.State);
}  

// use it
SetInitial(InitialState.Initial);
SetInitial(InitialState.Ready);
Run Code Online (Sandbox Code Playgroud)

除非您更改类的代码,否则无法传递其他任何内容InitialState

  • 您可以明确:`public enum InitialStates { Ready = ExhibitState.Ready, Inactive = ExhibitState.Inactive };` (5认同)