用“extra”有错吗?变量,因为它更容易调试
本文关键字:变量 因为 调试 更容易 extra | 更新日期: 2023-09-27 18:05:51
我只是在调试一些代码,看起来像这样:
string someValue = _snuh.FindItem(id).Value;
我想检查FindItem()
的返回值(它返回Foo
),所以我把代码分成两行:
Foo foo = _snuh.FindItem(id);
string someValue = foo.Value;
这允许我在调试器中查看foo;当所有代码都在一行中时,我无法做到这一点。
现在我已经完成了调试,我应该把代码放回原来的样子,还是把它保留为两行?
两行比一行好:
- 你可以调试它们
- 如果你有一个空指针,你将看到行号在你的错误日志(并直接看到什么是错误的)
- 可读性更强
- 不需要额外的注释来解释一行代码在做什么
- 没有性能差异(编译器将优化到相同的IL)
- 如果你在调试后重写代码,你可以引入新的错别字
你读的代码比写的多。
保持你觉得最易读的形状。JIT无论如何都会优化你的代码。
比起这样的一行字
string someValue = _snuh.FindItem(id).Value;
我宁愿重构,这样你就有了
string someValue = _snuh.FindItemValue(id);
并将FindItem()
和随后的Value
解引用封装在一个函数中。
为什么?你的第一个解决方案暴露了FindItem
返回的对象的实现(即它有一个Value
字段)。得墨忒耳定律提出了第二种变体。此外,如果你必须在许多地方这样做,它可以避免重复。如果必须执行空检查,则只需执行一次
在我们的工作场所,我们的代码风格指南要求将方法调用的结果存储在一个变量中。这背后的思想是,如果抛出空引用异常,行号将准确地告诉您哪个变量为空—如果直接操作方法的结果,这是不可能的。
在实践中,这条规则在一定程度上是被藐视的——特别是在执行Linq查询时,因为Linq方法不返回null(该准则早于Linq的广泛使用)。
在Visual Studio中,您可以使用"immediate window"或"add watch"来调试语句的部分并查看它们的值,而无需使用额外的变量。
我个人会选择第二种方法,以及在访问其"Value"属性之前对返回对象进行"NULL"检查,因为它容易产生NULL引用异常;如下图所示:
string someValue = string.Empty;
Foo foo = _snuh.FindItem(id);
if (foo != null)
{
someValue = foo.Value;
}
希望这有帮助!!