c# - 是否可以限制 C# 中的公共(public)枚举值?

标签 c# enums private encapsulation public

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

private enum ExhibitState { Ready, Active, Complete, Inactive };

对于将要设置展览的开发者,我希望他们能够选择的只有两种“开始”状态:

public enum StartingExhibitState { Ready, Inactive };

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

        switch (startingState) {
            case StartingExhibitState.Ready:
                SetState(ExhibitState.Ready);
                break;
            case StartingExhibitState.Inactive:
                SetState(ExhibitState.Inactive);
                break;
        }

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

非常感谢您的宝贵时间。

最佳答案

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

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);
}

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

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;
    }
}

构造函数将 设为私有(private) 以防止从其他地方实例化类。
类标记为 sealed 以防止派生和更改它的行为。

那么你的方法看起来像

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

// use it
SetInitial(InitialState.Initial);
SetInitial(InitialState.Ready);

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

关于c# - 是否可以限制 C# 中的公共(public)枚举值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45194217/

相关文章:

c# - 如何使用 Ajax 将文件和表单数据一起发布到 MVC Controller ?

C++如何使用其中也包含此类的类中的枚举

Typescript - 重载私有(private)方法

JavaScript,在不使用 eval 的情况下将私有(private)函数作为公共(public)方法中的字符串调用(显示模式)

c# - 将 double 转换为 DateTime 类型会延迟 2 天?

c# - 通用化对象初始化的更好方法?

c# - 在字符串属性中搜索值为 HTML 的文本

java - 未找到字段导致的 LibGDX SerializationException

java - 编译器不断吐出 "Class Interface or Enum Expected"谁能发现我做错了什么?

class - 在 F# 中使用私有(private)构造函数创建一个类