4

我只是在调试一些看起来像这样的代码:

string someValue = _snuh.FindItem(id).Value;

我想检查FindItem()(它返回 a Foo)的返回值,所以我将代码分成两行:

Foo foo = _snuh.FindItem(id);
string someValue = foo.Value;

这让我可以在调试器中查看 foo ;当代码都在一行时,我无法做到这一点。

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

4

6 回答 6

5

两条线比一条线更好:

  • 你可以调试它们
  • 如果您有一个空指针,您将在错误日志中看到行号(并直接查看错误所在)
  • 它更具可读性
  • 不需要额外的评论来解释单线正在做什么
  • 性能没有差异(编译器会优化到相同的IL)
  • 如果你在调试后重写代码,你可以引入新的错别字
于 2013-03-26T13:52:03.033 回答
4

您阅读代码的次数多于编写代码的次数。

将其保留为您认为最易读的形状。无论如何,JIT 都会优化您的代码。

于 2013-03-26T13:52:10.797 回答
3

在我们的工作场所,我们的代码风格指南要求将方法调用的结果存储在变量中。这背后的想法是,如果抛出空引用异常,行号将准确地告诉您哪个变量为空 - 如果您直接对方法的结果进行操作,这是不可能的。

在实践中,这条规则在一定程度上被藐视——尤其是在执行 Linq 查询时,因为 Linq 方法不返回空值(该指南早于 Linq 的广泛使用)。

于 2013-03-26T13:53:07.567 回答
3

在 Visual Studio 中,您可以使用“立即窗口”“添加监视”来调试语句的各个部分并查看它们的值,而无需使用额外的变量。

于 2013-03-26T13:53:18.623 回答
3

而不是像这样的一个班轮

string someValue = _snuh.FindItem(id).Value;

我宁愿重构这样你有

string someValue = _snuh.FindItemValue(id);

FindItem()并将随后Value的取消引用封装在一个函数中。

为什么 ?您的第一个解决方案公开了返回的对象的实现FindItem(即它有一个Value字段)。得墨忒耳法则提出了第二种变体。此外,如果您必须在许多地方执行此操作,它可以避免重复。如果您必须执行空检查,您只需执行一次

于 2013-03-26T13:54:30.723 回答
2

我个人会采用第二种方法,并在访问其“Value”属性之前对返回的对象进行“NULL”检查,因为它容易出现 Null 引用异常;看起来像下面这样。

string someValue = string.Empty;
Foo foo = _snuh.FindItem(id);
if (foo != null)
{
    someValue = foo.Value;
}

希望这可以帮助!!

于 2013-03-26T13:53:28.963 回答