7

Resharper 建议我将以下代码更改为自动属性。谁能解释为什么这会更好?

private List<Configuration> _configurations;
public List<Configuration> Configurations
{
    get { return _configurations; }
    set { _configurations = value; }
}

到:

public List<Configuration> Configurations { get; set; }

为什么可以对原始类型执行此操作,但建议对对象类型执行此操作?

4

5 回答 5

16

考虑两段等效的代码:

private List<Configuration> _configurations;
public List<Configuration> Configurations
{
    get { return _configurations; }
    set { _configurations = value; }
}

public List<Configuration> Configurations { get; set; }

对于读者来说,假设她了解 C#,那么第二段代码读起来很快。第一个需要更长的时间并且不添加任何信息。事实上,它添加了无用的信息:我有一个 property Configurations,但我也有一个等价的 field _configurations,并且类的其余部分中的代码可能会使用它们中的任何一个,因此我必须将它们都考虑在内。现在想象你的类有 15 个像这样的属性,例如。使用自动属性可以大大降低阅读代码的人的复杂性。

此外,如果您一直使用自动属性,那么每当您编写非自动属性时,都会立即警告读者那里发生了一些事情。如果您不使用自动属性,这些有用的信息将被隐藏。

总之,一致使用自动属性:

  • 减少代码长度
  • 减少阅读和理解课程所需的时间
  • 隐藏无用信息
  • 使有用的信息更容易找到

有什么不喜欢的?

于 2012-12-21T10:17:36.953 回答
2

两个代码之间的行为是相同的,自动属性只是语法糖,使没有逻辑的属性更易于阅读。

有关更多说明,请参阅MSDN 文档

在 C# 3.0 及更高版本中,当属性访问器中不需要额外的逻辑时,自动实现的属性使属性声明更加简洁。

于 2012-12-21T10:09:49.680 回答
1

我猜 re-sharper 已经确定自动属性在这里会更好,因为您的代码只是获取和设置支持变量,就像自动属性一样。

如果 re-sharper 检测到您的 getter 和 setter 不仅仅是分配和读取支持变量,我的假设是这不会成为问题。

由于各种原因,我不喜欢重新锐化。我更喜欢使用 StyleCop 和代码分析 (FXCop),但它的好处在于它可以帮助您的代码更具可读性和可维护性。这就是它在这里所做的一切。

于 2012-12-21T10:14:37.700 回答
0

如果您没有在属性中做任何聪明的事情,那么它只会减少代码,并增强代码的可读性 - 在幕后它会生成相同的代码。

你不想这样做的唯一一次是如果你想做这样的事情:

private readonly List<Configuration> _configurations = new List<Configuration>();
public List<Configuration> Configurations
{
    get { return _configurations; }        
}

我可能会推荐它,因为该属性将永远不会为空。

于 2012-12-21T10:10:06.780 回答
0

使用旧符号的唯一(暂时?)优点是您可以在遇到setandget方法时中断它们。

于 2012-12-21T10:48:19.957 回答