C#BestPractice:私人var和公共的getter/setter或公共变种

问题描述:

有什么优点及以下两种编码风格之间的差异...C#BestPractice:私人var和公共的getter/setter或公共变种

public void HelloWorld() { 

     private string _hello; 

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

public void HelloWorld() { 

     public string Hello { get; set; } 

} 

我的选择是对简短的简单代码,但有兴趣听到意见,因为我看到许多坚持漫长路线的开发者。

+4

我建议将标题改为*“手动实现的属性和自动属性之间的区别”或类似的东西。您的代码示例都没有公开变量(或者是字段,因为它应该在这种情况下)。 – 2011-01-07 20:52:50

第一个允许您自定义访问器。例如,你可能想要验证setter中的值,或者在getter中延迟加载该值。它也可以让你做后台readonly

第二种形式不允许定制(除了getter和setter的可访问性)。这只是第一种形式的缩写。

如果你不需要在getter和setter中做任何特定的事情,第二种形式通常更方便。

+0

感谢您提醒社区关于`readonly`。 – 2011-01-07 20:51:26

+1

穷人,被忽视,被遗忘的只写属性... – WernerCD 2011-01-07 21:53:28

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

因此,对于您的示例,如果在后台字段中没有任何内容正在处理,我总是更愿意使用auto属性。

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

仅就在另一个的优点去,第一种方式可以让你做的额外工作的getter或setter(如空或属性更改通知的检查):

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

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

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

  • 只有在早期版本的C#
  • 的第一部作品只有第一个允许简单的现场初始化器(而非构造函数)
  • 只有第一个允许添加属性的例如,为[NonSerialized]
  • 两个之间的切换可破坏某些串行器(BinaryFormatter例如)和基于反射的代码

{get;set;}更简洁,并且在大多数情况下都是首选。

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

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

但是,如果你不需要做任何的,那么汽车道具就好了。

纠正我,如果我错了,但据我所知,你不能调试汽车性能。 请参阅link text

所以,如果您需要getter/setter的断点,您将需要详细的表单。