如果在字符串返回方法中找不到字符串,则返回替代值
Posted
技术标签:
【中文标题】如果在字符串返回方法中找不到字符串,则返回替代值【英文标题】:Returning an alternative value if a string is not found in a string-returning method 【发布时间】:2012-03-05 20:25:33 【问题描述】:我有一个返回字符串的方法。在正常操作条件下,可能会返回空字符串或 null。但是,从此方法返回null
或""
是一种好的编码习惯吗?
【问题讨论】:
【参考方案1】:是的,在这种情况下,我更喜欢返回 null
以显示未找到该字符串。空字符串通常用于显示空结果。
另一种方法是抛出一些Exception
,但作为程序员,我发现无法处理异常。返回null
好多了。
【讨论】:
是的,此外,由于抛出异常的开销,它们不应该用于正常操作的通信。 是的 - 为预期结果引发异常是不合适的。返回标志值比更改所有内容以返回“成功”布尔值/枚举并传递字符串 ref 参数的替代方法更容易和更清晰。 @uosef:在决定是否使用异常时,开销应该是最后的想法之一(过早的优化和过早的悲观一样邪恶,默认情况下编写干净的代码)(顺便说一句,尤其是在 C++ 中为真,异常几乎可以无开销地实现) @mesiesta:Returning null is much better.
是 w.r.t.问题还是一般规则?
@phresnel:对我来说,这是一条规则......仅在我找不到更好和更简单的解决方案的情况下抛出异常。【参考方案2】:
null
和空字符串之间存在语义差异。一个说“它不是为那个输入定义的”,另一个说“那个输入的正确值是空字符串”。
假设您为 C 的一个子集编写了一个编译器,它允许 main
函数不返回任何内容。你的编译器返回一个带有某种幻想汇编语言的字符串。
// Testcode 0
void main()
为此,您将返回null
,由于缺少右大括号,代码格式不正确(不,不要抛出异常,用户编写的代码中会出现错误)。没有有效的输出。
// Testcode 1
void main() printf("hello!");
为此,您将返回"push 'hello!'\ncall printf"
// Testcode 2
void main()
为此,您可能会返回""
,代码什么也不做,也不返回,但是是有效的。
【讨论】:
【参考方案3】:这取决于方法的用途,如果您有一个方法string GetCustomerName(int custId)
,您宁愿在客户不存在时抛出异常,而不是返回null
。另一方面,如果有一个方法将字符串的第一个字母更改为大写,并且您在输入中提供了null
,则返回null
是可以接受的。
【讨论】:
【参考方案4】:是的,我认为是这样,(如果您期望该方法产生字符串结果),但如果不是(例如错误/警告),我会考虑在您的方法中引发异常的替代方案。我通常使用这种方法而不是在这种情况下返回字符串。
例如
try
Validate();
catch(NotValidException ex)
// Report
如果未在此处捕获的异常将冒泡并更少静默,例如,忘记检查 Validate 方法的返回值。
【讨论】:
但是当由于抛出异常的开销而通常找不到目标字符串(例如缓存未命中)时,可能不应该使用它。【参考方案5】:值null
通常用于“没有字符串”(在某处“未找到”字符串),或者简单地说,没有字符串适用。空字符串更常用于存在字符串但实际上为空的情况。
例如,如果您在 *** 中搜索某个用户的个人资料描述,如果该用户没有输入任何个人资料描述,则空字符串将是正确的结果;和null
,如果没有找到这样的用户。
【讨论】:
以上是关于如果在字符串返回方法中找不到字符串,则返回替代值的主要内容,如果未能解决你的问题,请参考以下文章