0

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

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

4

7 回答 7

6

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

看起来这个函数的设计者打算让调用者检查返回值是否是特殊的标记值 -1。如果返回 -1,则调用者应采取适当的步骤。例如,调用者可能会显示或记录错误消息。

于 2013-02-27T13:21:39.883 回答
1

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

于 2013-02-27T13:25:50.383 回答
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/索引。

于 2013-02-27T13:39:55.197 回答
0

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

返回 0 或 -1 意味着调用程序必须检查这个已知的错误值,而不是简单地捕获异常。

于 2013-02-27T13:22:38.163 回答
0

这是魔术数字反模式的简单案例。

不应该这样做。应该使用常量或定义(取决于语言)。

一般的幻数;引起和你一样的问题和问题。

于 2013-02-27T13:22:43.043 回答
0

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

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

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

  • 抛出异常(如 Int.Parse)
  • 添加一个out参数来指示是否有效(如 Int.TryParse)
于 2013-02-27T13:22:53.510 回答
0

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

这取决于您的架构,正如您从其他几篇文章中看到的那样,它可以针对可空 ID 与不可空 ID 进行宗教战争。

...

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

于 2013-02-27T13:25:34.623 回答