又是一個周末,剛好有時間,又繼續復習與總結了,希望能讓大家受益,不足之處歡迎指正,謝謝!
十八. Lambda
1.Lambda表達式:匿名方法的另一種表現形式,它可以包含表達式和語句,且用于創建委托或轉換為表達式樹,定義語法:(形參列表)=>{方法體}; 單個參數時,可以省略括號
2.Lambda表達式樹是用來表示Lambda表達式邏輯的一種數據結構,它將代碼表示成一個對象樹,而非可執行的代碼,定義語法如(a+b):
Experssion<Func<int,int,int>> (a,b)=>a+b;
通過代碼動態構造Lambda表達式樹,如下:
parameterExpression a=Expression.Parameter(typeof(int),”a”); parameterExpression a=Expression.Parameter(typeof(int),”b”); BinaryExpression body=Expression.Add(a,b); Experssion<Func<int,int,int>> exprTree=Expression.Lambad(body,a,b);
3.Lambda表達式樹通過調用Compile方法將表達式樹轉換為可執行代碼(即所表示的委托)
十九.擴展方法
1.擴展方法是一種方法,它用來擴展已知類型的方法成員(即在不改變原有類型的前提下,附加新的方法);
2.擴展方法定義規則:
a)必須在一個非嵌套、非泛型的靜態類(即標準的靜態類)中定義;
b)它至少要有一個參數;
c)第一個參數必須在類型加上this關鍵字,表示向該參數對應的類型就進擴展;
d)第一個參數不能使用任何修飾符(如:不能使用rel,out)
e)第一個參數的類型不能是指針類型;
3.擴展方法定義語法如下:
static class 靜態類名 { public static 返回類型 擴展方法名(this 目標擴展類型 形參名,其它形參…) { //方法體 } }
4.空引用(NULL)支持調用擴展方法
注意:定義擴展方法時,為防止方法污污染(即擴展的方法在某些類型中并無實際作用或不需要),應盡量擴展具體類型,而不要擴展其基類
二十.LINQ
1.LINQ,即語言集成查詢,提供一種跨越各種數據源的統一的查詢方式
2.LINQ查詢表達式必須以from子句開頭,并且必須以select或group子句結尾,在第一個from子句與最后一個select或group子句之間可以包含多個子包,定義語法如下:
Var query=from n in numbers where n<=10 select n;
3.LINQ查詢表達式是建立在Lambda表達式和擴展方法的基礎上的,而Lambda表達式又是建立在委托的基礎上的,擴展方法也屬于方法,所以LINQ的本質還是對方法的調用,對于編譯器而言,使用LINQ查詢表達式與使用方法調用的代碼完全相同。
二十一.C#4.0新特性
可選參數:指定了默認值的參數,即在調用方法時,該參數可以指定實參,也可以不指定實參,若不指定則采用默認值;
注意:1.可選參數必須在非可選參數的后面;2.默認值必須為常量;3.不定參數(即用params表示的參數數組)不能為可選參數;4.用rel或out標識的參數不能為可選參數;
命名實參:即在調用方法時,直接指定形參名并為其賦值(指定實參),可不按方法形參的順序,且非可選參數必需全部指定實參,使用語法如下:
static void Write(DateTime dt,string name,string result="www.zuowenjun.cn") { Console.Write("{0}-{1}-{2}", dt, name, result); } //調用方法 Write(name: "夢在旅途", dt: DateTime.Now);
動態類型:即用dynamic關鍵字來表示某個變量的類型,動態類型可不用編寫顯式強制轉換的代碼,強制轉換由編譯器來完成;定義語法如下:
dynamic d=10;dynamic str=”www.zuowenjun.cn”; dynamic p=new People();
注意:1.不能直接用動態類型作為實參來調用擴展方法;2.委托與動態類型間不能做隱式轉換;3.不能調用構造函數或靜態方法;4.不能將動態類型dynamic作為基類聲明,也不能作為泛型類型參數的約束
二十二.多線程
1.線程與進程關系:線程是進程的執行單元,操作系統通過調度線程來使應用程序工作,而進程則是線程的容器,它是由操作系統創建,又在具體的執行過程中創建了線程;一個進程至少包含一個線程。
2.線程分前臺線程與后臺線程之分,在同一個線程中,若所有前臺線程結束后,CLR會強制強結束仍在運行的所有后臺線程,這些后臺線程被直接終止,卻不會拋出任何異常。主線程一定是前臺線程。線程的創建語法如下:
Thread 線程變量名=new Thread(委托實例);
線程變量名.IsBackgroud=true; //為true則表示為后臺線程,否則為前臺前線程
線程變量名.Start();//啟動線程
3.線程池:是指存放應用程序中要使用的線程的集合,若要使用線程池中的線程,需要調用靜態方法:ThreadPool.QueueUserWorkItem
4.線程同步:確保某一時間只有一個線程在操作共享資源,實現線程同步的方法:
a)監視器Monitor、lock,使用代碼如下:
private static object syncObj = new object();//類的靜態字段 try { Monitor.Enter(syncObj); //其它代碼 } finally { Monitor.Exit(syncObj); } lock(syncObj) //為上面代碼的簡寫形式 { //執行代碼 };
b)Mutex對象,Mutex是跨進程的,因此我們可以在同一臺機器甚至遠程的機器上的多個進程上使用同一個互斥體,使用代碼如下:
Mutex mt=new Mutex(); mt.WaitOne();//等待 //執行代碼 mt.ReleaseMutex();//釋放
c) ReaderWriterLock類型,用ReaderWriterLock進行資源訪問時,如果在某一時刻資源并沒有獲取寫的獨占權,那么可以獲得多個讀的訪問權,單個寫入的獨占權,如果某一時刻已經獲取了寫入的獨占權,那么其它讀取的訪問權必須進行等待,使用語法如下:
static ReaderWriterLock rwLock = new ReaderWriterLock();//類的靜態字段 rwLock.AcquireWriterLock(1000); //執行代碼 rwLock.ReleaseWriterLock();
d)還有SynchronizationAttribute、MethodImplAttribute、同步事件和等待句柄等,具體每種用法可參見該篇博文:
http://www.cnblogs.com/michaelxu/archive/2008/09/20/1293716.html
文章列表