繁体   English   中英

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

[英]C#: Should the default value of an enum be None or Unknown?

假设您有一个表示错误代码的枚举。 将有几个代码,每个代码都有自己的底层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,
    ...
}

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

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

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

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

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

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

0通过惯例'No Error'很顺利,并且-1很好,理解是存在一些错误(可能是未知的)。

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

从“ 这个功能的当前状态是什么 ”的意义上来看,错误代码没有任何问题

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

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

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

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

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

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

if (errorCode != Success)

或者他们使用速记

if (errorCode != 0)

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

为什么没有错误时根本返回ErrorCode值?

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

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

UPDATE

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

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

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

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

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

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

ErrorCodes不好。 例外情况好。 但要回答问题:

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

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

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

public ErrorCode? DoFoo()

现在你可以检查null

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM