最近裝上了VS2013,發現好多新特性、新功能,公司辦公還在使用VS2005、VS2008,不過用着也很順手,在最新版Visual Studio中,微軟加入了git源碼管理工具,和之前的TFS大體上類似。.net發展的現在已經有十多年的歷史了,為了更好的理清.net的發展歷史,特總結如下。
一、.net 發展歷史
.net版本發展歷程:
版本 | 版本號 | 發布日期 | Visual Studio | windows集成 |
---|---|---|---|---|
1.0 | 1.0.3705.0 | 2002-02-13 | Visual Studio .NET | |
1.1 | 1.1.4322.573 | 2003-04-24 | Visual Studio .NET 2003 | Windows Server 2003 |
2.0 | 2.0.50727.42 | 2005-11-07 | Visual Studio 2005 | |
3.0 | 3.0.4506.30 | 2006-11-06 | Windows Vista, Windows Server 2008 | |
3.5 | 3.5.21022.8 | 2007-11-19 | Visual Studio 2008 | Windows 7, Windows Server 2008 R2 |
4.0 | 4.0.30319.1 | 2010-04-12 | Visual Studio 2010 |
.NET Framework 各個版本之間的關系圖:
看上圖可以知道,.net framework 2.0占據了.net知識圖譜的大片江山,基礎地位是不容撼動的,這也就是為什么到現在為止,還有很多企業做的項目仍然是基於.net 2.0的。 .net 2.0包含的東西比較豐富,所有的基礎類庫都運行在CLR(公共語言運行時)環境,開發者不僅可以創建web項目,也可以創建WinForm項目,數據交互則使用ADO.NET,簡單有效。
.net3.0在2.0的基礎上增加了一堆F:使Client更加絢麗的WPF,面向服務編程的WCF,還有工作流WF等,當然,還有一些“甜點”——語法糖,具體下面分析。
.net3.5最主要增加了Entity Framework這種通過ORM形式的和數據庫交互的方式,也引入了LINQ這種更加高效的操作數據的方法。
.net4.0則增加了對並行計算的支持。
C#2.0新特性
一、泛型(Generic)
概述:
引入泛型絕對是C#2.0的最大的新特性。通過“參數化類型”實現一份代碼操作多種數據類型。泛型的優點是更好的類型安全;更好的復用;更高的效率和更清晰的約束。
語法點:
語法方面主要是使用在類型名稱后面加入“<T>”來傳入類型參數。涉及泛型類型繼承的一條規則是“封閉類(所有類型都已確定)不能繼承開放類(含有未確定類型)”。同時可以使用where來添加對作為參數的類型的約束。具體有四種:基類約束、接口約束、構造器約束和值/引用類型約束。最后特別提醒,delegate也是一種類型,別忘了泛型委托。
二、匿名方法(Anonymous Method)
概述:可以直接將代碼賦給委托。在進行委托實例化時可以省略掉委托類型。代碼示例如下:
myButton.Click += delegate {//代碼}
myButton.Click += myClick;
三、迭代器(Iterator)
概述:
嚴格來說只是簡化迭代器的構造罷了。或者說簡化了創建可以用於foreach的枚舉集合的工作。通過引入關鍵字yield來實現。再不用太多的關心IEnumerator了。直接在類中實現GetEnumerator()然后在for循環中用yield return就可以了。
語法點:
可以用yield break來停止迭代。
四、局部類(partial class)
概述:
就是允許通過關鍵字partial將一個類寫在多個cs文件中。最大的用處可能就是將IDE自動生成的代碼分開吧。大家都留意到VS05中的自動生成的代碼都到designer.cs中去了吧。
語法點:
在不同部分定義中,Attribute和Interface是累加的。當然要保證基類的唯一。而abstract和sealed是部分使用,整個類生效。語義類型訪問修飾符要保持一致。
五、可空類型(Nullable type)
概述:
其實是一個泛型類型。System.Nullable<T>,T必須為值類型。並且通過“?”來作一個語法的簡化。用一句代碼說明就是:
int? x = null;
引入NullableType獲得的啟示是,.Net的ORMapping可以做得更好了。
語法點:
使用HasValue屬性判斷是否為null。
六、靜態類(static class)
概述:
可以聲明一個static class。該class不能被繼承不能被實例化,只能包含靜態成員。相當於sealed abstract。用途可以用作全局函數。另外Singleton模式的實現更方便了。
語法點:
不能有constructor,不能有實例成員,不能再使用sealed abstract修飾。不能繼承其他類和實現任何interface。成員不能使用protected修飾符。
七、屬性器訪問修飾符
概述:
可以額外對get、set中的其中一個屬性訪問其使用一個訪問修飾符。用途可以說是更靈活的封裝吧。
語法點:
只能在get、set的一個中使用。接口中的屬性訪問器不能同樣不能帶有訪問修飾符。索引器可以使用。
C# 3.0新特性
一、隱式類型var
1:var可以用局部變量聲明不可以用於字段可以應用於for、foreach、using語句中
2:var關鍵字不能包含自身對象或者集合初始化器,但可以經過new的新表達式
例:var result;//編譯錯誤
var result=result+1;//編譯錯誤
var result={1,2,3};//編譯錯誤
3:var是推斷類型,不是顯示類型
4:var關鍵字指示編譯器根據初始化語句右側的表達式推斷變量的類型
5:推斷類型可以是內置類型、匿名類型、用戶定義類型、.NET Framework 類庫中定義的類型或任何表達式
注:var關鍵字並不意味着“變體”,也不表示該變量時松散類型化變量或后期綁定變量。它只是表示由編譯器確定和分配最適合的類型。
var 使用的場景
1:局部變量
例:var i = 5;
2:在for初始化語句
例:for(var i = 1; i < 10; ++i)
3:在foreach初始化語句
例:foreach(var item in list)
4:在using語句
例:using(var file = new StreamReader("C:\"))
二、對象初始化
注:對象初始化器由一系列成員對象組成,其對象必須初始化,用逗號間隔,使用{}封閉
1.NET 2.0寫法:
User userInfo = new User(); userInfo.ID = “123”; userInfo.Name = “leifeng”; userInfo.Age= 22;
2.NET 3.5寫法:
User userInfo = new User() {ID = “123”, Name = “leifeng”, Age=22};
注:嵌套復雜屬性類型
User userInfo = new User() { ID=“123”, Name=“leifeng”, Address = new Address() { Province=“HuNan”, City=“Changsha” } };
三、集合初始化
注:
1:集合初始化器由一系列集合對象組成,用逗號間隔,使用{}封閉。
2:集合初始化器會對初始化器中的元素進行按序調用ICollection<T>.Add(T)方法
//例如: List<int> number=new List<int>{1,2,3,4,5}; //集合初始化器 public class parame { public String Name { get; set; } public Int32 Age { get; set; } } public class Program { static void Main(string[] args) { IList<parame> people = new List<parame>() { new parame{ Name = "張三", Age = 18}, new parame{ Name = "李四", Age = 20} }; foreach (var i in people)//var 是3.0特有的 { Console.WriteLine("{0},{1}", i.Name, i.Age); } Console.ReadLine(); } }
四、屬性自動完成
1、.NET2.0下寫User類:
public class User { private string id;//用戶ID public string ID { get{return id;} Set {id=value;} } private string name;//用戶名稱 public string Name { get{return name;} set{name=value;} } }
2、.NET 3.5下寫User類:
public class User { public string ID{get;set;} public string Name{get;set;} }
注:在VS2008像以上寫法,編譯器自動會為類中生成一個私有變量,並對這個變量實現公開的getter和setter訪問器。
五、匿名類型
注:使用new操作符和匿名對象初始化器創建一個新的對象,該對象是匿名類型的對象。
如:
var role = new{ID=“123”,Name=“leifeng”};
等同於:
class _Anonymous1 { private string id; public string ID { get{return id;} set{id=value;} } private string name; public string Name { get{return name;} set{name=value;} } }
六、擴展方法
擴展方法必須遵守以下規則:
1.擴展類必須是靜態的;
2.擴展方法必須是靜態的
3.擴展方法的第一個參數必須以this開頭,參數必須是原有類的類型
七、Lambda表達式
1、格式如下:(參數列表)=>表達式或語句塊 ;
//例: var str=list.FindAll(s=>s.indexof(“test”)>=0);
2、參數列表可以是顯示或者隱式類型,在顯式列表中,每個參數的類型是顯式指定的,在隱式列表中,參數的類型由Lambda表達式出現的語境自動推斷類型 。
//例: (x, y) => x * y;//多參數,隱式類型=>表達式 x => x * 10;//單參數,隱式類型=>表達式 x => { return x * 10; }; //單參數,隱式類型=>語句塊 (int x) => x * 10;//單參數,顯式類型=>表達式 (int x) => { return x * 10; };//單參數,顯式類型=>語句塊 ( ) => Console.WriteLine(); //無參數
表達式樹
注:表達式樹允許像處理數據一樣對Lambda表達式進行讀取和改寫,比如我們在動態查詢的時候經常應用到
C# 3.5新特性
Visual Studio 2008和.NET 3.5是建立在.NET2.0核心的基礎之上,C# 3.0新語言特性在.NET2.0基礎上進行了改進,這些改進的功能可以大大簡化我們編寫程序。
.NET 3.5的新特性包括:
自動屬性(Auto-Implemented Properties)
隱含類型局部變量(Local Variable Type Inference)
匿名類型(Anonymous Types)
對象與集合初始化器(Object and Collection Initializers)
擴展方法(Extension Methods)
Lambda表達式和Lambda表達式樹 (Lambda Expression and Lambda Expression Trees)
LINQ,語言級集成查詢(Language INtegrated Query)
自動屬性(Auto-Implemented Properties)
自動屬性可以避免原來這樣我們手工聲明一個私有成員變量以及編寫get/set邏輯,在VS2008中可以像下面這樣編寫一個類,編譯器會自動地生成私有變量和默認的get/set 操作。你也可以分別定義get和set的"protected"等訪問級別。
C# 4.0 新特性
Dynamic Programming