LINQ體驗(2)——C# 3.0新語言特性和改進(上篇)

來源:互聯網
上載者:User

在第一篇中,知道了Visual Studio 2008新特性,從這篇開始進入此系列的第二部分——介紹C# 3.0新語言特性和改進。

總體來說,Visual Studio 2008和.NET 3.5是建立在.NET2.0核心的基礎之上,.NET2.0核心本身將不再變化(如果不瞭解.NET2.0的朋友,請參看MSDN或者一些經典的書籍),C# 3.0新語言特性在.NET2.0基礎上進行了改進,這些改進的功能可以大大簡化我們編寫程式。關於C# 3.0新語言特性在部落格園裡的很多朋友都介紹了,我在這裡簡單介紹一下,記錄自己所學的東西,也為後面的LINQ打下基礎。

C# 3.0新語言特性和改進包括:

  • 自動屬性(Auto-Implemented Properties)
  • 隱含類型局部變數(Local Variable Type Inference)
  • 匿名型別(Anonymous Types)
  • 對象與集合初始化器(Object and Collection Initializers)
  • 擴充方法(Extension Methods)
  • Lambda運算式和Lambda運算式樹狀架構 (Lambda Expression and Lambda Expression Trees)
自動屬性(Auto-Implemented Properties)

自動屬性可以避免原來這樣我們手工聲明一個私人成員變數以及編寫get/set邏輯,在VS2008中可以像下面這樣編寫一個類,編譯器會自動地產生私人變數和預設的get/set 操作。你也可以分別定義get和set的“protected”等存取層級。

在.Net2.0架構下,我們可以這樣寫一個User類:

public class User{    private int _id;    private string _name;    private int _age;    public int Id   {        get { return _id; }        set { _id = value; }   }    public string Name     {        get { return _name; }        set { _name = value; }    }    public int Age     {        get { return _age; }        set { _age = value; }     }}

現在,可以這樣簡化:

public class User{    public int Id { get; set; }    public string Name { get; set; }    public int Age { get; set; }}

像上面這樣的空的get/set屬性的話,它會自動為你在類中產生一個私人成員變數,對這個變數實現一個公開的getter 和setter。我們可以使用.NET開發環境所提供的ildasm.exe(IL代碼反組譯碼器)工具來剖析器集或者模組的內容。我就不貼圖了。

隱含類型局部變數(Local Variable Type Inference)

C#3.0引進了var這個新關鍵字,在聲明局部變數時可用於替代原先的類型名,即當一個變數宣告身份識別為var類型並且該範圍域中沒有var名稱類型存在,那麼這個聲明就稱為隱含類型局部變數。如下(等同於//後面的顯式聲明):

var i = 5;//intvar j = 23.56;//doublevar k = "C Sharp";//stringvar x;// ╳var y = null;//╳var z = { 1, 2, 3 };//╳

在調試狀態下,編譯器解釋如下

隱含類型局部變數要點

  1. var為關鍵字,可以根據後面的初始化語句自動推斷類型,這個類型為強型別。
  2. 初始化語句必須為運算式,不可以為空白。且編譯時間可以推斷類型。一旦初始化之後,只可以儲存這種類型。
  3. var聲明的僅限於局部變數,不可用於欄位。亦可以用於for,foreach,using 等語句中。
  4. 數組也可以作為隱含類型。
  5. 初始化語句不能是一個自身的對象或者集合初始化器,但是他可以是包含一個對象或者初始化器的一個new運算式。
  6. 如果局部變數聲明包含了多個聲明符,其類型必須相同。
匿名型別(Anonymous Types)

匿名型別允許定義行內類型,無須顯式定義類型。常和var配合使用來聲明匿名型別。

var p1 = new { Id = 1, Name = "YJingLee", Age = 22 };//屬性也不需要申明var p2 = new { Id = 2, Name = "XieQing", Age = 25 };p1 = p2;//p1,p2結構相同,可以互相賦值

在這裡編譯器會認為p1,p2相當於:

public class SomeType{     public int Id { get; set; }     public string Name { get; set; }     public int Age { get; set; }}

那麼數組怎麼定義呢?使用"new[]"關鍵字來聲明數組,加上數組的初始值列表。像這樣:

var intArray = new[] { 2, 3, 5, 6 };var strArray = new[] { "Hello", "World" };var anonymousTypeArray = new[] { new { Name = "YJingLee", Age = 22 }, new { Name = "XieQing", Age = 25 } };var a = intArray[0];var b = strArray[0];var c = anonymousTypeArray[1].Name;

匿名型別要點

  1. 可以使用new關鍵字調用匿名初始化器建立一個匿名型別的對象。
  2. 匿名型別直接繼承自System. Object。
  3. 匿名型別的成員是編譯器根據初始化器推斷而來的一些讀寫屬性。
對象與集合初始化器(Object and Collection Initializers)對象初始化器 (Object Initializers) :

.NET2.0架構中的類型非常依賴於屬性。當產生對象執行個體和使用新的類型時,在.Net2.0時候我們像這樣寫:

User user = new User();user.Id = 1;user.Name = "YJingLee";user.Age = 22;

在VS2008中,編譯器會自動地產生合適的屬性setter代碼,使得原來幾行的屬性賦值操作可以在一行完成。我們可以這樣簡化:像這樣,對象初始化器由一系列成員對象組成,其對象必須初始化,用逗號間隔,使用{}封閉。

User user = new User { Id = 1, Name = "YJingLee", Age = 22 };

又例如,我把二個人加到一個基於泛型的類型為User的List集合中:

List<User> user = new List<User>{        new User{Id=1,Name="YJingLee",Age=22},        new User{Id=2,Name="XieQing",Age=25},};

如果有相同名字和類型的兩個對象初始化器將會產生相同的執行個體,可以相互賦值。例如:

User user = new User { Id = 1, Name = "YJingLee", Age = 22 };User user2 = new User { Id = 2, Name = "XieQing", Age = 25 };user = user2; 

除了在初始化類時設定簡單的屬性值外,對象初始化器特性也允許我們設定更複雜的嵌套(nested)屬性類型。例如我們可以在上面定義的User類型同時擁有一個屬於Address類型的叫“Address”的屬性:

User user = new User{      Id = 1,     Name = "YJingLee",     Age = 22,     Address = new Address     {          City = "NanJing",          Zip = 21000     }};
集合初始化器(Collection Initializers):

集合初始化器由一系列集合對象組成,用逗號間隔,使用{}封閉。
集合初始化器可以簡化把幾個對象一起添加到一個集合,編譯器會自動為你做集合插入操作。例如我把七個數加到一個基於泛型的類型為int的List集合中

List<int> num = new List<int> { 0, 1, 2, 6, 7, 8, 9 };

對象與集合初始化器要點

  1. 對象初始化器實際上利用了編譯器對對象中對外可見的欄位和屬性進行按序賦值。
  2. 對象初始化器允許只給一部分屬性賦值,包括internal存取層級
  3. 對象初始化器可以結合建構函式一起使用,並且建構函式初始化先於對象初始化器執行。
  4. 集合初始化器會對初始化器中的元素進行按序調用ICollection<T>.Add(T)方法。
  5. 注意對象初始化器和集合初始化器中成員的可見度和調用順序。
  6. 對象與集合初始化器同樣是一種編譯時間技術。

先就到這裡了,下篇繼續介紹,敬請關注from:李永京

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.