搜索
熱搜: 活動 交友 discuz
查看: 11793|回復: 1
打印 上一主題 下一主題

C# 3.0語法筆記(供參考)

[複製鏈接]
跳轉到指定樓層
1#
發表於 2009-6-12 00:19:55 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
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. 隱含型別可以指定陣列,但陣列的值必須為相同型態
宣告方式如下

view plaincopy to clipboardprint?

  • 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 屬性

view plaincopy to clipboardprint?

  • 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 語法之下,可以簡寫成

view plaincopy to clipboardprint?

  • 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 來承接
而當匿名型態內參數型態完成相同時,也可以做運算處理

view plaincopy to clipboardprint?

  • 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 物件初始化新功能,則可以直接對該物件變數下達初始化動作
初始化時必須指定變數名稱及值,可不必指定所有變數
亦表示未指定的變數將以型態預設值存在

view plaincopy to clipboardprint?

  • 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)不只類別物件可以初始化,集合亦可初始化集合內個數及值
當集合和物件初始化併用時,將可以語法更有彈性及代碼更加的簡潔

view plaincopy to clipboardprint?

  • 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 的方法
先宣告轉型方法

view plaincopy to clipboardprint?

  • 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 的方法了
範例中並沒有加入例外處理,實際撰寫時還是得加上例外處理

view plaincopy to clipboardprint?

  • 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 表達式更是讓代碼更加洗煉不少

view plaincopy to clipboardprint?

  • delegate
    int DoDelegate(int i);      

  • delegate
    int DoDelegate1();  

<br />delegate int DoDelegate(int i);     <br />delegate int DoDelegate1();<br />
原本委任方式

view plaincopy to clipboardprint?

  • 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 表達式

view plaincopy to clipboardprint?

  • DoDelegate myDelegate = x => x * x;      
  • DoDelegate1 myDelegate1 = () => 100;   

<br />DoDelegate myDelegate = x => x * x;     <br />DoDelegate1 myDelegate1 = () => 100; <br />
Lambda 表達式參數類別可以為隱含型別或一般型別
當遇到隱含型別時,Lambda 將依運算式來自動判斷型參數型別
而 Lambda 參數個數可以為一或多參數,甚至是沒有參數
當一個參數時,其括號可以省略


view plaincopy to clipboardprint?

  • // 一個參數,括號可以省略     
  • 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> 類別中,依規則取出指定的資料

view plaincopy to clipboardprint?

  • // 取出 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 更是重頭戲及注目的焦點
也是值得好好一學的


作者: 搖擺天秤

2#
發表於 2009-12-23 02:46:55 | 只看該作者
最近才在研究c#的東西,不過太難了,自己摸索有點困難,不過大大竟然可以整理他新增的資料,真是不簡單啊
回復 支持 反對

使用道具 舉報

您需要登錄後才可以回帖 登錄 | 註冊

本版積分規則

本論壇為非營利之網路平台,所有文章內容均為網友自行發表,不代表論壇立場!若涉及侵權、違法等情事,請告知版主處理。


Page Rank Check

廣告刊登  |   交換連結  |   贊助我們  |   服務條款  |   免責聲明  |   客服中心  |   中央分站

手機版|中央論壇

GMT+8, 2024-5-19 01:51 , Processed in 0.016871 second(s), 16 queries .

Powered by Discuz!

© 2005-2015 Copyrights. Set by YIDAS

快速回復 返回頂部 返回列表