C#:枚举的默认值应该是无还是未知?

C#:枚举的默认值应该是无还是未知?,c#,enums,default-value,C#,Enums,Default Value,假设您有一个表示错误代码的枚举。将有几个代码,每个代码都有自己的基本int值;但是,获取默认0值的枚举值似乎应该仔细考虑 在错误代码枚举的情况下,我可以想到两个特殊值:None(对于没有错误的情况)和Unknown(对于没有合适的错误代码的情况,或者甚至当无法检测到错误状态时) 其中一个值似乎应该为0,而另一个值可能会为-1。将“无”值设置为0或将未知值设置为0更合适吗 public enum ErrorCode { None = -1, Unknown = 0, Ins

假设您有一个表示错误代码的枚举。将有几个代码,每个代码都有自己的基本int值;但是,获取默认0值的枚举值似乎应该仔细考虑

在错误代码枚举的情况下,我可以想到两个特殊值:None(对于没有错误的情况)和Unknown(对于没有合适的错误代码的情况,或者甚至当无法检测到错误状态时)

其中一个值似乎应该为0,而另一个值可能会为-1。将“无”值设置为0或将未知值设置为0更合适吗

public enum ErrorCode
{
    None = -1,
    Unknown = 0,
    InsufficientPermissions,
    ConnectivityError,
    ...
}

public enum ErrorCode
{
    Unknown = -1,
    None = 0,
    InsufficientPermissions,
    ConnectivityError,
    ...
}

我的直觉告诉我默认值应该是未知的,但我很好奇是否有人做了不同的事情。

如果没有错误,为什么还要返回一个ErrorCode值

没什么意义。删除该选项将解决您的问题。您可以将0设为未知:

public enum ErrorCode
{
    Unkown = 0,
    InsufficientPermissions,
    ConnectivityError
}
更新

你的评论有点吓人。您永远不应该有一个返回错误代码类型的方法。这是很糟糕的练习。因为错误代码只能在异常情况下返回,所以抛出异常是个好主意


如果需要,您可以在自定义异常中有一个包含ErrorCode值的字段。

因为您正在用最佳实践标记问题:当您可以使用异常时,不要使用错误代码

在我看来,
Unknown
None
ErrorCode
枚举的上下文中都意味着相同的事情。我的理由是,如果我在检查错误代码,那是因为我已经有错误了


我还认为,错误代码枚举仅在自定义异常或现有异常类型的自定义数据中有用,并且在这两种情况下,您总是会出现错误。

错误代码错误。例外情况很好。但要回答所问的问题:


如果您的枚举有一个“未知”值,它应该是默认值。

首先,您不应该有无错误代码。相反,称之为“成功”

现在考虑如何检查错误代码。大多数人都希望这样:

if (errorCode != Success)
或者他们使用速记

if (errorCode != 0)
好了。您的成功代码是0,您没有无代码,未知代码可以是您想要的任何东西。

所有“我不会这么做”的回答也是如此,但如果您坚持,这是我的0.02美元

errorcode.None
没有意义,因为没有错误<代码>错误代码。未知没有帮助。尝试返回可为空的错误代码:

public ErrorCode? DoFoo()
现在可以检查null

var error = DoFoo();
if (error != null)
    // react

仍然很糟糕,但至少它允许您在没有错误的情况下不返回错误代码。

肯定不是一个好的做法。但如果没有其他方法……那么我通常会选择第二种方法:

public enum ErrorCode 
{ 
    Unknown = -1, 
    None = 0, 
    InsufficientPermissions, 
    ConnectivityError, 
    ... 
} 

0符合约定“无错误”,而-1符合约定,因为存在一些错误(可能未知)。

我想我不同意其他人的看法

从“此功能的当前状态是什么”的意义上讲,使用错误代码没有问题。

举个例子:如果你有一个可选的网络临时文件夹,你想访问它,并且你想显示你最近一次尝试访问它的结果,你会把它保存在一个错误代码中。也许您希望在状态栏上向用户显示当前状态

对于我来说,我将使用0作为默认值。我看不出有什么理由让未知成为消极的。Unknown是一个非常好的错误状态。你可以把它放在列表的末尾。实际上,我已经做到了

public enum ErrorCode
{
    None = 0,
    InsufficientPermissions,
    ConnectivityError,
    ...
    Unknown,
}

为了回答您的问题,我说默认值必须为None。无意味着:不存在您知道的错误。Unknown对我来说意味着:存在一个非常模糊的错误,您无法在代码中解释它。

如果有人说您只应该使用异常,我实际上不同意。当使用任何使用数据库的应用程序时,您可能希望在系统中存储数据的状态。无论它们是错误代码还是某种状态,它们在数据库中最好表示为整数

使用和处理异常是一项非常重要的技能,应该加以使用,但我相信,在这些异常中加入错误代码通常是一个好主意。它不需要太多额外的资源,可以在连接数据库的应用程序中使用

实际上,我建议按照建议将“None”更改为“Success”,但将“Success”的值设为1,并使所有其他错误从此处递增。这背后的原因是,作为大多数数据库应用程序的标准,状态列不可为空,通常作为整数跟踪。如果使用成功状态0,这可能会导致问题,因为默认情况下,如果用户未显式插入其他内容,则不可为null的整数列将设置为0。这将导致错误的状态/错误代码,并在应用程序的未来造成问题。在C#中,不仅整数变量在默认情况下自动初始化为0,从而使其自动成功,如果不设置初始值,枚举也是如此,而这不是您想要的


同样,从编码的角度来看,1也可能意味着真,因此它与成功是一致的。但在某些情况下,情况可能并非如此。在基于UNIX的系统中,0的返回意味着成功/无错误,在C++等其他语言中,0返回是从main函数中的标准,也指示主函数的成功执行。当函数成功时,你会返回什么?@Karmastan-我永远不会有一个返回错误代码的方法