程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#中的語言特性都是從何而來?

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

編輯:C#入門知識

前幾天推薦一個同事用“可選參數”,推薦完了我還畫蛇添足的說這是.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() 框架() 編譯器()

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

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

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

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved