如果我有一个带有enum
成员的类,并且希望能够代表未定义该成员的情况,那更好吗?
a)使用可为空的类型在类中声明该成员为可为空。例如:
public SomeEnum? myEnum;
b)在枚举中添加默认的“未知”值。例如:
public enum SomeEnum {
Unknown,
SomeValueA,
SomeValueB,
SomeValueC,
}
无论哪种方式,我都看不到任何主要的利弊。但是也许一个比另一个更可取?
如果我有一个带有enum
成员的类,并且希望能够代表未定义该成员的情况,那更好吗?
a)使用可为空的类型在类中声明该成员为可为空。例如:
public SomeEnum? myEnum;
b)在枚举中添加默认的“未知”值。例如:
public enum SomeEnum {
Unknown,
SomeValueA,
SomeValueB,
SomeValueC,
}
无论哪种方式,我都看不到任何主要的利弊。但是也许一个比另一个更可取?
Answers:
绝对使用可为空的值类型-这就是它们的用途。它明确说明了您的意图。这也意味着您可以使用Enum.IsDefined
(如果需要通用类型安全性,则可以使用(或Unconstrained Melody中的等效项))轻松确定特定值是否为实值,而不必担心“伪”值。
我同意archimed7592的观点,即缺失值和“未知”值之间确实存在差异。
例:
“你的血型是什么?”
Null =缺少值->尚未回答问题->提出问题
“未知”->患者表示他不知道->订购实验室检查血型
这取决于!
Bill Wagner列出了一些在合理的 enum
情况下添加Undefined的充分理由。我建议您找到完整的项目,但以下是预览:
项目8:确保0是值类型的有效状态
默认的.NET系统初始化将所有对象设置为全0。您无法阻止其他程序员创建初始化为全0的值类型的实例。将其设置为您的类型的默认值。
枚举是一种特殊情况。切勿创建不包含0作为有效选择的枚举。所有枚举均派生自System.ValueType。枚举的值从0开始,但是您可以修改该行为...
现在,我遇到一种情况,用户需要从ComboBox中选择某种类型,或者他们不能选择任何类型。我正在使用带有[Description("a description")]
属性的枚举作为要选择的对象。如果没有/未知是枚举的自然选择,那么我将用它来表示什么都没有选择。否则,我将使用Nullable<MyEnum>
。
如果它可以为null,则将其作为默认值;如果在null时尝试使用它,则会获得异常(这是一件好事!)