【发布时间】:2017-09-28 15:27:13
【问题描述】:
假设我有以下代码:
var arg = getArg();
if(arg != null)
{
foo(arg);
}
有没有办法缩短空值检查+函数调用? 例如,是否有一个可能像“安全”这样的操作符会像这样工作
foo(safe arg);
这将转化为“仅当 'arg' 不为空时才调用 foo”? 我基本上不想将可能为 null 的参数发送给函数,而是以简短的方式发送。
谢谢!
【问题讨论】:
-
与您所描述的最接近的是,如果您正在调用
fooonarg,则可以使用空条件运算符?。即如果你做了arg?.foo(),那么foo只会在arg不为空时被调用。 -
这是严重代码异味的标志。 getArg() 有问题,它几乎肯定应该抛出异常。好吧,修复也不迟,调用后抛出异常。 Fwiw,永远不要试图掩盖一个严重的设计问题,这会伤害并让任何阅读它的人想要修复它。
-
@Abion47 三元运算符仍然需要检查 null 和要求删除检查的问题。此外,您的第一个建议完全忽略了类的设计和语义。
-
@Abion47:“如果设计得当,函数(或方法,更确切地说,因为这是 C#)不应该关心它是否作为参数传递
null” - 不同意。传递非null引用很可能是调用有意义的先决条件。作为void方法,它可能会检查其参数并在参数为null时立即返回,但非void方法不一定这样做(因为“默认值”不一定有意义)。相反,在任何情况下都应该抛出ArgumentNullException,此时显然是调用代码的责任...... -
@Abion47:如果在
null参数的情况下抛出异常,调用代码执行的事先检查是合理的。抛出异常的事实意味着“除非您有非null要传递的东西,否则不要调用此方法”。调用代码检查的意思是“如果我有arg,我需要调用它上面的方法,但如果我没有arg,什么都不应该发生。”