之前的做法:
在c#3.x出來之前,相信大家已經習慣通過一個private field + public property的發式來定義和實現一個public Property。就如下面方式實現。
1class person
2 {
3 private int age;
4 private string _name;
5 public int Age
6 {
7 get { return age; }
8 set { age = value; }
9 }
10 public string Name
11 {
12 get { return _name; }
13 set { _name = value; }
14 }
15 }
顯然你可以在Property中的set/get代碼塊中,我們可以不受限制地定義我們 的業務邏輯,但是在大多是場合下,我們都是像上面的code一樣直接對一個定義 的field進行操作:對其讀寫。但是我們如果根據項目的需要,例如作為 Business Entity的Class,需要封裝非常多的數據,我們需要為不同類型的數據 分別定義一個Property,這樣不斷重復的工作大家一定覺得很厭煩。
Automatic Property Overview
在c#3.x出來之後,我們可以通過Automatic Property來簡化我們的操作。例 如:
1class Employee
2 {
3 //public string Name { get; } error
4 public string Name { get; set; }
5 public int Age{get; private set;}
6 public Employee(string name,int age )
7 {
8 this.Name = name;
9 this.Age = age;
10 }
11 }
上面的好處我就不用說了。
Automatic Property IN CLR
首先讓我們看看c#3.x出來之前和出來之後,編譯器是怎麼處理的:
大家可以看到,C#3.x僅僅是基於.NET Programming Language,而不是基 於.NET Framework的。加了一些必要的code,使原本我們看起來顯得殘缺的code (比如缺少對Property 的實現)變得完整。在運行的時候,這些code和原來的 code是完全一樣的。Automatic Property代碼裡多處了兩個域 <Age>k_BackingField和<Name>k_BackingField,他們的作用就是 :他們分別對應著兩個Property(Age,Name),其作用和person中定義的兩個 Field(Age,Name)完全一樣。代碼如下:
internal class Employee
{
// Fields
[CompilerGenerated]
private int <Age>k__BackingField;
[CompilerGenerated]
private string <Name>k__BackingField;
// Methods
public Employee(string name, int age);
// Properties
public int Age { get; private set; }
public string Name { get; set; }
}
Quiz for Automatic Property
注意與抽象屬性的區別
abstract class people
{
public abstract string Name { get; set; }
public abstract int Age { get; set; }
}
不能定義只讀或者只寫的屬性,必須同時提供
請看上面Employee。第一行,編譯器會報錯。
可以給讀和寫賦予不同的訪問權限
請看上面Employee。Age屬性,請注意他的操作權限。
自動屬性的初始化
自動屬性會為字段自動賦予變量類型的初始值,如果是引用類型,則為null, 如果你想初始化,必須要在自定義的構造函數初始化。請看上面Employee。
不適用的情況
如果想在屬性中增加判斷、驗證等邏輯,則只能用傳統的屬性定義方法實現 如 下:
1public int Age
2{
3 get { return age; }
4 set
5 {
6 if ((value > 0) && (value < 500))
7 {
8 age = value;
9 }
10 else
11 {
12 throw new ArgumentOutOfRangeException ("你不是人!");
13 }
14 }
15}
16