lambda表示式也是c#3.0中最重要的特性之一。
1、lambda表示式的簡介
lambda表示式可以理解為乙個匿名方法,它可以包含表示式和語句,並且用於建立委託或轉換為表示式樹。在使用lambda表示式時,都會使用「=>」運算子,該運算子的左邊是匿名方法的輸入引數,右邊則是表示式或語句塊。
1.1 lambda表示式的演變過程
其實lambda表示式是匿名方法的投胎轉世。下面以**來鑑定:
1 c# 1.02 func delegatetest1=new func(callbackmethod);
34 c# 2.0
5 func delegatetest2=delegate(string
text)69
10 c# 3.0
11 func delegatetest3=(string text)=>text.length;
1213
可以省略引數型別string,從而將**再次簡化
14 func delegatetest4=(text)=text.length;
15此時也可以把圓括號省略
16 func delegatetest=text=>text.length;
以上**形象地掩飾了lambda表示式是如何由匿名方法演變而來的。
1.2 lambda表示式的使用
在實際開發過程中,委託的用途莫過於訂閱事件了。為了加深大家對lambda表示式的理解,這裡選擇演示用lambda表示式去訂閱事件。
1namespace
lambda表示式2;
8 button1.click += (sender, e) => reportevent("
click事件
", sender, e);
9 button1.keypress += (sender, e) => reportevent("
keypress事件
", sender, e);10}
1112
private
static
void reportevent(string s, object
sender, eventargs eventargs)
1316
}17 }
從以上**可以看出,使用了c# 3.0的物件初始化器和lambda表示式後,**確實簡潔了不少。
2、表示式也有樹結構——表示式樹
lambda表示式除了可以用來建立委託外,還可以轉換成表示式樹。表示式樹(或稱「表示式目錄樹」)是用來表示lambda表示式邏輯的一種資料結構,它將**表示成乙個物件樹,而非可執行**。其實可以將表示式樹理解為一種資料結構,類似棧或佇列這種。
2.1 通過lambda表示式來構造表示式樹
1namespace
表示式樹
2,引數2:");
1213
//獲取表示式樹的主體部分
14 binaryexpression body =(binaryexpression) expressiontree.body;
1516
//左節點(每個節點本身就是乙個表示式物件)
17 parameterexpression left =(parameterexpression) body.left;
1819
//右節點
20 parameterexpression right =(parameterexpression)body.right;
2122 console.writeline("
表示式樹主體為:");
23console.writeline(expressiontree.body);
24 console.writeline($"
表示式樹左節點為: 節點型別為: 表示式樹右節點為: 節點型別為:");
25console.readkey();
2627}28
}29 }
從以上**可以看出,通過lambda表示式來構造表示式樹的過程非常簡單,只需要把lambda表示式賦給乙個表示式樹變數就可以了。
2.2 如何把表示式樹轉換成可執行**
1namespace
表示式樹22"
);14
console.readkey();15}
16}17 }
以上**通過expression類的compile()方法將表示式樹編譯成委託例項,然後通過委託呼叫的方式得到兩個數的和。
不一樣又不一樣的 木板接水
空地上豎立著n個從左到右排列的木板,它們可以把水擋住,但溢位最邊上木板的水將會流到空地上。已知木板間距都是單位1,現給定每個木板的高度,請求出總共能接住的水量?說明一點,這裡只考慮間距 寬度 和高度,不考慮第三個維度,因此水量是平方單位。木板高度分別是2,1,3,那麼我們可以接住2 2 4平方單位的...
我們不一樣
前輩們因自身實際的種種因素的影響而產生的認知,並不一定適用於我們自身。你可能從來不會去想乙個問題 你的觀點,來自 其實,它們絕大部分來自網路,它們或多或少地蠶食了你的判斷力。未來的路要怎麼走,沒有對與錯。有的,只是每乙個選擇所需要承擔的責任。我不想面臨,後之視今亦猶今之視昔的悲哀。我希望,未來回首,...
我們不一樣
這麼多年的兄弟 有誰比我更了解你 太多太多不容易 磨平了歲月和脾氣 時間轉眼就過去 這身後不散的筵席 只因為我們還在 心留在原地 張開手 需要多大的勇氣 這片天 你我一起撐起 更努力 只為了我們想要的明天 好好的 這份情好好珍惜 我們不一樣 每個人都有不同的境遇 我們在這裡 在這裡等你 我們不一樣 ...