1. 程式人生 > >學習Linq之前必須知道的幾種語法糖

學習Linq之前必須知道的幾種語法糖

log .html 術語 protected cte 如果 class 其他 pan

» 引用百度解釋: 語法糖(Syntactic sugar),也譯為糖衣語法,是由英國計算機科學家彼得·約翰·蘭達(Peter J. Landin)發明的一個術語,指計算機語言中添加的某種語法,這種語法對語言的功能並沒有影響,但是更方便程序員使用。通常來說使用語法糖能夠增加程序的可讀性,從而減少程序代碼出錯的機會。

» 用一句話來簡單描述:給我們帶來方便的快捷寫法,編譯器會幫我們做轉換,而且可以提高開發編碼的效率,在性能上也不會帶來損失

» c#有很多種語法糖,接下來主要來講一下與Linq有關的一些語法糖(Lambda表達、自動屬性、擴展方法、var、對象或集合初始化器、匿名類等)

1、Lambda表達式已經在上上一篇單獨講過它的演變由來https://www.cnblogs.com/lxshwyan/p/10815138.html

2、擴展方法在上一篇分三個部分講過(在C#3.0之前沒有擴展方法的狀態(或者你不會使用不知道擴展方法的時候)、擴展方法的語法及怎麽使用、怎麽正確的使用擴展方法https://www.cnblogs.com/lxshwyan/p/10815731.html

3、自動屬性

之前我們封裝屬性快捷鍵:Ctrl+R+E =>彈出封裝好的屬性

自動屬性快捷鍵:輸入字母 PROP+按兩次Tab

        /// <summary>
        /// 封裝屬性
        /// </summary>
        private string _userName;
        public string UserName
        {
            get { return _userName; }
            set { _userName = value; }
        }
        /// <summary>
        /// 自動屬性
        /// </summary>
public string Password { get; set; }

自動屬性和封裝屬性相比沒有從功能上沒有區別,也能對set或get屬性進行訪問控制

/// <summary>
        /// 封裝屬性
        /// </summary>
        private string _userName;
        public string UserName
        {
            get { return _userName; }
            protected  set { _userName = value; }
        }
        /// <summary>
        /// 自動屬性
        /// </summary>
        public string Password { get; protected set; }

4、對象初始化器({})

之前我們對一個對象賦賦初始值的時候必須這樣寫

            UserInfo user1 = new UserInfo();
            user1.UserName = "lxsh";
            user1.PassWord = "123456";
            user1.Age = 25;
            user1.Gender = 1;

現在使用對象初始化器後,可以這樣寫,但使用對象初始化器的對象必須有一個無參的構造函數

    //屬性之前必須用逗號隔開,最後一個逗號可以省略        
UserInfo user2 = new UserInfo() { UserName = "lxsh", PassWord = "123456", Age = 25, Gender = 1, };

5、集合初始化器和對象初始化器類似({})

  //之前我們使用集合對集合給初始化值的時候,只能一個一個add
            List<UserInfo> userInfos1 = new List<UserInfo>();
            userInfos1.Add(new UserInfo() { UserName = "lxsh" });
            userInfos1.Add(new UserInfo() { UserName = "wy" });
            userInfos1.Add(new UserInfo() { UserName = "ly" });

            //現在使用集合初始化器的,可以不必聲明定義單個對象
            List<UserInfo> userInfos2 = new List<UserInfo>()
            {
                new UserInfo() { UserName = "lxsh" },
                new UserInfo() { UserName = "wy" },
                new UserInfo() { UserName = "ly" } 
            };

6、匿名類型(Var)

C#var和JS裏面var含義不一樣,它有以下幾個特點:

它必須是定義的時候必須初始化值,不然會報錯(不能其他類型一樣先定義後賦值)

一旦初始化值後,它已經隱使推導出該變量類型,不能再給他賦值其他類型的值

它是局部變量,不能有public等其他訪問修飾符

它類似object,但不同於object;它在效率上和使用強類型方式定義變量完全一樣

var i=0;與int i=0;其實就是一樣,編譯器自動會把var i=0變成int i=0(所以它在編譯過程中轉換的,沒有裝箱拆箱的過程,和object不一樣)

7、匿名類new{}

匿名類在linq選擇指定類型返回數據 select new { Name = "lxsh" + s.StudentName, Age = s.Age } 及與返回接收匿名類型var經常會一起使用

簡單講有時我們需要類似上面返回的數據,在以前如果沒有匿名類我們只能單獨定義一個類來封裝Name、Age的屬性類,來接收這些數據,但這樣類型數據我們可能只在當前程序中使用,不需要項目間重用,只在這一個地方使用, 單獨定義一個類顯然比較麻煩,如果我們想增加屬性還得再去修改該類,這樣顯然比較麻煩,影響效率;

現在有了匿名類型,我們就不需要單獨定義一個類來封裝我們想要的屬性;

 var student = new { name = "lxsh", age = 18 };
            Console.WriteLine(student.name);
            Console.WriteLine(student.age);

當我們想對student多加一個性別屬性時 只需要簡單修改就可以

var student = new { name = "lxsh", age = 18,gender=1 };
            Console.WriteLine(student.name);
            Console.WriteLine(student.age);
            Console.WriteLine(student.gender);

8、內置泛型委托Action<T>(不能有返回值)

Action一共有16種泛型委托,從一個參數到16個參數的無返回值委托

9、內置泛型委托Func<T>(有返回值)

Func一共有16種泛型委托,從一個參數到16個參數的有返回值委托

Action<T>、Func<T>其實就是C#幫我們封裝了有返回值和無返回值的委托類型,我們不需要單獨去定義委托類型,用的時候只需實例化就可以 ,在這以前我們每次用委托還要單獨去創建委托類型,

-------了解了以上知識接下來我和大家一起來學習一下Linq語法

學習Linq之前必須知道的幾種語法糖