C# 3.0新語言特性和改進(上篇)
[2] C# 3.0新語言特性2
總體來說,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;//int var j = 23.56;//double var k = "C Sharp";//string var x;//錯誤 var y = null;//錯誤 var z = { 1, 2, 3 };//錯誤
在調試狀態下,編譯器解釋如下
隱含類型局部變量要點
- var為關鍵字,可以根據后面的初始化語句自動推斷類型,這個類型為強類型。
- 初始化語句必須為表達式,不可以為空。且編譯時可以推斷類型。一旦初始化之后,只可以存儲這種類型。
- var聲明的僅限于局部變量,不可用于字段。亦可以用于for,foreach,using 等語句中。
- 數組也可以作為隱含類型。
- 初始化語句不能是一個自身的對象或者集合初始化器,但是他可以是包含一個對象或者初始化器的一個new表達式。
- 如果局部變量聲明包含了多個聲明符,其類型必須相同。
匿名類型(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;
匿名類型要點
- 可以使用new關鍵字調用匿名初始化器創建一個匿名類型的對象。
- 匿名類型直接繼承自System. Object。
- 匿名類型的成員是編譯器根據初始化器推斷而來的一些讀寫屬性。