C#3.0比C#2.0多出的新特性和優勢:
在C#3.0中,微軟給我帶來的一些新特性可能是以前所有開發語言都沒有的特性。這無疑大大的體現了C#3.0在開發語言中強大的優勢。
Lambda運算式
Lambda 運算式是一個匿名函數,它可以包含運算式和語句,並且可用於建立委託或運算式分類樹類型。所有 Lambda 運算式都使用 Lambda 運算子 =>。關於Lambda更詳細的講解大家可以參看 MSDN。裡面說的很清楚。
這裡簡單舉個例子來說明Lambda的好處。Lambda在對匿名委託的處理上提供了更清楚的實施方式。例如在2.0中。我們可以寫這樣的代碼:
public class Example
{
public static void Demo(System.Windows.Controls.TextBlock outputBlock)
{
Func<string, string> convert = delegate(string s)
{ return s.ToUpper(); };
string name = "Dakota";
outputBlock.Text += convert(name) + "\n";
}
}
在 C# 中將 Func<(Of <(T, TResult>)>) 委託與匿名方法一起使用。
在3.0中,我們可以使用Lambda來更清楚的進行參數的傳遞:
public class Example
{
public static void Demo(System.Windows.Controls.TextBlock outputBlock)
{
Func<string, string> convert = s => s.ToUpper();
string name = "Dakota";
outputBlock.Text += convert(name) + "\n";
}
}
Lambda 運算式的基礎類型是泛型 Func 委託之一。這樣能以參數形式傳遞 lambda 運算式,而不用顯式將其分配給委託。尤其是,因為 System.Linq 命名空間中許多類型方法具有 Func<(Of <(T, TResult>)>) 參數,因此可以給這些方法傳遞 lambda 運算式,而不用顯式執行個體化 Func<(Of <(T, TResult>)>) 委託。這樣可以使我們的代碼更加簡潔,邏輯上更易於理解。
對象的初始化
在C#中,對象的初始化也做了一些改進。一個新的功能就是提供了更方便的文法規則來聲明變數的值。
假如我們聲明一個Student對象:
public class Student
{
private string _stuName;
private string _stuAge;
private int _stuClass;
public Student() { }
public string StuName
{
get { return _stuName; }
set { _stuName = value; }
}
public string StuAge
{
get { return _stuAge; }
set { _stuAge = value; }
}
public int StuClass
{
get { return _stuClass; }
set { _stuClass = value; }
}
}
在C#2.0中,我們是這樣聲明變數並賦值的:
Student stu = new Student();
stu.StuName = "Brian";
stu.StuAge = "21";
stu.StuClass = "1班";
而在C#3.0中,我們可以這樣初始化對象:
Student stu2 = new Student
{
StuName = "Brian",
StuAge = "21",
StuClass = "1班"
};
從代碼中不難看出,C#3.0給我們提供了很方便得方式來進行對象的初始化工作。
查詢
這個想必大家都應該有所耳聞,那就是鼎鼎大名的Linq。這是C#3.0中最獨特好用的新特性之一。Linq改變了我們寫資料應用程式的方式,先前,開發人員需要考慮並編寫不用的代碼來處理不同資料來源中的資料(SQL Server ,XML ,Memory....)。LINQ很好的幫我們解決了這個煩人的問題。同時藉助Lambda,我們可以更方便準確的查詢我們想要的資料。
使用Linq簡單的資料查詢例子:
private void BindGridView(string criteria)
{
string strConn = ConfigurationManager.ConnectionStrings["connstr"].ConnectionString;
NorthwindDb db = new NorthwindDb(strConn);
IEnumerable<Employee> results;
if (criteria == string.Empty)
{
results=db.Employee.ToArray();
}
else
{
results = (from c in db.Employee
where c.FirstName.Contains(criteria)
select c).ToArray();
}
GridView1.DataSource = results;
GridView1.DataBind();
}
變數聲明
這裡要說的是var。var是C#3.0中提供的用於聲明變數的關鍵字,開發人員可以不考慮變數的類型就可以對變數進行聲明(這一點用法非常類似Javascript)。但是兩者還是有些差異。
相同點:用var來聲明任何類型的局部變數。
不同點:它僅僅負責告訴編譯器,該變數需要根據初始設定式來推斷變數的類型,而且只能是局部變數。
我們可以這樣聲明變數:
var i= 10;
var name = "edisundong";
var numbers = new int[] { 1, 2, 3 };
var僅僅是個關鍵字,它並不是C#3.0中的一種新的類型,而是負責告訴編譯器,該變數需要根據初始設定式來推斷變數的類型,上面的語句相當於
int i= 10;
string name = " edisundong ";
int[] numbers = new int[] { 1, 2, 3 };
這裡還需要注意幾點:
1.在聲明時必須同時賦值。
2.在使用var聲明一個局部變數後,他仍然具備強型別。
var integer = 10;
integer = " edisundong ";
編譯時間會報Cannot implicitly convert type string to int錯誤。
3. 初始化器運算式的編譯期類型不能夠是空(null)類型。
4. var的聲明僅限於局部變數
擴充方法
以前如果我們想擴充一個類的功能必須直接源自於它並且從學其中的方法,在C#3.0中,介紹了一種很快捷的擴充功能的方法。
public static class StudentExtensionMethods
{
public StudentExtensionMethods()
{
//
//TODO: 在此處添加建構函式邏輯
//
}
public static string GetStudentInformation(this Student stu)
{
return string.Format("Name: {0} {1} Age: {2}", stu.StuName,
stu.StuAge, stu.StuClass);
}
}
定義一個類,其中定義一個方法,注意:這個類和方法都是static的,並且方法的參數是類Student。這樣,Student類就可以擴充GetStudentInformation方法:
Student stu2 = new Student
{
StuName = "Brian",
StuAge = "12",
StuClass = "1班"
};
Console.WriteLine(stu2.GetPersonInformation());
小結:C#3.0,感覺帶來了不少驚喜,其中有很多新的特性是以前所未知的。C#3.0的新特性應該還不止這些,還需繼續學習研究。
http://developer.51cto.com/art/200901/107450.htm