Microsoft 發佈了 Visual Studio 2008 Express 後
其 C# 3.0 也正式與大家見面了
C# 3.0 對程式語法及特性進行了一些改進
這些改進對 C# 語言提供了更簡捷的用法,主要改進如下
- 隱含型別宣告 (Local Variable Type Inference)
- 自動執行屬性 (Auto-Implemented Properties)
- 匿名型態 (Anonymous Types)
- 物件初始化 (Object Initializers)
- 集合初始化 (Collection Initializers)
- 擴展方法 (Extension Methods)
- Lambda 表達式 (Lambda Expression)
- Lambda 表達式樹 (Lambda Expression Trees)
##CONTINUE##
A. 隱含型別宣告 (Local Variable Type Inference)宣告變數時不必指定型態,而是由代入的變數值來決定型態
這種隱含型別宣告的方式 JavaScript 或 VB 程式設什師應該不陌生
但是隱含型別宣告也有以下限制
1. var 為關鍵字,依照後方給的參數來決定型態
2. 初始時就必須給值,不可空白或給 NULL
3. 型態一經初始決定後,只能儲存同型態的值
4. 隱含型別可以指定陣列,但陣列的值必須為相同型態
宣告方式如下
訪客無法瀏覽此圖片或連結,請先 註冊 或 登入會員 。訪客無法瀏覽此圖片或連結,請先 註冊 或 登入會員 。訪客無法瀏覽此圖片或連結,請先 註冊 或 登入會員 。訪客無法瀏覽此圖片或連結,請先 註冊 或 登入會員 。
- var b = 1.5; // double
- var c = 'a'; // char
- var d = "abc"; // string
- var e = new[] { 1, 2, 3, 4 }; // int array
- var f = new[] { 1.5, 2.5 }; // double array
- var g = new[] { 'a', 'b' }; // char array
- var h = new[] { "abc", "def" }; // string array
<br />var b = 1.5; // double <br />var c = 'a'; // char <br />var d = "abc"; // string <br />var e = new[] { 1, 2, 3, 4 }; // int array <br />var f = new[] { 1.5, 2.5 }; // double array <br />var g = new[] { 'a', 'b' }; // char array <br />var h = new[] { "abc", "def" }; // string array <br />
B. 自動執行屬性 (Auto-Implemented Properties)自動執行屬性可以幫助產生 get/set 屬性,而不用手動建立
例如在原本 Visual C# 2.0 時,我們建立一個類別
必須分別為類別建立 get/set 屬性
訪客無法瀏覽此圖片或連結,請先 註冊 或 登入會員 。訪客無法瀏覽此圖片或連結,請先 註冊 或 登入會員 。訪客無法瀏覽此圖片或連結,請先 註冊 或 登入會員 。訪客無法瀏覽此圖片或連結,請先 註冊 或 登入會員 。
- public
class UserInfo - {
private
int _Id;
private
string _Name;
private AddressInfo _Address;
public
int Id - {
get { return _Id; }
set { _Id = value; } - }
public
string Name - {
get { return _Name; }
set { _Name = value; } - }
public AddressInfo Address - {
get { return _Address; }
set { _Address = value; } - }
- };
public
class AddressInfo - {
private
string _Address;
private
string _ZipCode;
public
string Address - {
get { return _Address; }
set { _Address = value; } - }
public
string ZipCode - {
get { return _ZipCode; }
set { _ZipCode = value; } - }
- };
<br />public class UserInfo <br />{ <br /> private int _Id; <br /> private string _Name; <br /> private AddressInfo _Address; <br /> public int Id <br /> { <br /> get { return _Id; } <br /> set { _Id = value; } <br /> }<br /> public string Name <br /> { <br /> get { return _Name; } <br /> set { _Name = value; } <br /> } <br /> public AddressInfo Address <br /> { <br /> get { return _Address; } <br /> set { _Address = value; } <br /> } <br />}; <br />public class AddressInfo <br />{ <br /> private string _Address; <br /> private string _ZipCode; <br /> public string Address <br /> { <br /> get { return _Address; } <br /> set { _Address = value; } <br /> } <br /> public string ZipCode <br /> { <br /> get { return _ZipCode; } <br /> set { _ZipCode = value; } <br /> } <br />}; <br />
而 Visual C# 3.0 語法之下,可以簡寫成
訪客無法瀏覽此圖片或連結,請先 註冊 或 登入會員 。訪客無法瀏覽此圖片或連結,請先 註冊 或 登入會員 。訪客無法瀏覽此圖片或連結,請先 註冊 或 登入會員 。訪客無法瀏覽此圖片或連結,請先 註冊 或 登入會員 。
- public
class UserInfo - {
public
int Id { get; set; }
public
string Name { get; set; }
public AddressInfo Address { get; set; } - };
public
class AddressInfo - {
public
string Address { get; set; }
public
string ZipCode { get; set; } - };
<br />public class UserInfo <br />{ <br /> public int Id { get; set; } <br /> public string Name { get; set; } <br /> public AddressInfo Address { get; set; } <br />}; <br />public class AddressInfo <br />{ <br /> public string Address { get; set; } <br /> public string ZipCode { get; set; } <br />};<br />
C. 匿名型態 (Anonymous Types)匿名型態可以讓我們靈活的建立使用類別,而不需要事先建立類別代碼
產生匿名類別必須用 var 來承接
而當匿名型態內參數型態完成相同時,也可以做運算處理
訪客無法瀏覽此圖片或連結,請先 註冊 或 登入會員 。訪客無法瀏覽此圖片或連結,請先 註冊 或 登入會員 。訪客無法瀏覽此圖片或連結,請先 註冊 或 登入會員 。訪客無法瀏覽此圖片或連結,請先 註冊 或 登入會員 。
- var anonymous1 = new { A = 1, B = "ABCD" };
- var anonymous2 = new { A = 5, B = "EFGH" };
// 當匿名型態內參數型態完成相同時,可以做運算處理
- anonymous2 = anonymous1;
<br />var anonymous1 = new { A = 1, B = "ABCD" }; <br />var anonymous2 = new { A = 5, B = "EFGH" }; <br />// 當匿名型態內參數型態完成相同時,可以做運算處理 <br />anonymous2 = anonymous1;<br />
D. 物件初始化 (Object Initializers)以往建立物件時如要一併初始化物件內變數,必須對該類別定義初始化函式
而 Visual C# 3.0 物件初始化新功能,則可以直接對該物件變數下達初始化動作
初始化時必須指定變數名稱及值,可不必指定所有變數
亦表示未指定的變數將以型態預設值存在
訪客無法瀏覽此圖片或連結,請先 註冊 或 登入會員 。訪客無法瀏覽此圖片或連結,請先 註冊 或 登入會員 。訪客無法瀏覽此圖片或連結,請先 註冊 或 登入會員 。訪客無法瀏覽此圖片或連結,請先 註冊 或 登入會員 。
- UserInfo user1 = new UserInfo { Id = 1, Name = "Richie" };
- UserInfo user2 = new UserInfo { Name = "Eric" };
// 類別可以給初始值之外,可以初始類別內包含另一個類別
- UserInfo user3 = new UserInfo
- {
- Id = 3,
- Name = "Cola",
- Address = new AddressInfo
- {
- Address = "Taiwan",
- ZipCode = "100"
- }
- };
<br />UserInfo user1 = new UserInfo { Id = 1, Name = "Richie" }; <br />UserInfo user2 = new UserInfo { Name = "Eric" }; <br />// 類別可以給初始值之外,可以初始類別內包含另一個類別 <br />UserInfo user3 = new UserInfo <br />{ <br /> Id = 3, <br /> Name = "Cola", <br /> Address = new AddressInfo <br /> { <br /> Address = "Taiwan", <br /> ZipCode = "100" <br /> } <br />}; <br /> E. 集合初始化 (Collection Initializers)不只類別物件可以初始化,集合亦可初始化集合內個數及值
當集合和物件初始化併用時,將可以語法更有彈性及代碼更加的簡潔
訪客無法瀏覽此圖片或連結,請先 註冊 或 登入會員 。訪客無法瀏覽此圖片或連結,請先 註冊 或 登入會員 。訪客無法瀏覽此圖片或連結,請先 註冊 或 登入會員 。訪客無法瀏覽此圖片或連結,請先 註冊 或 登入會員 。
- List<int> intArray = new List<int> { 0, 1, 2, 3, 4, 5 };
// 初始類別集合時,亦可一併初始類別的值
- List<UserInfo> userArray = new List<UserInfo>
- {
new UserInfo { Id = 0, Name = "Richie" },
new UserInfo { Id = 1, Name = "Cola" } - };
<br />List<int> intArray = new List<int> { 0, 1, 2, 3, 4, 5 }; <br />// 初始類別集合時,亦可一併初始類別的值 <br />List<UserInfo> userArray = new List<UserInfo> <br />{ <br /> new UserInfo { Id = 0, Name = "Richie" }, <br /> new UserInfo { Id = 1, Name = "Cola" } <br />}; <br />
F. 擴展方法 (Extension Methods)以往我們使用型態時,往往因為該型態沒有我們想要的方法可以呼叫
必須另設函式或是繼承來處理達到想要的目的
現在擴展方法可以讓我們在型態或類別中添加新方法,不用重新繼承或重新編譯原本類型
擴展方法只能在靜態類型 (static) 中使用
並且以關鍵字 "this" 放在方法的第一個參數前來標識
擴展方法後,在整個 namespace 中都可以使用
例如 string 並沒有轉成 int 的方法,以往我們必須以 Convert 類別來處理型態的轉換
現在可以用擴展方法來為 string 添加轉型成 int 的方法
先宣告轉型方法
訪客無法瀏覽此圖片或連結,請先 註冊 或 登入會員 。訪客無法瀏覽此圖片或連結,請先 註冊 或 登入會員 。訪客無法瀏覽此圖片或連結,請先 註冊 或 登入會員 。訪客無法瀏覽此圖片或連結,請先 註冊 或 登入會員 。
- public
static
int ToInt32(this
string s) - {
return Convert.ToInt32(s); - }
<br />public static int ToInt32(this string s) <br />{ <br /> return Convert.ToInt32(s); <br />} <br /> 使用如下,string 型態已多了轉型成 int 的方法了
範例中並沒有加入例外處理,實際撰寫時還是得加上例外處理
訪客無法瀏覽此圖片或連結,請先 註冊 或 登入會員 。訪客無法瀏覽此圖片或連結,請先 註冊 或 登入會員 。訪客無法瀏覽此圖片或連結,請先 註冊 或 登入會員 。訪客無法瀏覽此圖片或連結,請先 註冊 或 登入會員 。
- string extension = "100";
int v = extension.ToInt32();
<br />string extension = "100"; <br />int v = extension.ToInt32();<br />
G. Lambda 表達式 (Lambda Expression)委任 (delegate) 的好處不少,充份運用時可以讓程式碼更簡潔易讀
雖然 Visual C# 2.0 已經為委任使用提供了比較簡短的呼叫方式
但在 Visual C# 3.0 Lambda 表達式更是讓代碼更加洗煉不少
訪客無法瀏覽此圖片或連結,請先 註冊 或 登入會員 。訪客無法瀏覽此圖片或連結,請先 註冊 或 登入會員 。訪客無法瀏覽此圖片或連結,請先 註冊 或 登入會員 。訪客無法瀏覽此圖片或連結,請先 註冊 或 登入會員 。
- delegate
int DoDelegate(int i);
delegate
int DoDelegate1();
<br />delegate int DoDelegate(int i); <br />delegate int DoDelegate1();<br />
原本委任方式
訪客無法瀏覽此圖片或連結,請先 註冊 或 登入會員 。訪客無法瀏覽此圖片或連結,請先 註冊 或 登入會員 。訪客無法瀏覽此圖片或連結,請先 註冊 或 登入會員 。訪客無法瀏覽此圖片或連結,請先 註冊 或 登入會員 。
- DoDelegate myDelegateOld = delegate(int x) { return x * x; };
- DoDelegate1 myDelegateOld1 = delegate() { return 100; };
<br />DoDelegate myDelegateOld = delegate(int x) { return x * x; }; <br />DoDelegate1 myDelegateOld1 = delegate() { return 100; };<br />
Lambda 表達式
訪客無法瀏覽此圖片或連結,請先 註冊 或 登入會員 。訪客無法瀏覽此圖片或連結,請先 註冊 或 登入會員 。訪客無法瀏覽此圖片或連結,請先 註冊 或 登入會員 。訪客無法瀏覽此圖片或連結,請先 註冊 或 登入會員 。
- DoDelegate myDelegate = x => x * x;
- DoDelegate1 myDelegate1 = () => 100;
<br />DoDelegate myDelegate = x => x * x; <br />DoDelegate1 myDelegate1 = () => 100; <br />
Lambda 表達式參數類別可以為隱含型別或一般型別
當遇到隱含型別時,Lambda 將依運算式來自動判斷型參數型別
而 Lambda 參數個數可以為一或多參數,甚至是沒有參數
當一個參數時,其括號可以省略
訪客無法瀏覽此圖片或連結,請先 註冊 或 登入會員 。訪客無法瀏覽此圖片或連結,請先 註冊 或 登入會員 。訪客無法瀏覽此圖片或連結,請先 註冊 或 登入會員 。訪客無法瀏覽此圖片或連結,請先 註冊 或 登入會員 。
- // 一個參數,括號可以省略
- x => x + 1;
// 多個參數
- (x, y) -> x + y;
// 沒有參數
- () => 100 + 200;
<br />// 一個參數,括號可以省略 <br />x => x + 1; <br />// 多個參數 <br />(x, y) -> x + y; <br />// 沒有參數 <br />() => 100 + 200;<br />
H. Lambda 表達式樹 (Lambda Expression Trees)Lambda 表達式樹允許我們在處理數據時也用 Lambda 表達式
例如在 List<t> 類別中,依規則取出指定的資料
訪客無法瀏覽此圖片或連結,請先 註冊 或 登入會員 。訪客無法瀏覽此圖片或連結,請先 註冊 或 登入會員 。訪客無法瀏覽此圖片或連結,請先 註冊 或 登入會員 。訪客無法瀏覽此圖片或連結,請先 註冊 或 登入會員 。
- // 取出 i > 20 且 i < 50 的資料,並存入 lambda 這個隱含型別中
- List<int> list = new List<int> { 10, 20, 30, 40, 50, 60};
- var lambdaTree = list.Where(i => i > 20 && i < 50);
<br />// 取出 i > 20 且 i < 50 的資料,並存入 lambda 這個隱含型別中 <br />List<int> list = new List<int> { 10, 20, 30, 40, 50, 60}; <br />var lambdaTree = list.Where(i => i > 20 && i < 50);<br />
在軟體巨人 Microsoft 這個母親的努力下
很興奮的是 Visual C# 3.0 的新功能確實讓 C# 開發人員能以更輕鬆的方式開發
並且程式保有 C# 一貫的嚴謹及簡潔的代碼
而剛推出的 Visual Studio 2008 及 .NET Framework 3.5 當然不只是 C# 語法的加強
對程式人員來說,LINQ 更是重頭戲及注目的焦點
也是值得好好一學的
訪客無法瀏覽此圖片或連結,請先 註冊 或 登入會員 。