正确使用C#属性

private List _dates; public List Dates { get { return _dates; } set { _dates = value; } } 

要么

 public List Dates { get; set; } 

我一直用前者,是不正确还是不好的做法? 我从未想过我可以使用第二个选项。 我喜欢让我的封装变量以下划线开头,所以我可以将它们与方法参数区分开来。 而我总是那样做。

是否有可能使用第一个选项会导致额外的List对象被实例化,然后整个_dates被替换为value ,还是比它更智能?

此外,哪个是行业中最突出的还是完全主观的?

它们在内部编译forms中是等效的,除了您不能以第二种forms访问编译器生成的私有变量。

从代码效率的角度来看,它们也是等价的,即时编译器通常直接访问私有变量而没有调用访问函数的开销(在运行时环境检查了可访问性等之后)。

从编码的角度来看,我更喜欢第二个版本,它更紧凑(写入少,阅读少)。

第二种语法是在C#3.0中引入的。 因此第一个变体将与旧编译器更兼容。

如果您需要为getter / setter添加某种逻辑,请使用前者。

否则使用后者。 它使事情变得更加清洁。 您还可以使用自动属性实现只读属性:

 public List Dates { get; private set; } 

或者,如果您不希望人们通过属性向列表中添加任何项目,您可以使用以前的语法:

 private List _dates = new List(); private ReadOnlyCollection _readOnlyDates = new ReadOnlyCollection(_dates); public ReadOnlyCollection Dates { get { return _readOnlyDates; } } 

由于.NET如何编译自动属性,两者基本相同。 .NET 3.5提供了自动属性。

我倾向于更多地使用自动属性,因为属性是表达对象正在做什么的意图的好方法,但仍然有一些保护。

几乎所有的属性声明都是这样的:

 public bool IsBlah { get; private set; } 

这使它成为一个漂亮,可读和受保护的getter。

但有时您需要明确的支持字段:

 private bool? _isBlah; public bool IsBlah { get { if (_isBlah == null) { // Do something expensive here and set _isBlah _isBlah = true; } return _isBlah; } } 

前者是原始方法,后者是较新的“自动属性”工具的示例,编译器会自动为您生成支持字段。

有些人(包括我自己)回避自动属性,因为语法很容易被误认为是抽象属性,没有“readonly”属性的设施,并且私有setter的自动属性的语法是笨拙的:

 public List Dates { get; private set; } 

我也发现让我的类的内部实现通过类API访问字段感到不舒服。

第二个变体被称为自动实现的属性 ,并在C#3.0中引入(因此您可能以前没有遇到它)。

如果要使用后备字段创建简单属性并且不需要在“getter”和“setter”中实现任何逻辑,则最好使用此格式。 它不仅更简洁,而且还迫使您直接访问该属性,而不是通过支持字段,这通常是最佳实践。

请注意,您仍然可以初始化属性,只需通过构造函数即可。

 public class MyClass { public List Dates { get; set; } public MyClass() { Dates = new List(); } } 

我个人更喜欢第一种方法,因为它允许您在返回之前执行一些操作。

EG(一个非常糟糕的例子)

  private int _limit; private int _onHand; private bool returnToVendor; public Item(int limit, int onHand) { _limit = limit; _onHand = onHand; } public int ReturnStock { get { if(_onHand > _limit) { returnToVendor = true; return _onHand; } } set { _onHand = value; if(_onHand < _limit) { returnToVendor = false; } } } 

没关系。 第二个只是糖。 我总是使用第二个,因为它更干净,但每隔一段时间我就需要访问支持值。

只要您不必确保在getter中初始化List ,您就可以使用这两个版本。 我只是建议您使用一个版本而不要在代码中混合它…

如果你需要它初始化你必须去第一个版本…

 private List _dates; public List Dates { get { if (_dates == null) _dates = new List(); return _dates; } set { _dates = value; } } 

我相信他们编译成相同的代码。 后者只是代表前者的语法糖。 我倾向于认为后者是未来逻辑的占位符,可能需要放置在属性中,此时我将所述受影响的属性转换为前者。

两者的编译方式大致相同(我不知道支持字段的名称将特别相同,但它们在function上是等同的)。

IIRC,在.NET 3.0或3.5中添加了执行自动属性( public List Dates {get; set;} )的function。

据我所知,我总是从我的对象中管理我的列表属性,使它们只读。

 private IList _dates; public MyClass() { _dates = new List(); } public IList Dates { get { return _dates; } } 

通过这样做,我确保我访问它时我的列表永远不会为空,因为客户端无法分配它。

但是,对于您的示例,如果在获取或设置属性时需要某种逻辑,则只需使用前一种方法。 否则,自动属性与您完全相同,只是获取并设置私有字段的值。 而且, { get; set; } { get; set; } 从我的谦虚的角度来看,提高可读性并帮助其他程序员理解你的意图。

例如:

 public class MyClass { private IList _dates; public IList Dates { get { return _dates; } set { _dates = value; } } } 

 public class MyClasse { public IList Dates { get; set; } } 

第二种方式使它更精简,更快,至少对我来说,意图是什么。 当getter和setter中没有逻辑是必要的时候,编写一个类变得更快。

否则,一个并不比另一个好,并且完全相同,谈到获取和设置属性的值没有逻辑。

最重要的是,您需要熟悉您的代码。 如果它结束了你没有得到任何改进,你喜欢你正在做的事情,而不仅仅是做它。 =)