新的C#語言特性:自動屬性(Automatic Properties)
如果你現在是C#開發人員的話,你大概非常習慣編寫象下面這個程式碼片段一樣帶有基本屬性的類型:
public class Person {
//聲明Person類中的私人欄位
private string _firstName;
private string _lastName;
private int _age;
//實現屬性操作
public string FirstName {
get {
return _firstName;
}
set {
_firstName = value;
}
}
public string LastName {
get {
return _lastName;
}
set {
_lastName = value;
}
}
public int Age {
get {
return _age;
}
set {
_age = value;
}
}
}
注 意,我們在屬性的geter/setter中實際上並沒有添加什麼邏輯,我們只是將get/set實施到了一個成員變數。我們不禁要問這樣一個問題:為什 麼不直接使用成員變數而使用屬性呢?這是因為,向外面呈現公開的成員變數有很多不好的地方。二個最大的問題是:1) 你無法輕易地對成員變數做資料繫結,2) 如果你從類中向外呈現成員變數的話,之後,你不重新編譯那些引用老的類的任何程式集,就無法將它們改成屬性(譬如,要添加驗證邏輯到setter裡)。
Orcas中發布的新C#編譯器通過一個叫“自動屬性(automatic properties)”的語言特性提供了一個優雅的方式來使得你的編碼更加簡潔,同時還保持屬性的靈活性。自動屬性允許你避免手工聲明一個私人成員變數 以及編寫get/set邏輯,取而代之的是,編譯器會自動為你產生一個私人變數和預設的get/set 操作。
譬如,使用自動屬性,我現在可以將上面的代碼改寫成:
public class Person {
public string FirstName {
get; set;
}
public string LastName {
get; set;
}
public int Age {
get; set;
}
}
或者,我想更簡明的話,我可以將空白的地方做進一步壓縮,象這樣:
public class Person {
public string FirstName { get; set; }
public string LastName { get; set; }
public int Age { get; set; }
}
當 Orcas版中的C#編譯器遇上象上面這樣的空的get/set屬性的話,它會自動為你在類中產生一個私人成員變數,對這個變數實現一個公開的 getter 和setter。這麼做的好處是,從類-合約(type-contract)的角度來看,這個類跟我們上面第一個有點冗長的實現看上去完全一樣,這意味 著,不象公開的成員變數,在將來,我可以在我的屬性setter實現中添加驗證邏輯,而不用對引用我的類的任何外部組件做改動。
Bart De Smet對使用Orcas三月份CTP版中的自動屬性時內部發生的情形作了精彩的描述,你可以在這裡閱讀他的精彩相關文章。