C#自动属性

我有点困惑在C#中的自动属性点

public string Forename{ get; set; } 

我知道你是通过不必声明私有variables来保存代码,但是当你不使用任何获取或设置逻辑时,属性的意义何在? 为什么不使用

 public string Forename; 

我不确定这两个语句之间有什么区别,如果你想要额外的获取/设置逻辑,我总是认为你使用了属性?

属性可以将代码放入其中而不会破坏合同,字段不能将代码放入其中而不将其更改为属性(并中断界面)。 属性可以只读或只写,字段不能。 属性可以是数据绑定,字段不能。

你可以写

 public string Forename{ get; private set; } 

获取只读属性…仍然不如真正的属性多才多艺,但它是一些妥协的作品。

我不确定这两个语句之间有什么区别,如果你想要额外的获取/设置逻辑,我总是认为你使用了属性?

在第一种情况下,编译器会自动为你添加一个字段,并包装属性。 这基本上等同于做:

 private string forename; public string Forename { get { return this.forename; } set { this.forename = value; } } 

在字段上使用属性有很多优点。 即使你不需要一些具体的原因,如数据绑定,这有助于未来的API。

主要的问题是,如果你创build一个字段,但是在你的应用程序的第2版中,需要一个属性,你将会破坏API。 通过预先使用自动属性,您可以随时更改您的API,无需担心源代码或二进制兼容性问题。

这意味着你希望稍后添加逻辑。

如果你这样做,并从一开始就把它作为财产,你将不必重build相关的代码。 如果你把它从一个variables改变成一个属性,那么你将不得不这样做。

考虑看看自动属性和公共字段 , 字段与属性 , 自动属性 之间的区别 – 有用或不? , 为什么不使用公共领域 。

公共数据成员是邪恶的(因为对象不能控制它自己的状态的修改 – 它成为一个全局variables)。 打破封装 – OOP的宗旨。

自动属性是提供封装和避免写简单的属性锅炉板代码的苦差事。

 public string ID { get; set;} 

您可以将自动属性更改为将来的非自动属性(例如,您可以在setter中进行一些validation),而不会破坏现有的客户端。

 string m_ID; public string ID { get { return m_ID; } set { //validate value conforms to a certain pattern via a regex match m_ID = value; } } 

公共数据属性不能这样做。 将数据属性更改为属性将强制现有客户端重新编译,然后再次进行交互。

首先,您可以将属性设置为虚拟,并在inheritance类中实现逻辑。 之后您也可以在同一个类中实现逻辑,并且不会对任何依赖类的代码产生副作用。

当添加自动属性时,编译器会将获取设置逻辑添加到应用程序中,这意味着如果您稍后添加到此逻辑中,并且从外部库引用您的属性仍将工作。

如果你从一个公共variables迁移到一个属性,这将是一个引用你的其他库的重大改变 – 因此,为什么不从一个自动属性开始? 🙂

一个属性就像一个契约,你可以改变一个属性的实现而不影响使用你的类和属性的客户端。 你今天可能没有任何逻辑,但随着业务需求的变化,如果你想引入任何代码,属性是最安全的select。 以下2个链接是优秀的C#video教程。 第一个解释属性的需要而不是仅仅使用字段,第二个video解释不同types的属性。 我发现它们非常有用。

需要在C#中的属性

C#中的属性,只读,只写,读/写,自动实现

并非所有属性都需要获取/设置逻辑。 如果他们这样做,你使用一个私有variables。 例如,在一个MV-something模式中,你的模型不会有太多的逻辑。 但是你可以根据需要混合搭配。

如果您要使用像您所build议的代替属性的字段,则不能例如定义接口来正确描述您的类,因为接口不能包含数据字段。

看看下面的代码和解释。
The most common implementation for a property is getter or a setter that simply reads and writes to a private field of the same type as a property. An automatic property declaration instructs the compiler to provide this implementation. The compiler automatically generates a private backing field.
看看下面的代码:

  public class Stock { decimal currentPrice ; // private backing field. public decimal CurrentPrice { get { return currentPrice ; } set { currentPrice = value ; } } } 

相同的代码可以被重写为: –

  public class Stock { public decimal CurrentPrice { get ; set ; } // The compiler will auto generate a backing field. } 

消息来源:C#在一个坚果壳