C# C枚举:可空值还是“未知”值?
如果我有一个带有枚举成员的类,并且我希望能够表示未定义该成员的情况,那么哪个更好 在类中使用可为null的类型将成员声明为可为null。例如:C# C枚举:可空值还是“未知”值?,c#,enums,C#,Enums,如果我有一个带有枚举成员的类,并且我希望能够表示未定义该成员的情况,那么哪个更好 在类中使用可为null的类型将成员声明为可为null。例如: public SomeEnum? myEnum; b向枚举中添加默认的“未知”值。例如: public enum SomeEnum { Unknown, SomeValueA, SomeValueB, SomeValueC, } 我真的看不出任何主要的优点/缺点;但也许其中一个比另一个更可取?肯定使用可空值类型-这就是
public SomeEnum? myEnum;
b向枚举中添加默认的“未知”值。例如:
public enum SomeEnum {
Unknown,
SomeValueA,
SomeValueB,
SomeValueC,
}
我真的看不出任何主要的优点/缺点;但也许其中一个比另一个更可取?肯定使用可空值类型-这就是它们的用途。它明确说明了你的意图。它还意味着,如果希望泛型类型安全性轻松确定某个特定值是否为真值,而不必担心是否为假值,则可以使用或中的等效值。如果该值可为null,则可以将其作为默认值,如果尝试在null时使用,则会出现异常,这是一件好事 您只需决定是需要一个值来表示未知值,还是需要一种方法来表示缺少任何值 在需要表示未知值的情况下,额外的枚举成员听起来是一个不错的解决方案 如果需要表示缺少任何值,请将其设为null 请记住,让未知枚举成员和枚举本身同时为空并没有什么错
HTH.我同意阿基米德7592的观点,即缺失值和未知值之间存在真正的差异 例如: 你的血型是什么 Null=缺少值->问题尚未回答->询问问题 未知->患者表示不知道->要求进行血型实验室检测 这要看情况了 Bill Wagner列出了一些很好的理由,可以在有意义时添加未定义的枚举。我建议您查找完整项目,但这里有一个预览: 第8项:确保0是值类型的有效状态 默认的.NET系统初始化将所有对象设置为所有0。您无法阻止其他程序员创建初始化为所有0的值类型的实例。使其成为您的类型的默认值 一种特殊情况是枚举。切勿创建不将0作为有效选项的枚举。所有枚举都是从System.ValueType派生的。枚举的值从0开始,但您可以修改该行为
现在,我遇到了这样一种情况:用户需要从组合框中选择某种类型,或者他们可以不选择任何类型。我使用带有[Descriptiona description]属性的枚举作为要选择的对象。如果无/未知是枚举的自然选择,那么我将使用它表示未选择任何内容。否则,我将使用一个可为null的属性。如果使用[Flags]属性对枚举进行属性化,则所有内容都会更改
[Flags]
enum FlagsEnum
{
None = 0,
First = 1,
Second = 2,
Third = 4,
FirstAndThird = 5
}
这个问题真的应该被贴上“主观”的标签。如果这个问题听起来主观,那只是因为我缺乏知识。如果有确凿的理由说明为什么一个应该被使用而不是另一个,那么它就不是真正的主观。有趣。相关:为什么FxCop抱怨没有零值的枚举,即在为每个条目分配显式值的枚举中,建议使用值为0的None条目?难道不像你的答案所说的那样,添加一个人造的“无”是一个虚假的值,因此是一个劣等的解决方案吗?请看:也许FxCop规则比nullable类型更古老?是的,这回到了我的观点,如果你使用nullable,那么你会得到一个合理的默认值,这就是该规则试图强制执行的。刚刚与我的同事讨论过这一点,但如果Jon Skeet说使用nullable,我想我的论点是无效的:@Neo:对,这是有道理的。