【问题标题】:ReSharper. Why convert to an autoproperty?重新锐化。为什么要转换为自动属性?
【发布时间】:2012-12-21 10:06:15
【问题描述】:

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

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

收件人:

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

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

【问题讨论】:

  • 它并不是更好,只是更干净,更易读。
  • 你为什么不想要更简洁的自动属性?
  • 那么除非我需要 getter 和 setter 中的逻辑,否则你会说对所有属性都执行此操作吗?
  • @Base33 - 是的。除非您需要 getter 或 setter 中的逻辑,否则对所有内容都使用自动属性。
  • 注意:如果您使用的是BinaryFormatter,那么这是一个重大更改

标签: c# resharper


【解决方案1】:

考虑两段等效的代码:

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

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

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

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

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

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

有什么不喜欢的?

【讨论】:

  • 并在 Visual Studio 代码编辑器中添加到此答案类型 prop 并按 TAB。此代码 sn -p 扩展为自动属性。
【解决方案2】:

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

更多解释请见MSDN documentation

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

【讨论】:

  • 当使用自动属性时,我猜你不太想在其他实例方法中弄乱底层私有字段(_configurations)。读取/分配到底层字段通常会导致代码难以理解
  • 没错,如果没有逻辑就不需要声明一个字段和一个属性。如果以后添加逻辑,使用属性会比使用私有字段更安全。跨度>
【解决方案3】:

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

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

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

【讨论】:

    【解决方案4】:

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

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

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

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

    【讨论】:

    • 如果你想初始化它,你可以使用带有私有设置器的自动属性并在构造函数中初始化它。
    【解决方案5】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-05
      • 1970-01-01
      • 2012-05-30
      • 2012-09-20
      • 2022-01-10
      相关资源
      最近更新 更多