我们目前正在为C#编写一些编码规范。
我最近编写了一个具有以下签名的方法:
string GetUserSessionID(int UserID)
GetUserSession()
如果没有找到用户的会话,则返回 null。
在我的调用代码中...我这样说...
string sessionID = GetUserSessionID(1)
if (null == sessionID && userIsAllowedToGetSession)
{
session = GetNewUserSession(1);
}
最近在代码审核中,审查员说“从方法中返回null会让调用方法需要检查空值,因此你不应该这样做。”
我立即哭诈骗,因为如果你返回string.Empty,你仍然需要对返回值执行某种检查。
if (string.Empty == sessionID)
然而,经过进一步思考,对于 Collection
/Array
/List
的情况,我永远不会返回 null。
我会返回一个空列表。
我认为解决方案是将其重构为两个方法。
bool SessionExists(int userID);
并且
string GetUserSessionID(int UserID);
这一次,GetUserSessionID()
会抛出一个 SessionNotFound
异常(因为它不应该返回 null)
现在代码看起来像这样...
if(!SessionExists(1) && userIsAllowedToGetSession))
{
session = GetNewUserSession(1);
}
else
{
session = GetUserSessionID(1);
}
现在这意味着没有空值,但对我来说似乎有点复杂。这只是一个非常简单的例子,我想知道这会如何影响更复杂的方法。
有很多最佳实践建议关于何时抛出异常以及如何处理它们,但关于null使用的信息似乎较少。
还有其他人有任何关于使用null的可靠指南(甚至更好的标准),这对可空类型意味着什么(我们是否应该使用它们)?
提前感谢,
Chris。
谢谢大家!非常有趣的讨论。
我选择了egaga的答案,因为他们提供了Get vs Find作为编码指南的建议,但所有答案都很有趣。