有什么区别。。。?[C#属性获取/设置方式]
我知道在C#中,您可以轻松创建数据类型的访问器,例如,通过执行以下操作:有什么区别。。。?[C#属性获取/设置方式],c#,syntax,properties,field,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
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; }
}
}
我的方式似乎更简单、更简洁。这两种方式的区别和好处是什么
谢谢
编辑注意,我的同事能够使用“类详细信息”窗格中的重构选项生成“第二种方式”的代码,最容易在图表文件中找到。这使得添加许多属性变得很容易,而无需手动创建访问器。“您的方式”只是告诉编译器创建第二个选项。除非在getter或setter中执行其他操作,否则它们在功能上是相同的
然而,对于“你的方式”,我建议使用适当的C#命名约定。我个人认为:
public class DccProbeData
{
public float LinearActual { get; set; }
public float RotaryActual { get; set; }
}
唯一的区别是您已经命名了字段
(不过我还是坚持你的同事对公共属性的命名约定。)第一种方法是,当你需要简单的属性时,为你完成获取和设置以及私有存储 如果在获取或设置值时需要执行特殊操作,请使用第二种方法
另外,我建议您坚持使用FxCop或ReSharper的命名约定。我相信在IL级别,它们最终都是一样的。在后台,VS会在使用自动getter和setter时为您创建自动命名变量。唯一可能更好的方法是,如果您觉得以后将为getter和setter添加更多逻辑
即便如此,这似乎有点毫无意义 他们在内部做同样的事情。唯一的区别是,您不能使用自动实现的属性直接访问backing字段变量。它们在技术上是相同的。。。get/set是速记() 关于这一点有很多问题:
没有区别,但是在C#3之前,你必须走很长的路。说到底,这是一个C#特征——语法糖。它们在功能上都是相同的。您的方式不允许您初始化值,您同事的方式遵循更标准的命名约定。它们是相同的,因为您的代码示例将自动生成支持字段
但是这两个代码示例不同,因为属性的名称不同(
linearractal
vslinearractal
)我想添加一些我在其他答案中没有看到的内容,这使得#2成为一个更好的选择:
使用第一种方法,您不能在get
和set
上设置断点
使用第二种方法,您可以在
get
和set
上设置断点,这对于调试访问私有变量的任何操作都非常有帮助。好的,前面已经提到过这些名称。还值得注意的是,除了不符合正常的.NET约定外,以下划线开头的公共名称也不符合CLS(事实上,将其用于私有名称的一个原因正是因为如此,它使区分更加清晰,并且如果您意外地具有错误的访问级别,应该会导致一些代码检查器发出警告)
撇开名称不谈,后一种形式的一个优点是可以添加更复杂的代码。不过,从前一种样式到后一种样式是一种不间断的更改,因此在需要之前没有理由这样做。不使用自动实现的属性时可以做的事情:
- 初始化为默认值
- 访问或注释支持字段(属性)
- 只读备份字段或不变性
- 在访问时设置断点
- 对变量的访问有自定义代码
- 用于在访问器上启用自定义逻辑,以避免在编码时意外绕过
- 对intellisense隐藏支持字段
这并不是说一定不要使用它们,除非您需要列出的任何其他功能。您的同事在建议您时提到了哪些好处?我认为这种解释是正确的“您的命名看起来像是公开了内部变量。如果您想保留下划线版本供内部使用,请将其设置为私有,并为公共属性提供良好的名称,以包装u)字段。“@Martinho他提到了关于第一个使用匿名对象的东西,但我不太清楚他的意思。@Alexei谢谢,你是对的,我应该像第二种方式一样使用属性的命名约定。@Ryan:从这里的答案可以看出,没有“匿名对象”。当将短格式转换为长格式时,编译器会创建具有不可命名名称的私有字段(即,您无法使用它们的名称),因此这可能就是您同事的意思。别忘了使用“prop”,然后使用键盘上的TAB:-)我不明白。你说的是什么公共字段?对不起,意思是公共属性-文本更改如果你想添加更多逻辑,它们仍然是一样的。为了完整性,你同事的方法还允许设置属性的默认值。在您的代码上下文中,数字
0f
可能对某些事情有重要意义。@Matt:如果第二种形式在调试时没有任何作用,那么它有多大帮助?你会在那里调试什么?@Martinho:你说得对,简单的访问器不会给你太多,但我指的是在getter和setter中放置断点,这样你就可以看到内部成员何时被命中,以及它在不同时间的状态。我喜欢有一个成员,我可以悬停在上面,看看它的内部结构