學習Linq之前必須知道的幾種語法糖
» 引用百度解釋: 語法糖(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之前必須知道的幾種語法糖