最近我注意到了一个为特定实体分配id的约定,我注意的是如果id不存在则返回-1。为什么返回-1而不是0?
protected long AcqAgreementID
{
get
{
if(ViewState["AcqAgreementID"] != null)
{
return Convert.ToInt64(ViewState["AcqAgreementID"]);
}
else
{
return -1;
}
}
}
答案 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)
答案 5 :(得分:0)
这个问题有点开放,而且过于笼统;用“它取决于”这样的东西很容易回答。 通常,当0是完全合法的域值时,您使用负值(例如,它在ID的允许范围内)
然而,这不是一个好的模式:它会使函数/ API的用户感到困惑(就像你一样)。你必须弄清楚函数返回一个域中的数字(正整数),并且负值是不可能的,因此用作“invalud”valude。
在C#/ .NET中,你应该考虑Nullable类型。他们通过添加额外的“值/状态”(null)明确地说“此值不在域中”。 除了可以为空的类型,您应该考虑的其他有效约定是:
out
参数以指示是否有效(如Int.TryParse)答案 6 :(得分:0)
我在我想对ID使用不可为空的整数值的地方使用了这种模式。我不喜欢使用0作为“默认”/“未分配”ID,因为它是整数类型的默认值。这允许我查看模型对象,确定它们是否应该插入或更新,我还可以判断它是否为“0”。
这取决于你的体系结构,正如你从其他几篇文章中看到的那样,它可以构建一场关于可空的v。不可空ID的宗教战争。
...
作为一个注释,我还看到/使用过模式具有可空类型的模式,在调用需要非可空类型的函数/数据模型之前,该类型具有已知值(例如-1)。 。我们总是在开发项目中投入“这取决于”这个令人敬畏的世界。