C#:枚举的默认值是None还是Unknown?

时间:2010-07-01 17:56:03

标签: c# enums default-value

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

在错误代码枚举的情况下,我可以想到两个特殊值:无(对于没有错误的情况)和未知(对于没有现有错误代码的情况,或者甚至是无法检测到错误状态。)

其中一个值似乎应该为0,其他值可能会得到其他类似-1的值。将None值设置为0或将Unknown值设置为0?

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

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

我的直觉告诉我默认应该是未知,但我很好奇是否有人以不同的方式做过。

9 个答案:

答案 0 :(得分:15)

由于您使用最佳做法标记了问题:在可以使用例外时不要使用错误代码。

答案 1 :(得分:6)

在我看来,UnknownNoneErrorCode枚举的上下文中表示相同的含义。我的理由是,如果我正在检查错误代码而不是因为我已经有错误。

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

答案 2 :(得分:4)

绝对不是一个好习惯。但如果没有别的办法......那么我通常会选择第二种方式:

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

0符合惯例'No Error'并且-1很好,因为有一些错误(可能是未知的)。

答案 3 :(得分:4)

我想我不同意其他人的意见。

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

要构成一个示例:如果您有一个可选的联网临时文件夹,您想要访问该文件夹,并且希望显示您尝试访问它的最近时间的结果,则可以将其保存在错误中码。也许在状态栏上,您希望向用户显示当前状态。

对我来说,我会将None用作0,作为默认值。我认为没有理由让Unknown成为负面的。未知是一个完美的错误状态。你可以把它放在列表的末尾。在实践中,我已经完成了

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

要回答您的问题,我说无必须是默认。无意味着:您不知道存在任何错误。未知对我来说意味着:存在一个非常模糊的错误,您无法在代码中对其进行说明。

答案 4 :(得分:3)

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

现在考虑一下如何检查错误代码。大多数人都期望这样的事情:

if (errorCode != Success)

或他们使用简写

if (errorCode != 0)

所以你有它。您的成功代码为0,您没有无代码,未知可以是您想要的任何内容。

答案 5 :(得分:2)

为什么在没有错误的情况下完全返回ErrorCode值?

没有多大意义。删除它可以解决您的问题。你可以将0代表Unkown:

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

<强>更新

你的评论有点可怕。你永远不应该有一个返回一种ErrorCode的方法。这是非常糟糕的做法。由于只应在特殊情况下返回ErrorCodes,因此抛出异常是个好主意。

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

答案 6 :(得分:1)

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

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

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

同样从编码的角度来看,1也意味着真实,因此它取得了成功。有些情况可能并非如此。在基于Unix的系统中,返回0表示成功/无错误,而在其他语言(如c ++)中,0返回是主函数的标准,也表示主函数的成功执行。

答案 7 :(得分:0)

错误编码错误。例外情况好。但要回答问题:

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

答案 8 :(得分:0)

同样对所有“我不会做出回应”,但如果你坚持,这是我的0.02美元。

ErrorCodes.None毫无意义,因为没有错误。 ErrorCodes.Unknown无效。尝试返回可以为空的错误代码:

public ErrorCode? DoFoo()

现在你可以检查null

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

还不错,但至少它允许你在没有错误的情况下返回错误代码。