Visual C# 隨.NET的開發工具Visual Studio一起推出,有如下幾個版本:
1.0——隨Visual Studio .NET(2002)于2002年2月13日發布。
1.5——隨Visual Studio .NET 2003于2003年5月20日發布。
2.0——隨Visual Studio 2005于2005年11月7日發布。
3.0——隨Visual Studio 2008于2007年11月16日發布。
4.0——將隨Visual Studio 2010于2010年3月發布。
3.0版的規范見Visual Studio 2008安裝目錄中的Word文檔:“C:/Program Files/Microsoft Visual Studio 9.0/VC#/Specifications/2052/CSharp Language Specification.doc”。
下面羅列Visual C# 的各個主要版本的新增的特點和功能。
1)C# 1.0——與C和C++比較,C# 在許多方面有所限制和增強,包括:
指針——C# 是真正支持指針,但是其指針只能在非安全作用域中使用,而只有具有適當權限的程序,才可以執行標記為非安全的代碼。絕大多數對象的訪問是通過安全的引用(references)來進行的,而引用是不會造成無效的,而且大多數算法都是要進行溢出檢查的。一個非安全指針,不僅可以指向值類型,還可以指向子類和System.Object。也可以使用指針(System.IntPtr)來編寫安全代碼。
托管(managed受控)——在C# 中,托管內存不能顯式釋放,取而代之的是(當再沒有內存的引用存在時的)垃圾收集。但是,引用非托管資源的對象,例如HBRUSH,是可以通過標準的IDisposable接口的指示來釋放指定內存的。
多重繼承——在C# 中多重繼承被禁止(盡管一個類可以實現任意數目的接口,這點似Java),這樣做的目的是為了避免復雜性和“依存地獄”,也是為了簡化對CLI的結構需求。
轉換——C# 比C++更類型安全,唯一的默認隱式轉換也是安全轉換,例如加寬整數和從一個派生類型轉換到一個基類(這是在JIT編譯期間間接強制進行的)。在布爾和整數之間、枚舉和整數之間都不存在隱式轉換,而且任何用戶定義的隱式轉換,都必須顯式地標出。
數組聲明——和C/C++的數組聲明的語法不同,C# 中用“int[] a = new int[5];”代替了C/C++的“int a[5];”。
枚舉——C# 中的枚舉被放入它們自己的命名空間。
特性——可在C# 中可以使用特性(properties,屬性集),訪問類似于C++中成員域,與VB相似。
類型反射與發現——在C# 中可以使用完整的類型反射與發現,這些都會用到元數據所提供的信息。
模板——為了簡單性,C# 1.0中不支持模板等泛型編程技術。
2)C# 1.5版的新增功能——/** */ 文檔注釋符、#line hidden預處理指令、/nowarn和/nostdlib編譯指令、Web窗體、XML Web服務、ADO.NET、可用Windows窗體和框架創建分布式應用程序的表示層、可創建各種Windows和ASP.NET Web應用程序和控件的項目模板、可使用非可視組件和相關功能,將消息隊列、事件日志和性能計時器等資源合并到應用程序中、通過組件設計器和框架類為創建組件提供RAD支持。
3)C# 2.0的新特征:
部分類——一個類可分開到多個文件中實現。
泛型——C# 從2.0起,開始支持泛型或參數類型。C# 還支持一些C++模板不支持的特性,例如對泛型參數的類型約束。另一方面,C# 的表達式不能用作泛型參數,而這在C++中卻是允許的。C# 的參數化的類型為虛擬機的首個類對象,允許優化和保存類型信息,這一點與Java不同。
關鍵字yield——迭代器的一種新形式,可通過功能類型的關鍵字yield,來使用協同例程。
匿名委托——提供了閉包功能。
結合運算符??——返回表中的第一個非空值,例如:
object nullObj = null;
object obj = new Object();
return nullObj ?? obj // returns obj;
可空值類型——可空值類型由問號?來標記(例如,int? i = null;),它可以改善與SQL數據庫的交互。
4)C# 3.0的新特征:
LINQ(Language Integrated Query,語言集成查詢)——"from, where, select"上下文敏感的關鍵字,允許在SQL、XML、集合等之間進行查詢。
對象初始化——如Customer c = new Customer(); c.Name = "James"; 可被寫成Customer c = new Customer { Name="James" };。
集合初始化——如MyList list = new MyList(); list.Add(1); list.Add(2); 可被寫成MyList list = new MyList { 1, 2 };。
匿名類型——如var x = new { Name = "James" };。
局部變量類型推論——如var x = "hello";等價于string x = "hello"; 該特性在匿名類型變量的聲明中需要。
隱含類型的數組——數組的類型現在可以省略,所以int[] arr = new int[] { 1, 2, 3 }; 現在可以寫成var arr = new[] { 1, 2, 3 };。
λ表達式——如listOfFoo.Where(delegate(Foo x) { return x.Size > 10; }) 可被寫成 listOfFoo.Where(x => x.Size > 10);。
編譯器推斷——翻譯λ表達式到強類型函數或強類型表達式樹。
自動屬性——編譯器會自動生成一個私有實例變量,而且給出適當的獲取器和設置器代碼,例如public string Name { get; private set; };。
擴展方法——通過在另一個靜態類的一個方法的首個參數中包含this關鍵字,來將方法添加到類中。如
public static class IntExtensions {
public static void PrintPlusOne(this int x) {
Console.WriteLine(x + 1);
}
}
int foo = 0;
foo.PrintPlusOne();
部分方法——允許代碼Generator生成方法的聲明作為擴展點,如果有人在另一個部分類中實際實現它,則其只被包含在源代碼編譯中。
5)4.0版準備增加的新特性主要有:
動態支持——通過引進新類型dynamic來提供對動態類型延遲綁定的支持。
Office可編程性——通過添加命名和可選的參數、dynamic類型、索引屬性和可選的ref修飾符,大大增強了訪問(包括Office自動化API在內的)COM接口的能力。
類型等價支持——可配置應用程序的內置類型信息,以代替從PIA(Primary Interop Assembly,主互操作程序集)導入的類型信息。
協變與逆變——協變(covariance)是你能夠使用更多的派生類型而不是由泛型參數指定,而協變(contravariance)則讓你使用更少的派生類型。
新聞熱點
疑難解答
圖片精選