C#中的語言特性都是從何而來?

作者: 崔鵬飛  來源: 博客園  發布時間: 2011-03-15 11:58  閱讀: 2183 次  推薦: 2   原文鏈接   [收藏]  

  前幾天推薦一個同事用“可選參數”,推薦完了我還畫蛇添足的說這是.Net 4中的新特性。但是事后才發現這個新特性是C# 4.0的語言特性,與.Net 4無關。其實也不只這一次,我平時也經常把語言、框架、運行時,有時甚至還有開發工具混為一談。于是今天就總結一下C#中我感興趣的幾個語言特性是從何而來的。

  1.可選參數

  可選參數是C# 4.0中的新特性,其作用在于在調用者不提供參數值時給參數一個默認值,用起來是這樣的:

 
static void Main(string[] args)
{
TestMethod();
TestMethod(
10);
Console.ReadLine();
}

public static void TestMethod(int parameter = 5)
{
Console.WriteLine(parameter);
}
以上的代碼在第一次調用TestMethod時輸出5,第二次輸出10,也就是在沒有給TestMethod提供參數值時,會自動以5作為參數值。

  該特性的實現依賴于OptionalAttribute和DefaultParameterValueAttribute這兩個attribute,也就是說TestMethod這個方法完全可以聲明為這樣:

 
public static void TestMethod([Optional, DefaultParameterValue(5)] int parameter)
{
Console.WriteLine(parameter);
}

  而跑起來的結果是一樣的。

  OptionalAttribute和DefaultParameterValueAttribute這兩個attribute分別是在.Net 1.1和.Net 2.0中引入的,也就是說N年前大家就可以寫擁有“可選參數”的方法了,只是用起來沒有現在這么爽。

  只要您安裝了.Net Framework 4.0(也就是說有了其中附帶的新版的C#編譯器),您就可以編寫如上的代碼而同時把target framework指定為.Net Framework 2.0到.Net Framework 4之間的任何版本。

  小總結:我在這個問題上犯的錯誤就在于將語言和框架混為一談了。C#語言的第四版和.Net Framework的第四版一起發布,于是我就理所當然的認為C# 4.0中的新特性和.Net Framework 4有關系了。其實,只要微軟的人愿意,他們完全可以在.Net Framework 2.0發布之后和.Net Framework 4.0發布之前的任意時間發布一款CTP的編譯器來實現這一語言性特性,正如他們前不久發布的Asyn CTP一樣。

  2.var關鍵字

  var關鍵字是在C# 3.0中引入的,其作用在于在聲明局部變量時無需指定具體類型,用起來是這樣的:

 
var str = "hello";
Console.WriteLine(str);var str
= "hello";
Console.WriteLine(str);

  其結果和把var替換為string完全一樣。

  這個語言特性看似雞肋,實際上它的好處在于接收LinQ語句的返回值,比如說Enumerable.GroupBy的某幾個重載的返回值是IEnumerable<IGrouping<TKey, TElement>>,如果每次用到group by的時候都需要寫這么長的一串代碼的話,那玩兒LinQ的快感想必是要降低不少呀。

  這個語言特性的實現要比可選參數簡單一些,無需框架的支持,完全是語言規范和編譯器的“合謀”。編譯器在編譯時根據賦值語句推斷出真實的類型,編譯出的IL中完全沒有var的身影。

  3.泛型

  泛型是C# 2.0中新增的特性,也是.Net 2.0中的新特性。沒有錯,這次終于可以說它是.Net的新特性了,但是也只是.Net而不是.Net Framework。

  在C#語言層面實現泛型需要CLR的支持,可以說它是.Net世界中的一等公民,IL甚至為它修改了語法。

  比如說如下的類型聲明:

public class TestClass<T>

  在編譯為IL之后是這樣的:

 
.class public auto ansi beforefieldinit TestClass<T>
extends [mscorlib]System.Object

  可見IL中新增了尖括號的用法。

  以上三個語言特性都比較典型。var關鍵字純粹是語言層面的小甜頭,只要有了能夠理解var的編譯器,使用哪個版本的CLR或者.Net Framework完全無所謂。

  可選參數需要編譯器能理解參數名后面的賦值語句,同時也需要.Net Framework中提供的attribute的支持。

  泛型同時需要CLR和編譯器的支持。

  如果列一張表的話,就是下面這樣的:

語言特性 實現該特性需要的支持
var關鍵字 CLR() 框架() 編譯器(
可選參數 CLR() 框架() 編譯器(
泛型 CLR() 框架() 編譯器(

  上表中每一項的編譯器都打上了鉤兒。很顯然,每一項語法層面的特性都需要編譯器的支持,要不然語言規范就只是一紙空文了。在這里還是把它列出來,僅求全面。

  寫完之后自己看一遍,覺得很是有考據癖的老學究味道。微軟總是把開發工具、框架類庫、運行時和編譯器的新版本一起發布,所以我們總是被弄得很被動,總是搞不清這幾者之間區別。其實有時候把這些東西區分開來去觀察,更有利于解釋一些困惑。

  當然,最后的表格中列出的東西還是太少了,希望各位補充啊。

2
0
 
標簽:C# 語言特性
 
 

文章列表

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()