2012年5月28日 星期一

LINQ 學習筆記 (pre.2) 隱含型別宣告跟匿名型別 - var, Anonymous Type

繼上一章節,接下來討論,隱含型別宣告 var 。

這個東西在 .NET 發展以來,是一個很...不對盤的東西。該怎麼說,因為發展到 framework 2.0 以來,在型別一直就是採強型別的政策,怎麼會突然跑出這個東西出來,因為 var 的出現不就等於改走向型別不明確的那方面去....嗎?這時候一定要多個嗎...因為基於幾個方法幾乎就可證實。



在宣告上程式碼如下:
void ProcessMain()
    {
        //傳統的命名參數方法。
        string x = "123456";
        Response.Write(x.GetType());
        //隱含型別命命方法,在命名同時就得給值。
        var y = 123456;
        Response.Write(y.GetType());

    } 


而光看智慧型標籤提示就知道什麼原因了。

雖然是用隱含數宣告,不過程式早就幫忙確認好, y 這個變數是 int 這個型別。也就是說 var 是由編譯器來幫你推斷實際型別。可是既然在撰寫的同時都知道型別,為啥還需要這個宣告方法?難道只是讓程式設計師貪圖方便投機取巧?感覺除了讓在原本宣告上求簡潔外,其中也為了一個理由,叫做匿名型別。

這時候可以先額外整理出一些重點,首先是 var 應用時機點大部都都在:
  • 隱含型別區域變數的宣告
  • 隱含型別陣列的宣告
  • 匿名型別物件的宣告

‧隱含型別的區域變數的宣告
     void ProcessMain()
    {
        //原本的命名方式
        int x_Origno = 123456;
        //隱含型別區域變數宣告
        var x = 123456;

    }


‧隱含型別陣列的宣告
    void ProcessMain()
    {
        //原本的陣列宣告方式
        int[] intList_Origno = new int[4];
        intList_Origno[0] = 1;
        intList_Origno[1] = 2;
        intList_Origno[2] = 3;
        intList_Origno[3] = 4;
        //隱含型別陣列的宣告
        var intList = new[] { 1, 2, 3, 4 };
    }


‧匿名型別物件的宣告
    void ProcessMain()
    {
        //原本的無匿名型別物件的宣告

        //匿名型別物件的宣告
        var wallet = new { NT100 = 1, NT500 = 1, NT1000 = 1, owner = "michael" };
    }


而單看匿名型別的提示標籤,又可以清楚看到宣告 wallet 為匿名型別。
接著我們再繼續討論 C# 3.0 新推出的型別,匿名型別。
雖然隱匿型別的用意,表示型別不明,但不代表真的沒有型別的!只是暫時不用給定型別,在編譯的時候,.Net  會自動替匿名型別找到適合的型別名稱。

這時候又可以從網路上整理出幾個重點:
  1. 型別確定:型別雖然在命名時不用給定,而且用意原本也不明,但是在編譯完畢後就確定型別了。
  2. 屬性唯獨:匿名型別物件內的屬性是唯獨的,也就是給定之後是不可以再進行修改,否則在編譯時候會產生錯誤。
  3. 類別型別:匿名型別是屬於 Class 的型別,並且裡面是由內部不同屬性的型別所組成的。
  4. 類別限制:雖然屬於 Class 的型別,但唯一可以宣告的是屬性 ,而非方法或是事件。
  5. 搭配 var, new 關鍵字:匿名型別最常搭配 var 進行宣告,而後接 new 讓型別實體化。
  6. 可利用 LINQ:常利用 foreach 及 LINQ Epression 來進行各屬性的查詢並利用。
  7. 型別歸類:如果有多個匿名型別,其屬性的順序、數量都相同,編譯時便會自動視為同一種型別。
使用方法:
    void ProcessMain()
    {
        //匿名型別物件的宣告
        var wallet = new { NT100 = 6, NT500 = 2, NT1000 = 1, owner = "michael" };
        //匿名型別的使用
        Response.Write(string.Format("{0}皮夾內百元鈔有{1}張,五百元鈔有{2}張,千元鈔有{3}張。", wallet.owner, wallet.NT100, wallet.NT500, wallet.NT1000));
    }




[.NET]快快樂樂學LINQ系列前哨戰-var與匿名型別
var (C# 參考)


沒有留言:

張貼留言