C#BestPractice:私有var和Public Getter / Setter或Public Var

时间:2011-01-07 20:44:16

标签: c#

以下两种编码风格有哪些优点和区别......

public void HelloWorld () {

        private string _hello;

        public string Hello {    
           get
            {
                return _hello;
            }
           set
            {
                _hello = value;
            }
        }
}

public void HelloWorld () {

        public string Hello { get; set; }

}

我的偏好是简单的简单代码,但有兴趣听到意见,因为我看到许多开发人员坚持漫长的路线。

6 个答案:

答案 0 :(得分:14)

第一个允许您自定义访问者。例如,您可能希望验证setter中的值,或者懒惰地在getter中加载该值。它还允许您创建支持字段readonly

第二种形式不允许自定义(除了getter和setter的可访问性)。它只是第一种形式的简写。

如果您不需要在getter和setter中执行任何特定操作,则第二种形式通常更方便。

答案 1 :(得分:5)

你的第二个例子不是公共变量,它只是一个自动属性。对于你的第一个例子,自动属性只是语法糖。

除了优势之外,第一种方式允许你在getter或setter中做额外的工作(例如检查null或属性更改通知):

private string _name;
public string Hello {    
{
    get
    {
        if(_name == null)
            _name = "Default Name";

        return _name;
    }
    set
    {
        _name = value;
        OnPropertyChanged("Hello");
    }
}

答案 2 :(得分:4)

除非您需要在私有支持字段上执行某些初始化或由于某些其他原因需要它,否则通常首选更简洁的自动属性。

因此,对于您的示例,在没有使用支持字段的情况下,我总是更喜欢使用auto-property。

答案 3 :(得分:1)

在下面我假设您没有任何其他需求,如验证/副作用。

  • 只有第一个适用于早期版本的c#
  • 只有第一个允许使用简单的字段初始化(而不是构造函数)
  • 只有第一个允许将属性添加到字段,例如[NonSerialized]
  • 在两者之间切换会破坏一些序列化程序(例如BinaryFormatter)和基于反射的代码

{get;set;}更简洁,在大多数情况下更受欢迎。

答案 4 :(得分:1)

如果我错了,请纠正我,但据我所知,你无法调试自动属性。 见link text

因此,如果你需要getter / setter上的断点,你将需要详细的表格。

答案 5 :(得分:0)

您在此处的区别在于使用显式变量来存储属性的值与使用自动生成的属性变量。

使用自动生成的属性变量无法对显式变量执行的操作有很多。您可以在字段声明中而不是在构造函数中初始化它。你可以验证它。您可以对其进行标准化(例如修剪字符串等)。

但是如果你不需要做任何这些,那么自动道具就可以了。