首先需要聲明的是「語法糖」這個詞絕非貶義詞,它可以給我帶來方便,是一種便捷的寫法,編譯器會幫我們做轉換;而且可以提高開發編碼的效率,在性能上也不會帶來損失。這讓java開發人員羨慕不已,呵呵。
1. 經過簡化的Property
早些時候我們這樣聲明Property
view sourceprint?01 private string _myName;
02
03 public string MyName
04
05 {
06
07 get { return _myName; }
08
09 set { _myName = 值; }
10
11 }
千篇一律的這樣聲明,沒有多大意義,於是C#的設計人員將這個千篇一律的工作交給了編譯器幫我們做了,我們現在可以這樣聲明
view sourceprint?1 public string MyName { get; set; }
當然他不會犧牲靈活性,我們可以單獨給get或set設定存取限制符,例如
view sourceprint?1 public string MyName { get; protected internal set; }
2. 經過兩次變異的委託寫法
在.net 1.1時我們不得不聲明方法後才在委託中使用,在.net 2.0之後我們可以使用匿名委託,他不單可以簡化寫法,還可以在匿名委託中訪問範圍內的變量;再後來拉姆達表達式來了,寫法就更簡單了。
view sourceprint?01 class MyClass
02 {
03 public delegate void DoSomething(int a);
04
05 //定義方法委託
06 private void DoIt(int a) {
07 Console.WriteLine(a);
08 }
09
10 private void HowtoDo(DoSomething doMethod,int a) {
11 doMethod(a);
12 }
13
14 public static void Main(string[] args) {
15 MyClass mc = new MyClass();
16 //呼叫定義的方法委託
17 mc.HowtoDo(new DoSomething(mc.DoIt), 10);
18 int x = 10;
19 //使用匿名委託
20 mc.HowtoDo(delegate(int a){
21 Console.WriteLine(a + x);
22 },10);
23
24 //使用lamda表達式
25 mc.HowtoDo(a=>Console.WriteLine(a+x),10);
26
27 Console.ReadLine();
28 }
29 }
3. 集合類別的聲明
之前我們聲明一個List並賦予list初始值,必須要這麼寫:
view sourceprint?1 List<string> list = new List<string>();
2 list.Add("a一");
3 list.Add("b二");
4 list.Add("c三");
現在不需要了,直接寫就可以了
view sourceprint?1 List<string> list = new List<string> {
2 "def","OK"
3 };
4. 集合類別各項的操作
我們為了逐一處理集合中的項,需要這麼寫:
view sourceprint?1 foreach (string item in list)
2 {
3 Console.WriteLine(item);
4 }
現在不需要了,這樣就可以了
view sourceprint?1 list.ForEach(a => Console.WriteLine(a));
程式碼是不是清爽了很多。
5. using == try finally
為了在使用完畢時釋放資源,我們常常要用using,using實質上就是try fiannaly的一個語法糖而已。例如
view sourceprint?1 StreamWriter sw = null;
2 try
3 {
4 sw = new StreamWriter("d:abc.txt");
5 sw.WriteLine("test");
6 }
7 finally {
8 if(sw!= null) sw.Dispose();
9 }
上面的程式碼可以簡化為:
view sourceprint?1 using (var sw = new StreamWriter("d:abc.txt")) {
2 sw.WriteLine("test");
3 }
6. 可愛的var
var的意義時不必寫聲明的類型,編譯器會根據後面對var的賦值判斷它的類型,var的類型一旦確認就不能再改變,它只能作為局部變量使用,不能用做字段也不能用做參數聲明。
例如:
view sourceprint?1 var writer = new StreamWriter(path);
view sourceprint?1 for(var i=0;i<100;i++){}
7. 問號的演變
老掉牙的一個問號+冒號
view sourceprint?1 var b = 3;
2 var a = b > 9?b.ToString():”0”+b;
新寶寶兩個問號??,它表示左邊的變數如果為null則值為右邊的變量,否則就是左邊的變數值
view sourceprint?1 string a = null;
2 var b = a??””;
8. 類型實例化的語法糖
view sourceprint?1 public class Abc
2 {
3 public int ID { get; set; }
4
5 public string Name { get; set; }
6
7 public string Url { get; set; }
8 }
我們沒有為上面的類別聲明建構函數,但是我們可以像下面的形式來實例化它
view sourceprint?1 public static void Main(string[] args) {
2 var abc = new Abc{
3 ID=1,
4 Name="yukaizhao",
5 Url=" http://yukaizhao.cnblogs.com/ "
6 };
7 }
9. 傳說中的擴展方法
在c#3.5時引入了擴展方法,我們可以在不修改類別源碼的情況下為類別增加實例方法,這很有意義。它的實質也是一種語法糖的實現
例如我們給String類別擴充一個IsNumber的方法:
view sourceprint?01 public static class StringExt {
02 static private Regex regexNumber = new Regex(" \d +");
03 static public bool IsNumber(this string input)
04 {
05 if (string.IsNullOrEmpty(input))
06 {
07 return false;
08 }
09 return regexNumber.IsMatch(input);
10 }
11 }
我們可以在String實例上呼叫這個方法了
view sourceprint?1 var abc = “123”;
2 var isNumber = abs.IsNumber();
10.使用匿名類
view sourceprint?1 var a = new {
2 ID = 1,Name=”yukaizhao”,BlogUrl=”http://www.cnblogs.com/yukaizhao/”
3 };
匿名類別在linq to sql或entity framework中回傳查詢資料時很好用。
如果大家還有更多的文法糖,歡迎分享。同時希望大家享受語法糖,因為他可以帶給我們方便,請不要對它嗤之以鼻,也沒必要對它嗤之以鼻。
http://www.cnblogs.com/yukaizhao/archive/2010/05/25/csharp-Syntactic-sugar.html