自從微軟March CTP版本的Visual Studio和.net Framework “Orcas”發布以來,許多博客作家都在考察和評論這一版本在run-time macros和code metrics等方面的新特性。
近日,微軟ASP.NET 和Ajax開發部的頭腦Scott Guthrie又在其博客中發布了C# 3.0的一些新特性。其文中重點提及的C#3.0的新特性如下:
Automatic properties——自動屬性
Orcas 版的C#可以自動建立私有域和默認的get/set函數,而不必由用戶手工聲明私有域和手工建立get/set函數。如:我們使用以前的C#語言編程時,需要手工書寫如下代碼段:
以下是引用片段:
public class 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;
}
}
}
使用Orcas 版的C#後我們可以利用其自動屬性功能重寫如上代碼如下:
以下是引用片段:
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;
}
}
當C# “Orcas”編譯器遇到一個如上所示的空白的get/set property implementation時,它將會在你的類中自動產生一個私有域,同時實現一個公共的getter and setter property implementation。這樣做的好處是,從type-contract的角度看,類好像使用了上述第一段代碼中的執行(implementation)。這就意味著,與公共領域不同,我們將來可以在property setter implementation中添加驗證邏輯,而不需要改變任何與類相關的外部組件。
Object Initializers——對象初始化器
本初始化器可以促進編譯器自動生成property setter代碼,由此可為用戶省略了幾行硬代碼的編寫。.NET Framework中的Types依賴於properties的使用。在初始化和使用一個新類時,開發人員通常要寫出如下代碼:
以下是引用片段:
Person person = new Person();
person.FirstName = "Scott";
person.LastName = "Guthrie";
person.Age = 32;
你是否曾經想過使這一代碼變得更加簡潔,也許只用一行就可以實現?使用C# 和VB “Orcas”編譯器,你可以充分利用名為“object Initializers”的“syntactic sugar”語言特征使以上代碼簡化如下:
以下是引用片段:
Person person = new Person ...{ FirstName="Scott", LastName="Guthrie", Age=32 };
編譯器將會自動產生合適的property setter代碼來保持與上述詳細代碼段同樣的語義。
對象初始化器不僅可在初時化類型時設置簡單的屬性值,而且允許我們隨意設置更復雜嵌套的屬性類型。比如,假設我們上述定義的每個Person類型均有一個“Address”類型的Address屬性。我們可以用如下代碼來創建Person對象並設置其屬性:
以下是引用片段:
Person person = new Person ...{
FirstName = "Scott",
LastName = "Guthrie"
Age = 32,
Address = new Address ...{
Street = "One Microsoft Way",
City = "Redmond",
State = "WA",
Zip = 98052
}
};
Collection Initializers——集合初始化器
這一新特性與上述特性基本相同,唯一不同之處在於它作用於集合。對象初始化器功能強大可以幫助開發人員更加容易且簡潔的添加對象到集合中。例如,如果我想添加三個people到一個“Person”類型的generics-based List集合中,我們可以用以下代碼實現:
以下是引用片段:
List people = new 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 } );
在這個例子中僅使用新的對象初時化器特性一條,和C# 2.0編譯器相比我們就省去12條額外代碼的編寫。
C# and VB “Orcas”編譯器不僅使我們在對象的聲明和初始化方面更加簡單,而且支持“collection initializers”可以使我們避免成倍的Add語句,同時節省更多的擊鍵次數:
以下是引用片段:
List people = new List ...{
new Person ...{ FirstName = "Scott", LastName = "Guthrie", Age = 32 },
new Person ...{ FirstName = "Bill", LastName = "Gates", Age = 50 },
new Person ...{ FirstName = "Susanne", LastName = "Guthrie", Age = 32 }
};
當編譯器遇到如上語法,它將自動產生集合插入代碼,就像如上所示擁有更詳盡Add語句的代碼段一般。
總之,作為開發人員,我們現在擁有更加簡潔的方式來定義對象,初始化他們,然後添加他們到集合。在運行時,它所表達的語義將和今天所書寫的詳細語法一樣正確,因此你不必擔心任何行為上的變化。同時,現在你不必書寫更多的代碼,你的代碼將變得更加簡潔明了。