有什么区别。。。?[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

我知道在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; }
    } 
}
我的方式似乎更简单、更简洁。这两种方式的区别和好处是什么

谢谢

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

“您的方式”只是告诉编译器创建第二个选项。除非在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
    vs
    linearractal

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

    使用第一种方法,您不能在
    get
    set
    上设置断点


    使用第二种方法,您可以在
    get
    set
    上设置断点,这对于调试访问私有变量的任何操作都非常有帮助。

    好的,前面已经提到过这些名称。还值得注意的是,除了不符合正常的.NET约定外,以下划线开头的公共名称也不符合CLS(事实上,将其用于私有名称的一个原因正是因为如此,它使区分更加清晰,并且如果您意外地具有错误的访问级别,应该会导致一些代码检查器发出警告)


    撇开名称不谈,后一种形式的一个优点是可以添加更复杂的代码。不过,从前一种样式到后一种样式是一种不间断的更改,因此在需要之前没有理由这样做。

    不使用自动实现的属性时可以做的事情:

    • 初始化为默认值
    • 访问或注释支持字段(属性)
    • 只读备份字段或不变性
    • 在访问时设置断点
    • 对变量的访问有自定义代码
    • 用于在访问器上启用自定义逻辑,以避免在编码时意外绕过
      • 对intellisense隐藏支持字段
    使用ReSharper,这两种方式之间的转换变得非常简单


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

    您的同事在建议您时提到了哪些好处?我认为这种解释是正确的“您的命名看起来像是公开了内部变量。如果您想保留下划线版本供内部使用,请将其设置为私有,并为公共属性提供良好的名称,以包装u)字段。“@Martinho他提到了关于第一个使用匿名对象的东西,但我不太清楚他的意思。@Alexei谢谢,你是对的,我应该像第二种方式一样使用属性的命名约定。@Ryan:从这里的答案可以看出,没有“匿名对象”。当将短格式转换为长格式时,编译器会创建具有不可命名名称的私有字段(即,您无法使用它们的名称),因此这可能就是您同事的意思。别忘了使用“prop”,然后使用键盘上的TAB:-)我不明白。你说的是什么公共字段?对不起,意思是公共属性-文本更改如果你想添加更多逻辑,它们仍然是一样的。为了完整性,你同事的方法还允许设置属性的默认值。在您的代码上下文中,数字
    0f
    可能对某些事情有重要意义。@Matt:如果第二种形式在调试时没有任何作用,那么它有多大帮助?你会在那里调试什么?@Martinho:你说得对,简单的访问器不会给你太多,但我指的是在getter和setter中放置断点,这样你就可以看到内部成员何时被命中,以及它在不同时间的状态。我喜欢有一个成员,我可以悬停在上面,看看它的内部结构