C#語法糖,讓編程更具樂趣

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的博客編寫,添加了一些本身的領悟和知識點。
相關文章
相關標籤/搜索