注意.NET中容易混淆的幾組重要概念(3)_.Net教程
推薦:如何在ASP.Net中實(shí)現(xiàn)RSA加密在我們實(shí)際運(yùn)用中,加密是保證數(shù)據(jù)安全的重要手段。以前使用ASP時,對數(shù)據(jù)加密可以使用MD5和SHA1算法,這兩種算法雖然快捷有效,但是無法對通過它們加密的密文進(jìn)行反運(yùn)算,即是解密。因此需要解密數(shù)據(jù)的場合,這兩種方法就不太適合了。當(dāng)然你也可以自己編寫
Lambda Expression / Expression Tree / 匿名方法
Lambda Expression從定義上講是指帶有“=>”符號的表達(dá)式,例如:
| 以下為引用的內(nèi)容: ◆x => x 1 ◆(x, y) => x > y ◆() => 5 ◆(x, y) => { return x > y; } |
Lambda Expreesion本身并不會在概念上引起混淆,不過由于在C# 3.0中Lambda Expression有兩種截然不同的使用方式,有些朋友就會產(chǎn)生疑問,究竟Lambda Expression是做什么用的?
Lambda Expression的一個重要作用就是提供一種使用匿名方法的新語法,在《您善于使用匿名函數(shù)嗎?》一文中您可以看到這種使用方式。利用Lambda Expression表示匿名函數(shù)的一個重要的缺點(diǎn)就是無法使用帶out或ref關(guān)鍵字的參數(shù),不過它比使用delegate關(guān)鍵字的表示法略為簡單一點(diǎn),因?yàn)闊o需提供參數(shù)類型,例如:
| 以下為引用的內(nèi)容: public static bool CallMethod(Func method) { return method(0); } static void Main(string[] args) { CallMethod(delegate(int a) { return false; }); CallMethod(a => { return false; }); } |
可見,使用Lambda Expression表示的匿名方法無需指定參數(shù)類型,因?yàn)檫@一切都已經(jīng)交給編譯器來判斷了。這一點(diǎn)在參數(shù)類型長而復(fù)雜的情況下(例如并行庫中的方法)非常重要。因此現(xiàn)在要不是會涉及到out/ref參數(shù),我都會使用Lambda Expression來表示匿名方法。
Lambda Expression的另一個作用自然就是構(gòu)造一個LambdaExpression對象。任意一個Expression對象都表示了一個Expression Tree的根節(jié)點(diǎn),而開發(fā)人員可以通過解析這個Expression Tree來實(shí)現(xiàn)特定的功能。我們編寫的方法可以接受一個Lambda Expression作為參數(shù),但是我們還必須對這個參數(shù)的形式進(jìn)行限制,這個參數(shù)才能有意義。這時候我們就會使用Expression類型作為方法的參數(shù)類型,這樣在使用這個方法時就必須使用滿足TDelegate的簽名及返回值的Lambda Expression才能編譯通過。例如:
| 以下為引用的內(nèi)容: public static void CallMethod(Expression> prediect) { ... } static void Main(string[] args) { CallMethod(a => a > 0); } |
解析一個Expression Tree并不是一件簡單的事情,一定程度上這相當(dāng)于在進(jìn)行編譯工作,只是最終生成的結(jié)果不是機(jī)器碼或IL,而是一個執(zhí)行結(jié)果,并且語法解析的過程已經(jīng)由C#編譯器幫我們完成了。我在《擴(kuò)展LINQ to SQL:使用Lambda Expression批量刪除數(shù)據(jù)》一文中曾經(jīng)提到過這一點(diǎn),并且給出了一個實(shí)例,感興趣的朋友們可以參考一下。
需要注意的是,如果在構(gòu)造一個Expression對象時,Lambda Expression的Body部分不能是Statement;而在表示一個匿名對象時Lambda Expression的Body既可以是Expression也可以是Statement。無論是使用Expression還是Statement作為Body,只要表示的含義相同,編譯器都會生成一樣的匿名函數(shù)。例如以下兩種寫法其實(shí)是等價的:
| 以下為引用的內(nèi)容: ◆(x, y) => x > y ◆(x, y) => { return (x > y); } |
最后,我留給大家一個問題:以下兩個做法的結(jié)果是相同的,而代碼也非常接近。不過它們其實(shí)有著非常大的區(qū)別,您能指出嗎?
| 以下為引用的內(nèi)容: var intList = new List() { 1, 2, 3, 4, 5 }; foreach (int i in intList.Where(i => i % 2 == 1)) { Console.WriteLine(i); } var intList = new List() { 1, 2, 3, 4, 5 }.AsQueryable(); foreach (int i in intList.Where(i => i % 2 == 1)) { Console.WriteLine(i); } |
- asp.net如何得到GRIDVIEW中某行某列值的方法
- .net SMTP發(fā)送Email實(shí)例(可帶附件)
- js實(shí)現(xiàn)廣告漂浮效果的小例子
- asp.net Repeater 數(shù)據(jù)綁定的具體實(shí)現(xiàn)
- Asp.Net 無刷新文件上傳并顯示進(jìn)度條的實(shí)現(xiàn)方法及思路
- Asp.net獲取客戶端IP常見代碼存在的偽造IP問題探討
- VS2010 水晶報表的使用方法
- ASP.NET中操作SQL數(shù)據(jù)庫(連接字符串的配置及獲取)
- asp.net頁面?zhèn)髦禍y試實(shí)例代碼
- DataGridView - DataGridViewCheckBoxCell的使用介紹
- asp.net中javascript的引用(直接引入和間接引入)
- 三層+存儲過程實(shí)現(xiàn)分頁示例代碼
.Net教程Rss訂閱編程教程搜索
.Net教程推薦
- ASP.NET MVC :實(shí)現(xiàn)我們自己的視圖引擎
- .NET圖像界面按鈕的clicked事件淺談
- ASP.NET中如何對頁面輸出緩存
- 解析運(yùn)行asp.net服務(wù)器權(quán)限設(shè)置的6個問題
- 解讀ASP.NET中的IFRAME框架掛馬
- 學(xué)習(xí)Asp.Net經(jīng)常會用到的函數(shù)集
- 對.NET Framework 反射的反思
- ASP.NET web.config中數(shù)據(jù)庫連接字符串connectionStrings節(jié)的配置方法
- 水晶易表調(diào)用C#的WebService,返回數(shù)據(jù)集合的應(yīng)用分析
- 談?wù)凥tmlControl與WebControl的區(qū)別與用途
- 相關(guān)鏈接:
- 教程說明:
.Net教程-注意.NET中容易混淆的幾組重要概念(3)
。