有什么不同...? [C#属性GET / SET方式]

时间:2011-03-24 16:22:02

标签: c# syntax properties field

我知道在C#中,您可以轻松地创建数据类型的访问器,例如,通过执行以下操作:

public class DCCProbeData
{
    public float _linearActual { get; set; }
    public float _rotaryActual { get; set; }
}

但是我的同事建议我这样做:

public class DCCProbeData
{
    private float _linearActual = 0f;

    public float LinearActual
    {
        get { return _linearActual; }
        set { _linearActual = value; }
    }
    private float _rotaryActual = 0f;

    public float RotaryActual
    {
        get { return _rotaryActual; }
        set { _rotaryActual = value; }
    } 
}

我的方式似乎更简单,更简洁。这样做有什么不同和好处?

由于

编辑只是一个注释,我的同事能够使用图表文件中最容易找到的“类详细信息”窗格中的“重构”选项生成“第二种方式”的代码。这样可以轻松添加许多属性,而无需手动创建访问器。

13 个答案:

答案 0 :(得分:24)

“你的方式”只是告诉编译器创建第二个选项。除非你在getter或setter中做了其他事情,否则它们在功能上是相同的。

但是,以“你的方式”,我建议使用正确的C#命名约定。我个人会把它写成:

public class DccProbeData
{
    public float LinearActual { get; set; }
    public float RotaryActual { get; set; }
}

答案 1 :(得分:3)

唯一的区别是你已经命名了字段。

(我会坚持你的同事为公共财产命名约定。)

答案 2 :(得分:1)

他们在内部做同样的事情。唯一的区别是您无法使用“自动实现的属性”直接访问支持字段变量。

答案 3 :(得分:1)

它们在技术上是相同的... get / set是速记(auto property)。

关于此问题的很多问题:

  1. When to use get; set; in c#
  2. What is the { get; set; } syntax in C#?
  3. Auto-Implemented Properties c#

答案 4 :(得分:1)

您的方式不允许您初始化值,而您的同事的方式遵循更标准的命名约定。

答案 5 :(得分:1)

我想在其他答案中添加一些我没有看到的东西,这使得#2成为更好的选择:

使用第一种方法无法getset上设置断点。

使用第二种方法,可以getset上设置断点,这对于调试访问私有变量的任何内容非常有帮助。

答案 6 :(得分:1)

好的,以前曾提到这些名字。同样值得注意的是,除了不遵循正常的.NET约定之外,开始使用下划线的公共名称不符合CLS(事实上,将其用于私有名称的一个原因正是因为这样,它才能区分更清楚,如果你不小心有错误的访问级别,应该在某些代码检查器中发出警告。)

除了名称之外,后一种形式的一个优点是可以添加更复杂的代码。不过,从前一种风格到后一种风格都是一种不断变化的变化,所以没有理由在它需要之前做到这一点。

答案 7 :(得分:0)

第一种方法是当你需要为你完成get和set以及私有存储的简单属性时的方法。

如果您在获得或设置值时需要做一些特别的事情,请使用第二种方式。

另外,我建议您坚持使用FxCop或ReSharper命名约定。

答案 8 :(得分:0)

我相信在IL级别,他们最终都是一样的。在后台,VS在使用自动getter和setter时为您创建自动命名变量。

答案 9 :(得分:0)

这可能会更好的唯一方法是,如果您觉得您将在以后为getter和setter添加更多逻辑。

即便如此,这似乎有点无意义。

答案 10 :(得分:0)

没有区别,但是在C#3之前你必须使用很长的路。在一天结束时,它是一个C#功能 - 语法糖。它们在功能上都是相同的。

答案 11 :(得分:0)

在代码示例将自动生成支持字段的意义上它们是相同的。

但两个代码示例不同,因为属性的名称不相同(LinearActual vs linearActual

答案 12 :(得分:0)

不使用自动实现的属性时可以执行的操作:

  • 初始化为默认值
  • 访问或注释支持字段(属性)
  • 只读后备字段或不变性
  • 在访问时设置断点
  • 拥有围绕访问变量的自定义代码
  • 使用[System.ComponentModel.EditorBrowsableAttribute()]在访问者上启用自定义逻辑,避免在编码时意外绕过
    • 隐藏来自intellisense的支持字段

使用ReSharper,两种方式之间的转换非常简单。

这并不是说不要一定使用它们,除非你需要列出任何其他功能。