天天看點

C#文法糖(Csharp Syntactic sugar)大彙總

首先需要聲明的是“文法糖”這個詞絕非貶義詞,它可以給我帶來友善,是一種便捷的寫法,編譯器會幫我們做轉換;而且可以提高開發編碼的效率,在性能上也不會帶來損失。這讓java開發人員羨慕不已,呵呵。

1.  經過簡化的Property

早些時候我們這樣聲明Property

1

2

3

4

5

6

7

8

9

10

11

​private​

​ ​

​string​

​_myName;​

​public​

​string​

​MyName​

​{​

​get​

​{ ​

​​

​return​

​_myName; }​

​set​

​{ _myName = value; }​

​}​

千篇一律的這樣聲明,沒有多大意義,于是C#的設計人員将這個千篇一律的工作交給了編譯器幫我們做了,我們現在可以這樣聲明

​public​

​string​

​MyName { ​

​get​

​; ​

​set​

​; }​

當然他不會犧牲靈活性,我們可以單獨給get或者set設定通路限制符,例如

​public​

​string​

​MyName { ​

​get​

​; ​

​protected​

​internal​

​set​

​; }​

2.  經過兩次變異的委托寫法

在.net 1.1時我們不得不聲明方法後才在委托中使用,在.net 2.0之後我們可以使用匿名委托,他不單可以簡化寫法,還可以在匿名委托中通路範圍内的變量;再後來拉姆達表達式來了,寫法就更簡便了。

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

​class​

​MyClass​

​{​

​public​

​delegate​

​void​

​DoSomething(​

​int​

​a);​

​//定義方法委托​

​private​

​void​

​DoIt(​

​int​

​a) {​

​Console.WriteLine(a);​

​}​

​private​

​void​

​HowtoDo(DoSomething doMethod,​

​int​

​a) {​

​doMethod(a);​

​}​

​public​

​static​

​void​

​Main(​

​string​

​[] args) {​

​MyClass mc = ​

​new​

​MyClass();​

​//調用定義的方法委托​

​mc.HowtoDo(​

​new​

​DoSomething(mc.DoIt), 10);​

​int​

​x = 10;​

​//使用匿名委托​

​mc.HowtoDo(​

​delegate​

​(​

​int​

​a){​

​Console.WriteLine(a + x);​

​},10);​

​//使用lamda表達式​

​mc.HowtoDo(a=>Console.WriteLine(a+x),10);​

​Console.ReadLine();​

​}​

​}​

3.  集合類的聲明

之前我們聲明一個List并給list賦初始值,必須得這麼寫:

​List<​

​string​

​> list = ​

​new​

​List<​

​string​

​>();​

​list.Add(​

​"a一"​

​);​

​list.Add(​

​"b二"​

​);​

​list.Add(​

​"c三"​

​);​

現在不需要了,直接寫就可以了

​List<​

​string​

​> list = ​

​new​

​List<​

​string​

​> {​

​"def"​

​,​

​"OK"​

​};​

4.  集合類各個項的操作

我們為了逐個處理集合中的項,需要這麼寫:

​foreach​

​(​

​string​

​item ​

​in​

​list)​

​{​

​Console.WriteLine(item);​

​}​

現在不需要了,這樣就可以了

​list.ForEach(a => Console.WriteLine(a));​

代碼是不是清爽了很多。

5.  using == try finally

為了在使用完畢時釋放資源,我們經常要用using,using實質上就是try fiannaly的一個文法糖而已。例如

​StreamWriter sw = ​

​null​

​;​

​try​

​{​

​sw = ​

​new​

​StreamWriter(​

​"d:\abc.txt"​

​);​

​sw.WriteLine(​

​"test"​

​);​

​}​

​finally​

​{​

​if​

​(sw!= ​

​null​

​) sw.Dispose();​

​}​

上面的代碼可以簡化為:

​using​

​(​

​var​

​sw = ​

​new​

​StreamWriter(​

​"d:\abc.txt"​

​)) {​

​sw.WriteLine(​

​"test"​

​);​

​}​

6.  可愛的var

var的意義時不必寫聲明的類型,編譯器會根據後面對var的指派判斷它的類型,var的類型一旦确認就不能再改變,它隻能作為局部變量使用,不能用做字段也不能用做參數聲明。

例如:

​var​

​writer = ​

​new​

​StreamWriter(path);​

​for​

​(​

​var​

​i=0;i<100;i++){}​

7.  問号的演變

老掉牙的一個問号+冒号

​var​

​b = 3;​

​var​

​a = b > 9?b.ToString():”0”+b;​

新寶寶兩個問号 ??,它表示左邊的變量如果為null則值為右邊的變量,否則就是左邊的變量值

​string​

​a = ​

​null​

​;​

​var​

​b = a??””;​

8.  類型執行個體化的文法糖

​public​

​class​

​Abc​

​{​

​public​

​int​

​ID { ​

​get​

​; ​

​set​

​; }​

​public​

​string​

​Name { ​

​get​

​; ​

​set​

​; }​

​public​

​string​

​Url { ​

​get​

​; ​

​set​

​; }​

​}​

我們沒有為上面的類聲明構造函數,但是我們可以像下面的形式來執行個體化它

​public​

​static​

​void​

​Main(​

​string​

​[] args) {​

​var​

​abc = ​

​new​

​Abc{​

​ID=1,​

​Name=​

​"yukaizhao"​

​,​

​Url=​

​"javascript:void(0)"​

​};​

​}​

9.  傳說中的擴充方法

在c#3.5時引入了擴充方法,我們可以在不修改類源碼的情況下給類增加執行個體方法,這個很有意義。它的實質也是一種文法糖的實作

例如我們給String類擴充一個IsNumber的方法:

​public​

​static​

​class​

​StringExt {​

​static​

​private​

​Regex regexNumber = ​

​new​

​Regex(​

​"\\d+"​

​);​

​static​

​public​

​bool​

​IsNumber(​

​this​

​string​

​input)​

​{​

​if​

​(​

​string​

​.IsNullOrEmpty(input))​

​{​

​return​

​false​

​;​

​}​

​return​

​regexNumber.IsMatch(input);​

​}​

​}​

我們可以在String執行個體上調用這個方法了

​var​

​abc = “123”;​

​var​

​isNumber = abs.IsNumber();​

10.使用匿名類

​var​

​a = ​

​new​

​{​

​ID = 1,Name=”yukaizhao”,BlogUrl=”http:​

​//www.cnblogs.com/yukaizhao/”​

​};​

匿名類在linq to sql或者entity framework中傳回查詢資料時很好用。

如果大家還有更多的文法糖,歡迎分享。同時希望大家享受文法糖,因為他可以給我們帶來友善,請不要對它嗤之以鼻,也沒必要對它嗤之以鼻。

繼續閱讀