繁体   English   中英

C#枚举:可空或“未知”值?

[英]C# Enums: Nullable or 'Unknown' Value?

如果我有一个带有enum成员的类,并且我希望能够表示未定义该成员的情况,哪个更好?

a)使用可空类型将该成员声明为类中可为空的。 例如:

public SomeEnum? myEnum;

b)在枚举中添加默认的“未知”值。 例如:

public enum SomeEnum {
    Unknown,
    SomeValueA,
    SomeValueB,
    SomeValueC,
}

无论如何,我都无法看到任何重大利弊; 但也许一个优于另一个?

绝对使用可以为空的值类型 - 这就是它们的用途。 它明确说明了你的意图。 这也意味着您可以使用Enum.IsDefined (或者如果您想要通用类型安全,可以使用Unconstrained Melody中的等效物)来轻松确定特定值是否为实际值,而不必担心“假”值。

我同意archimed7592,缺席值和“未知”值之间存在真正的差异。

例:

“你的血型是什么?”

  • Null =缺席值 - >问题未得到回答 - >提出问题

  • “未知” - >患者表示他不知道 - >为血型进行实验室测试

您只需要决定是否需要一个值来表示未知值,或者您需要一种方法来表示没有任何值。

在需要表示未知值的情况下,额外的枚举成员听起来很好作为解决方案。

如果需要表示没有任何值,请将其置为可空。

请记住,让“未知”的枚举成员和枚举本身同时可以为空,这没有任何问题。

HTH。

这取决于!

比尔瓦格纳列出了一些很好的理由来添加一个未定义的 enum当它有意义时。 我建议你找到完整的项目,但这是一个预览:

第8项:确保0是值类型的有效状态

默认的.NET系统初始化将所有对象设置为全0。 您无法阻止其他程序员创建初始化为全0的值类型的实例。 将其设为您的类型的默认值。

一个特例是枚举。 永远不要创建不包含0作为有效选择的枚举。 所有枚举都派生自System.ValueType。 枚举的值从0开始,但您可以修改该行为......

现在,我有一种情况,用户需要从ComboBox中选择某种类型,或者他们没有选择任何类型。 我使用带有[Description("a description")] an [Description("a description")]属性的枚举作为要选择的对象。 如果没有/ Unknown是枚举的自然选择,那么我会用它来表示没有选择任何东西。 否则,我将使用Nullable<MyEnum>

如果它是可空的,你会把它作为一个默认值,如果你尝试在null时使用它,你会得到异常(这是一件好事!)

如果枚举归因于[Flags]属性,则一切都会改变。

    [Flags]
    enum FlagsEnum
    {
        None = 0,
        First = 1,
        Second = 2,
        Third = 4,
        FirstAndThird = 5
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM