1、什麼是語法糖 語法糖(Syntactic sugar),也譯爲糖衣語法,是由英國計算機科學家彼得·約翰·蘭達(Peter J. Landin)發明的一個術語,指計算機語言中添加的某種語法,這種語法對語言的功能並無影響,可是更方便程序員使用。一般來講使用語法糖可以增長程序的可讀性,從而減小程序代碼出錯的機會。 須要聲明的是「語法糖」這個詞絕非貶義詞,它能夠給我帶來方便,是一種便捷的寫法,編譯器會幫咱們作轉換;並且能夠提升開發編碼的效率,在性能上也不會帶來損失。 2、經常使用的十類語法糖和其運行環境 1.簡化過的Property 過去咱們普通聲明一個屬性 private string _myName; public string MyName { get {return _myName; } set { _myName = value; } } 這樣的聲明方式太多的代碼冗餘量,照成閱讀不方便。 屬性的關鍵特色在於,它提供了從編程角度看相似於字段的API。從上面的例子能夠看出屬性定義語法使用了3個上下文關鍵字。其中get和set關鍵字分別標識屬性的取值和賦值部分。此外,賦值方法可使用value關鍵字來引用賦值運算的右側部分。C#的屬性命名遵循Pascal大小寫規範。 在C#3.0中屬性語法有一個簡化的版本。 1 public string MyName { get;set; } 這樣的聲明也不會限制其的靈活性,一樣能夠給get和set指定訪問限制符。提供外部只能讀而內部能夠修改的屬性。 1 public string MyName { get;protected internal set; } 屬性和方法調用不容許做爲ref和out參數使用。——>C#容許屬性像字段那樣的使用,只是不容許將他們做爲ref或out參數值來傳遞。 2.通過兩次編譯的委託寫法 net 2.0以後咱們可使用匿名委託,他不單能夠簡化寫法,還能夠在匿名委託中訪問範圍內的變量;再後來拉姆達表達式來了,寫法就更簡便了。 C#的委託相似在C或C++中的方法指針,將可執行的步驟做爲參數傳給另外一個方法。 委託的三步,定義委託,實例化委託,綁定方法 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(); } } 委託方法類型和綁定委託的方法的類型須要一致,而且傳遞的參數也要一致。 爲何可使用匿名委託而且能夠不使用New來實例化呢?自從C#2.0開始支持一種新的語法,稱爲「委託推斷」,採用這個語法,編譯器將根據方法名稱來查找方法簽名,並驗證它通方法的參數類型匹配。 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" }; 聲明一個數組能夠可使用上述方法 int[] array = new int[] { 1, 2, 3 }; int[] array = new int[] { 1, 2, 3 }; 4.集合類各個項的操做 咱們爲了逐個處理集合中的項,須要這麼寫: foreach (string itemin list) { Console.WriteLine(item); } 如今不須要了,這樣就能夠了 1 list.ForEach(a => Console.WriteLine(a)); 判斷list是否包含某一個指定元素 1 var result = list.Exists(x => x == "aaa"); 查找集合中是否包含一個指定字符串 1 var result = list.Find(x => x.Contains("aaa")); 判斷List中是否包含特定的字符串。 var result = list.Contains("aaa"); PS:若是須要操做兩個集合,判斷他們是否相同,而且一個求一個集合與另外一個集合的差集,並集,交集等這些方法須要集成 IEquatable接口而後重寫 public override bool Equals(object o) 和 public override int GetHashCode() 方法。 5.using == try finally 使用using語句進行肯定性終結。終結器自己問題在於,不支持肯定性終結(須要預知一個終結器的運行時間的能力)。 爲了在使用完畢時釋放資源,咱們常常要用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的類型一旦確認就不能再改變,它只能做爲局部變量使用,不能用作字段也不能用作參數聲明。 例如: 1 var writer = new StreamWriter(path); 1 for(var i=0;i<100;i++){} 7.問號的演變 1.可控類型修飾符"T?":例如:int?表明可控整形,便可空類型能夠表示其基礎類型的一個值和一個額外的空值。可空類型有一個HasValue的bool類型的只讀屬性,當該屬性爲true的時候,那麼該值爲非空實例,能夠正常訪問該值的Value。若是HasValue的屬性爲false的時候,那麼訪問該值的Value致使異常。 2.條件運算符"result = a?b:c"三元運算符,若是條件a爲真,那麼result=b,若是條件a爲假,那麼result=c。 3.空合併運算符"??",例如:a??b若是a爲空返回b,若是a不爲空返回a。a??b??c適合右和左結合a??b??c=a??(b??c) 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="http://yukaizhao.cnblogs.com/" }; } 9.傳說中的擴展方法 在c#3.5時引入了擴展方法,靜態類的靜態方法,這個方法給C#實現Linq提供的實現的可能性。須要使用擴展方法應該注意一下幾點: 1.擴展方法不要隨意定義,會致使後期使用不明確混亂。 2.擴展方法是一種特殊的靜態方法。 3.擴展方法必須寫在靜態類中。 4.擴展方法的優先級低於同名的類方法。 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中返回查詢數據時很好用。介個不多使用不過看樣子好像很簡單的。 本文大部分類容基於http://www.cnblogs.com/yukaizhao/archive/2010/05/25/csharp-Syntactic-sugar.html的博客編寫,添加了一些本身的領悟和知識點。