我有一个搜索图像的公共方法,如果图像存在,则将其作为字节数组返回。
如果图像不存在,该方法应该返回什么? (图像不存在也不例外,但预期可能性)
我应该返回一个空的byte[]
数组,还是应该将byte?[]
设置为null?
哪一个更符合惯例?
答案 0 :(得分:10)
我会返回null
(就像byte[]
一样 - 所有数组都是引用类型)。返回一个空数组将导致调用者认为他们可以尝试将该数据作为图像加载 - 他们不能。返回null
引用可以很容易地区分“现在和空”与“根本不存在”。
在缺少图像表明存在重大系统问题的其他情况下,我会考虑例外。听起来并非如此。
请注意,这与返回单个元素集合的常规方法有很大不同 - 例如,您不会像对待返回List<Person>
的方法那样将每个字节视为单独的实体;这里byte[]
实际上是一个blob。我认为它是发生的单个数据块,表示为数组而不是集合。换句话说:想想它就好像你的方法被声明为返回一个Blob
类型而不是一个数组...你会返回一个空引用,还是一个没有数据的Blob
实例?
答案 1 :(得分:3)
在返回集合或可枚举时,永远不会返回null,这被认为是最佳做法。 “ALWAYS”返回一个空的枚举/集合。它可以防止上述废话,并防止你的车被你的班级的同事和用户怂恿。
一般来说这是正确的,但有些情况下返回null没有错。所以必须省略“总是”。
另外,一个很好的来源是Framework Design Guidelines 2nd Edition (pg. 256):
不要从集合属性或返回集合的方法返回空值。改为返回空集合或空数组。
答案 2 :(得分:3)
对于不存在某些内容的情况,这两种选择都不是很好:返回一个空的字节数组是错误的,因为用户无法区分查找实际为空的图像和找不到图像。返回null
稍微好一些,但用户可能忘记null
- 检查返回。
两个效果更好的替代方法是在bool
参数中设置结果时将未找到的结果作为out
返回,并抛出异常。这两种方法都会使API的用户明白“未找到图像”状态,这使得它更难错过。
bool TryLookUpImage(string name, out byte[] image) {
...
}
...
byte[] image;
if (TryLookUpImage(imageName, out image)) {
// Display image
} else {
// Display error
}
答案 3 :(得分:2)
返回null,因为@JonSkeet指出,因为结果不是用作集合而是用作单个blob。也许命名方法GetImageOrNull
,以便用户清楚地知道他应该期望得到null
。
您也可以像Dictionary.TryGetValue
方法(link)那样执行此操作,并返回一个表示它是否有效的布尔值。
这可能看起来像这样(请注意,该方法的名称相似,并且 - 如果一致使用,则明确如何使用它):
public bool TryGetImage(SomeParameter param, out byte[] image)
{
bool imageFound;
//...
return imageFound;
}
改为将返回类型更改为IEnumerable<byte[]>
。这可以解释为图像阵列。然后你可以返回一个空的byte[][]
。只有在能够返回多个图像的情况下才有意义。这也将遵循Atanas的建议,我的第二次收集。
答案 4 :(得分:0)
我会命名方法
bool TryLoadImage(name, out byte[] image)
然后,任何阅读代码的人都清楚该方法期望无法加载某些图像。因此,在调用之后,不能假定image
包含有效图像。
将图像设置为null,而不是空数组,最好是Jon Skeet给出的所有原因。