[英]Why return -1 instead of 0?
最近,我注意到为特定实体分配ID的约定,引起我注意的是,如果ID不存在,则返回-1。 为什么返回-1而不是0?
protected long AcqAgreementID
{
get
{
if(ViewState["AcqAgreementID"] != null)
{
return Convert.ToInt64(ViewState["AcqAgreementID"]);
}
else
{
return -1;
}
}
}
我希望选择-1是因为该值永远不能用于ID。 在这种情况下,它可以用来表示ID无效。
该函数的设计者似乎打算让调用者检查返回值是否为特殊的哨兵值-1。 如果返回-1,则调用者应采取适当的步骤。 例如,呼叫者可能会显示或记录错误消息。
通常0是有效的ID或返回值。 考虑一个具有索引或在字符串中搜索的控件。 在为包含多个项目的控件寻找选定的索引时,或者在字符串中寻找某个字符的索引时,返回值0完全是正常的。 索引0表示选择的第一个项目,或者在字符串的第一个位置找到一个字符。 在这两种情况下,如果未选择或未找到任何内容,则返回-1。
这是在.NET
框架中返回索引的方法的标准。
public int FindIndex( Predicate<T> match )
方法返回与match定义的条件匹配的元素首次出现的从零开始的索引(如果找到); 否则,–1。
( http://msdn.microsoft.com/en-us/library/x1xzf2ca.aspx )
这样,调用者就可以处理他们想要的任何找不到ID /索引的方法。 他们可能会引发异常或通过从其他来源获取ID; 他们想要什么。
可空类型可能已经被使用,而不是,但这些方法的标准被引入可空类型的前开发。 如果您可以控制此代码,则可以考虑更改它,但是返回-1并没有错。 绝对不要返回0,因为0通常是有效的ID /索引。
在大多数情况下,您都不应该返回。 您很可能应该抛出异常。
返回0或-1意味着调用程序必须检查此已知的错误值,而不是简单地捕获异常。
这个问题有些开放,总的来说有点笼统。 用“取决于”这样的答案真的很容易。 通常,当0是完全合法的域值时(例如,它在ID的允许范围内),您将使用负值。
但是,这不是一个好方法,它会使函数/ API的用户感到困惑(就像您一样)。 您必须弄清楚该函数在一个域中返回数字(正整数),并且负值是不可能的,因此将其用作“已评估”值。
例如,在C#/。NET中,应考虑Nullable类型。 他们通过添加额外的“值/状态”(空)来明确表示“此值不在域中”。 除了可为空的类型之外,您还应考虑其他有效约定:
out
参数以指示是否有效(例如Int.TryParse) 我在想为ID使用不可为空的整数值的地方使用了这种模式。 我不喜欢使用0作为“默认” /“未分配” ID,因为它是整数类型的默认值。 这使我可以查看模型对象,以确定是否应该插入或更新它们,而且我还可以知道它是否未知“ 0”。
这取决于您的体系结构,并且从其他几篇文章中可以看到,它可以针对可空ID和不可空ID进行一场宗教战争。
...
值得注意的是,我还看到/使用了一些模式,其中模型具有可空类型,在调用需要非空类型的函数/数据模型之前,该类型具有(-1)已知值(例如-1)。 我们始终致力于开发项目,这是“取决于”的绝妙世界。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.