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

來源:互聯網
上載者:User

http://blog.csdn.net/cuipengfei1/archive/2011/03/06/6227119.aspx

前幾天推薦一個同事用“選擇性參數”,推薦完了我還畫蛇添足的說這是.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替換為string完全一樣。

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

這個語言特性的實現要比選擇性參數簡單一些,無需架構的支援,完全是語言規範和編譯器的“合謀”。編譯器在編譯時間根據指派陳述式推斷出真實的類型,編譯出的IL中完全沒有var的身影。

3.泛型

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

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

比如說如下的型別宣告:

public class TestClass

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

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

可見IL中新增了角括弧的用法。

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

選擇性參數需要編譯器能理解參數名後面的指派陳述式,同時也需要.Net Framework中提供的attribute的支援。

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

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

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

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

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

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.