什么时候应该使用字段而不是属性?

当你使用一个字段以及何时在类设计中使用一个属性时,任何人都可以清楚地表达出来吗?

考虑:

public string Name; 

要么:

 private string _Name; public string Name { get { return _Name; } set { _Name = value; } } 

我意识到第二种方法更加正确和灵活,所以我通常会尝试使用它。

但那为什么我看到人们使用第一种方法呢? 他们只是懒惰,还是有一些特定的情况,这是正确的选择? 这只是一个偏好问题吗?

那么在C#3.0中你可以写:

 public string Name {get; set;} 

这让你变得恰到好处和懒惰。

一般来说,通过属性,您可以获得适当的封装。 您可以选择允许设置值,或者获取值,或者两者兼而有之。 使用公共成员,您没有该选项。

它可能是一部分偏好,也是你的团队决定处理快速和脏类定义的一部分,但我会说,使用get / sets属性。

回答

当你使用属性以及何时在类设计中使用属性时,任何人都可以清楚地表达出来吗?

您不应该使用公共属性。 您应该始终使用属性。 它更安全,更灵活。 也就是说,人们会懒惰,只使用公共成员。 但是,使用C#3.0,您可以使用更简洁的语法来定义属性,这应该满足您的内部懒惰。

只需输入prop并点击即可加快添加属性的懒惰。

只是Alan的回复的一些额外信息:

 public string Name {get; set;} 

是相同的

 private string _Name; public string Name{ get { return _Name; } set { _Name = value; } } 

如果你想禁止Name的setfunction,你可以拥有

public string Name {get; 私人集;}

属性比字段更易于维护,您可以在您的setter / getter中封装逻辑,允许您隐藏实现。

它们还使重构更容易。

更多信息:

  • 物业使用指引
  • 现场使用指南

使用属性可以控制它的安全性:

 public string Foo { protected get; private set; } 

属性提供了引发事件的简便方法:

 public string Foo { get { return _foo; } } set { bool cancel = false; if(BeforeEvent != null) // EventHandler BeforeEvent { CancelEventArgs e = new CancelEventArgs(); BeforeEvent(this, e); cancel = e.Cancel; } if(!cancel) { _foo = value; if(AfterEvent != null) // EventHandler AfterEvent { AfterEvent(this, new EventArgs()); } } } 

我经常使用这样的代码:

 string Foo { set { IsFooSet = value != null; } } bool IsFooSet { get { return _isFoo; } set { _isFoo = value; if(value) // some event raise or controls on form change } } 

当您将该字段设为公开时,您允许用户对该字段执行任何他们想要执行的操作。 它们可以分配意外值,无效值,可能导致溢出的值等。

使用该属性,您可以控制是否允许在字段中设置新值,在存储之前按摩该值,通知感兴趣的各方有关字段值的更改等。并且通过getter返回值的相同想法。 对于2.0以上的.NET框架,您可以设置getter,setter的访问器。 比如说,您只希望用户只对该字段具有读取权限,然后将getter公之于众,但setter为private或protected。

除了已经给出优选属性的原因之外,System.ComponentModel中还有许多很酷的东西来处理数据绑定和更改通知,这些通知只适用于属性而不是字段。 例如,查看PropertyChangedHandler的文档。

上面定义的属性就像getter和setter一样。 使用属性的唯一好处是,您可以将其视为具有访问限制的变量。

 public string Name { get; private set; } 

此属性可以公开访问,但只能私下设置。 (你现在不希望有人在你同意的情况下更改你的名字!)))