用“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;当所有代码都在一行中时,我无法做到这一点。

现在我已经完成了调试,我应该把代码放回原来的样子,还是把它保留为两行?

用“extra”有错吗?变量,因为它更容易调试

两行比一行好:

  • 你可以调试它们
  • 如果你有一个空指针,你将看到行号在你的错误日志(并直接看到什么是错误的)
  • 可读性更强
  • 不需要额外的注释来解释一行代码在做什么
  • 没有性能差异(编译器将优化到相同的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;
}

希望这有帮助!!