C#最佳实践:私有变量和公共Getter/Setter或公共变量

5
下面两种编码风格有什么优点和区别...
public void HelloWorld () {

        private string _hello;

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

或者

public void HelloWorld () {

        public string Hello { get; set; }

}

我更喜欢简短的代码,但是很想听听其他人的意见,因为我看到很多开发者坚持走冗长的路线。


5
我建议将标题更改为类似于“手动实现属性和自动属性之间的区别”之类的内容。您的代码示例中没有公开变量(或者更准确地说,应该是字段)。 - Fredrik Mörk
6个回答

14
第一个方法允许你自定义访问器。例如,你可能想要在 setter 中验证值,或者在 getter 中懒加载值。它还允许你将后备字段设置为只读。readonly 第二种形式不允许任何定制(除了 getter 和 setter 的可访问性)。它只是第一种形式的简写等效形式。
如果 getter 和 setter 中不需要执行任何特定操作,通常使用第二种形式更加方便。

5

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

关于哪个更优的优点,第一种方法允许你在getter或setter中进行额外的工作(例如检查null或属性更改通知):

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

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

4

除非你需要在私有后备字段上执行一些初始化操作或出于其他原因需要它,否则更简洁的自动属性通常更受青睐。

因此,在你的例子中,如果没有对后备字段进行任何操作,我总是更喜欢使用自动属性。


1

在下面的假设中,我认为您没有其他需要,如验证/副作用。

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

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


1

如果我说错了,请纠正我,但据我所知,您无法调试自动属性。 请参见链接文本

因此,如果您需要在getter/setter上设置断点,则需要使用冗长的形式。


0

您在这里所做的区分是使用显式变量存储属性值与使用自动生成的属性变量之间的区别。

使用显式变量可以做很多自动生成的属性变量无法做到的事情。您可以在字段声明中初始化它,而不是在构造函数中。您可以验证它。您可以规范化它(例如修剪字符串等)。

但是,如果您不需要执行任何操作,则自动属性就可以了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接