为什么返回-1而不是0?

时间:2013-02-27 13:20:13

标签: c#

最近我注意到了一个为特定实体分配id的约定,我注意的是如果id不存在则返回-1。为什么返回-1而不是0?

protected long AcqAgreementID
{            
    get
    {
        if(ViewState["AcqAgreementID"] != null)
        {
            return Convert.ToInt64(ViewState["AcqAgreementID"]);
        }
        else
        {
            return -1;
        }
    }
}

7 个答案:

答案 0 :(得分:6)

我希望选择-1是因为该值永远不能用于ID。在这种情况下,它可用于表示ID无效。

这个函数的设计者似乎希望调用者检查返回值是否是特殊的sentinel值-1。如果返回-1,则调用者应采取适当的步骤。例如,调用者可能会显示或记录错误消息。

答案 1 :(得分:1)

通常0是有效的id或返回值。想象一下具有索引或在字符串中搜索的控件。在为包含多个项目的控件查找选定索引时,或者在查找字符串中某个char的索引时,返回值0完全正常。索引0表示选择的第一个项目或在字符串的第一个位置找到char。在这两种情况下,如果没有选择或找到任何内容,则返回-1。

答案 2 :(得分:1)

这是在.NET框架中返回索引的方法的标准。

  

public int FindIndex( Predicate<T> match )方法返回   第一次出现的匹配元素的从零开始的索引   匹配定义的条件,如果找到;否则,-1。

http://msdn.microsoft.com/en-us/library/x1xzf2ca.aspx

这样调用者就可以处理无法以任何方式找到的ID /索引。他们可能会抛出异常或从其他来源获取ID;他们想要什么。

可以使用Nullable类型 ,但这些方法的标准是在引入可空类型之前开发的。如果您可以控制此代码,您可以考虑更改它,但返回-1没有任何问题。绝对不要返回0,因为0通常是有效的ID /索引。

答案 3 :(得分:0)

在大多数情况下,您都不应该返回。很可能你应该抛出异常。

返回0或-1表示调用程序必须检查此已知错误值,而不是简单地捕获异常。

答案 4 :(得分:0)

这是magic numbers反模式的简单案例。

不应该这样做。应使用Consts或define(取决于语言)。

一般的魔术数字;导致WTF和问题就像你的一样。

答案 5 :(得分:0)

这个问题有点开放,而且过于笼统;用“它取决于”这样的东西很容易回答。 通常,当0是完全合法的域值时,您使用负值(例如,它在ID的允许范围内)

然而,这不是一个好的模式:它会使函数/ API的用户感到困惑(就像你一样)。你必须弄清楚函数返回一个域中的数字(正整数),并且负值是不可能的,因此用作“invalud”valude。

在C#/ .NET中,你应该考虑Nullable类型。他们通过添加额外的“值/状态”(null)明确地说“此值不在域中”。 除了可以为空的类型,您应该考虑的其他有效约定是:

  • 抛出异常(比如Int.Parse)
  • 添加out参数以指示是否有效(如Int.TryParse)

答案 6 :(得分:0)

我在我想对ID使用不可为空的整数值的地方使用了这种模式。我不喜欢使用0作为“默认”/“未分配”ID,因为它是整数类型的默认值。这允许我查看模型对象,确定它们是否应该插入或更新,我还可以判断它是否为“0”。

这取决于你的体系结构,正如你从其他几篇文章中看到的那样,它可以构建一场关于可空的v。不可空ID的宗教战争。

...

作为一个注释,我还看到/使用过模式具有可空类型的模式,在调用需要非可空类型的函数/数据模型之前,该类型具有已知值(例如-1)。 。我们总是在开发项目中投入“这取决于”这个令人敬畏的世界。