上個(gè)星期,我們發(fā)布了我們的Visual Studio和.NET框架Orcas版三月份的CTP,這是個(gè)誰都可以下的免費(fèi)下載,同時(shí)提供VPC鏡像(允許你在一個(gè)虛擬機(jī)里運(yùn)行它)以及單獨(dú)的安裝文件(注:如果你在運(yùn)行Vista的話,你要確認(rèn)你只使用VPC版本)。你可以在這里下載。
幾個(gè)星期前,我曾在博客上討論過Orcas中針對(duì)ASP.NET開發(fā)人員的一些重大的改進(jìn)。如果你還沒有讀過這個(gè)貼子的話,我強(qiáng)烈建議你在這里讀一下。我認(rèn)為你會(huì)非常喜歡該帖子討論的新特性的。
除了那些框架和工具類的精彩新特性外,我認(rèn)為開發(fā)人員(包括所有的.NET應(yīng)用類型的開發(fā)人員)會(huì)非常喜愛Orcas的一件事情是,VB和C#將包含一些新語言特性和改進(jìn)。這些語言改動(dòng)將以既微妙又深刻的方式改進(jìn)我們的開發(fā)體驗(yàn),勢(shì)將改進(jìn)效率,減小我們需要鍵入的代碼量。
在下幾個(gè)星期里,我將試著在博客里討論幾個(gè)這些語言的改進(jìn)之處,示范如何把它們使用在一起,來產(chǎn)生一些非常強(qiáng)有力的結(jié)果。
新的C#語言特性:自動(dòng)屬性(Automatic Properties)
如果你現(xiàn)在是C#開發(fā)人員的話,你大概非常習(xí)慣編寫象下面這個(gè)代碼片段一樣帶有基本屬性的類型:
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;
}
}
}
注意,我們?cè)趯傩缘膅eter/setter中實(shí)際上并沒有添加什么邏輯,我們只是將get/set實(shí)施到了一個(gè)成員變量。我們不禁要問這樣一個(gè)問題:為什么不直接使用成員變量而使用屬性呢?這是因?yàn)椋蛲饷娉尸F(xiàn)公開的成員變量有很多不好的地方。二個(gè)最大的問題是:1) 你無法輕易地對(duì)成員變量做數(shù)據(jù)綁定,2) 如果你從類中向外呈現(xiàn)成員變量的話,之后,你不重新編譯那些引用老的類的任何程序集,就無法將它們改成屬性(譬如,要添加驗(yàn)證邏輯到setter里)。
Orcas中發(fā)布的新C#編譯器通過一個(gè)叫“自動(dòng)屬性(automatic properties)”的語言特性提供了一個(gè)優(yōu)雅的方式來使得你的編碼更加簡(jiǎn)潔,同時(shí)還保持屬性的靈活性。自動(dòng)屬性允許你避免手工聲明一個(gè)私有成員變量以及編寫get/set邏輯,取而代之的是,編譯器會(huì)自動(dòng)為你生成一個(gè)私有變量和默認(rèn)的get/set 操作。
譬如,使用自動(dòng)屬性,我現(xiàn)在可以將上面的代碼改寫成:
public string FirstName {
get; set;
}
public string LastName {
get; set;
}
public int Age {
get; set;
}
}
或者,我想更簡(jiǎn)明的話,我可以將空白的地方做進(jìn)一步壓縮,象這樣:
public string FirstName { get; set; }
public string LastName { get; set; }
public int Age { get; set; }
}
當(dāng)Orcas版中的C#編譯器遇上象上面這樣的空的get/set屬性的話,它會(huì)自動(dòng)為你在類中生成一個(gè)私有成員變量,對(duì)這個(gè)變量實(shí)現(xiàn)一個(gè)公開的getter 和setter。這么做的好處是,從類-合同(type-contract)的角度來看,這個(gè)類跟我們上面第一個(gè)有點(diǎn)冗長(zhǎng)的實(shí)現(xiàn)看上去完全一樣,這意味著,不象公開的成員變量,在將來,我可以在我的屬性setter實(shí)現(xiàn)中添加驗(yàn)證邏輯,而不用對(duì)引用我的類的任何外部組件做改動(dòng)。
Bart De Smet對(duì)使用Orcas三月份CTP版中的自動(dòng)屬性時(shí)內(nèi)部發(fā)生的情形作了精彩的描述,你可以在這里閱讀他的精彩相關(guān)帖子。
C#和VB語言的新特性:對(duì)象初始化器(Object Initializers)
.NET框架中的類型非常依賴于屬性的使用。當(dāng)生成對(duì)象實(shí)例和使用新的類型時(shí),寫出象下面這樣的編碼是非常常見的情形:
person.FirstName = "Scott";
person.LastName = "Guthrie";
person.Age = 32;
你有沒有想要把這樣的編碼簡(jiǎn)化過(也許將其安排在一行上)?使用Orcas中的C#和VB語言編譯器的話,你現(xiàn)在可以利用一個(gè)稱為“對(duì)象初始化器(object Initializers)”的“語法甜頭(syntactic sugar)”語言特性來做些簡(jiǎn)化,將上述代碼重寫為:
然后,編譯器就會(huì)自動(dòng)地生成合適的屬性setter代碼,保持跟前面較冗長(zhǎng)的代碼例子同樣的語意。
除了在初始化類時(shí)設(shè)置簡(jiǎn)單的屬性值外,對(duì)象初始化器特性也允許我們?cè)O(shè)置更復(fù)雜的嵌套(nested)屬性類型。譬如,假如我們?cè)谏厦娑x的每個(gè)Person類型也擁有一個(gè)屬于Address類型的叫“Address”的屬性。我們可以編寫下面這樣的代碼來生成一個(gè)新的Person對(duì)象,同時(shí)設(shè)置它的屬性,象這樣:
FirstName = "Scott",
LastName = "Guthrie"
Age = 32,
Address = new Address {
Street = "One Microsoft Way",
City = "Redmond",
State = "WA",
Zip = 98052
}
};
Bart De Smet對(duì)使用Orcas三月份CTP版中的對(duì)象初始化器時(shí)內(nèi)部發(fā)生的情形也作了精彩的描述,你可以在這里閱讀他的精彩相關(guān)帖子。
C#和VB語言的新特性:集合初始化器(Collection Initializers)
對(duì)象初始化器很棒,它極大地簡(jiǎn)化了把對(duì)象添加到集合的做法。譬如,假如我要把三個(gè)人加到一個(gè)基于泛型的類型為Person的List集合中去的話,我可以寫下面這樣的編碼:
people.Add( new Person { FirstName = "Scott", LastName = "Guthrie", Age = 32 } );
people.Add( new Person { FirstName = "Bill", LastName = "Gates", Age = 50 } );
people.Add( new Person { FirstName = "Susanne", LastName = "Guthrie", Age = 32 } );
對(duì)這個(gè)例子,跟我使用C# 2.0編譯器要輸入的代碼相比,單獨(dú)使用新的對(duì)象初始化器特性就能省去12行額外的代碼。
但Orcas版中的C#和VB編譯器允許我們更進(jìn)一步,現(xiàn)在同時(shí)支持“集合初始化器(collection initializers)”,這允許我們避免要寫多個(gè)Add語句,省下更多的鍵盤操作:
new Person { FirstName = "Scott", LastName = "Guthrie", Age = 32 },
new Person { FirstName = "Bill", LastName = "Gates", Age = 50 },
new Person { FirstName = "Susanne", LastName = "Guthrie", Age = 32 }
};
當(dāng)編譯器遇上上面這樣的句法時(shí),它會(huì)自動(dòng)為我們生成象前面的例子一樣的集合插入編碼。
結(jié)語
作為開發(fā)人員,我們現(xiàn)在擁有了簡(jiǎn)明得多的方式來定義對(duì)象,對(duì)它們初始化,將它們加入集合內(nèi)。在運(yùn)行時(shí),其語意,跟今天的較長(zhǎng)的版本的語意,是完全一樣的(所以你不必?fù)?dān)心行為會(huì)改變)。但現(xiàn)在你不需輸入那么多字符了,你的代碼將既干凈又簡(jiǎn)明。
在不遠(yuǎn)的將來,我將發(fā)表更多的博客貼子來討論Orcas版中更多的語言上的改進(jìn),包括擴(kuò)展方法(Extension Methods),Lambdas和匿名類。然后,我將對(duì)LINQ做深入討論,示范它是如何利用所有這些特性來提供一個(gè)非常優(yōu)雅的方式來查詢和與數(shù)據(jù)交互的。