Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C枚举:可空值还是“未知”值?_C#_Enums - Fatal编程技术网

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

C# C枚举:可空值还是“未知”值?,c#,enums,C#,Enums,如果我有一个带有枚举成员的类,并且我希望能够表示未定义该成员的情况,那么哪个更好 在类中使用可为null的类型将成员声明为可为null。例如: public SomeEnum? myEnum; b向枚举中添加默认的“未知”值。例如: public enum SomeEnum { Unknown, SomeValueA, SomeValueB, SomeValueC, } 我真的看不出任何主要的优点/缺点;但也许其中一个比另一个更可取?肯定使用可空值类型-这就是

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

在类中使用可为null的类型将成员声明为可为null。例如:

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:对,这是有道理的。