我知道在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; }
}
}
我的方式似乎更简单,更简洁。这样做有什么不同和好处?
由于
编辑只是一个注释,我的同事能够使用图表文件中最容易找到的“类详细信息”窗格中的“重构”选项生成“第二种方式”的代码。这样可以轻松添加许多属性,而无需手动创建访问器。
答案 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)。
关于此问题的很多问题:
答案 4 :(得分:1)
您的方式不允许您初始化值,而您的同事的方式遵循更标准的命名约定。
答案 5 :(得分:1)
我想在其他答案中添加一些我没有看到的东西,这使得#2成为更好的选择:
使用第一种方法无法在get
和set
上设置断点。
使用第二种方法,可以在get
和set
上设置断点,这对于调试访问私有变量的任何内容非常有帮助。
答案 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()]
在访问者上启用自定义逻辑,避免在编码时意外绕过
使用ReSharper,两种方式之间的转换非常简单。
这并不是说不要一定使用它们,除非你需要列出任何其他功能。