由於項目升級到了.NetFramework 4.6.1,開發工具轉向了vs2015,趁機嘗試下C#6.0.結果在網上搜的一些教程總結的不是太完整,有的代碼隨著vs正式版的發佈也有所修改.那些個教程也沒更新.所以把自己學習到的記錄一下. 1.自動屬性初始化(Auto-property initiali ...
由於項目升級到了.NetFramework 4.6.1,開發工具轉向了vs2015,趁機嘗試下C#6.0.結果在網上搜的一些教程總結的不是太完整,有的代碼隨著vs正式版的發佈也有所修改.那些個教程也沒更新.
所以把自己學習到的記錄一下.
1.自動屬性初始化(Auto-property initializers)
public class Account { public string Name { get; set; } = "summit"; public int Age { get; set; } = 22; public IList<int> AgeList { get; set; } = new List<int> { 10,20,30,40,50 }; }
對於只讀屬性也可以這樣直接初始化(C#5.0不支持),也可以直接在構造函數里初始化
public class Customer { public string Name { get; } public Customer(string first, string last) { Name = first + " " + last; } }
2.字元串嵌入值(String interpolation)
在之前版本的String.Format中有多少個參數就要寫多少個占位符還必須按照順序,否則就報錯.參數一多,這樣搞的話確實頭疼.新版本中在字元串前用$來標識後邊的字元可以使用{對象}來作為占位符.看個例子.
Console.WriteLine($"年齡:{account.Age} 生日:{account.BirthDay.ToString("yyyy-MM-dd")}"); Console.WriteLine($"年齡:{account.Age}"); Console.WriteLine($"{(account.Age<=22?"小鮮肉":"老鮮肉")}");
如果想輸出{或}符號,寫兩個即可,如$"{{".
註意這個$符號,網上的N多教程都是沒有這個東東的.是直接"\{ account.Age \}",這種方式在新版本里已經被拋棄了.
3.導入靜態類(Using Static)
像之前使用Math這個靜態類的時候要先導入System命名空間後才能使用它.現在可以直接導入這個靜態,然後代碼中直接使用其函數.
using static System.Math;//註意這裡不是命名空間哦 Console.WriteLine($"之前的使用方式: {Math.Pow(4, 2)}"); Console.WriteLine($"導入後可直接使用方法: {Pow(4,2)}");
註意這裡是using static ...
如果某個命名空間下有n個方法,用這種方式直接引入單個靜態類而不用引用所有方法還是挺方便的.
4.空值運算符(Null-conditional operators)
之前寫過無數個這樣的判斷代碼
if (*** != null) { //不為null的操作 } return null;
現在使用可以簡化這樣方式.
var age = account.AgeList?[0].ToString(); Console.WriteLine("{0}", (person.list?.Count ?? 0));
如果account.AgeList為空則整個表達式返回空,否則後邊的表達式的值.
5.對象初始化器(Index Initializers)
這種方式可以給字典或其他對象通過索引賦值初始化.
IDictionary<int, string> dict = new Dictionary<int, string>() { [1]="first", [2]="second" }; foreach(var dic in dict) { Console.WriteLine($"key: {dic.Key} value:{dic.Value}"); } output: key: 1 value:first key: 2 value:second
6.異常過濾器(Exception filters)
private static bool Log(Exception e) { Console.WriteLine("log"); return true; } static void TestExceptionFilter() { try { Int32.Parse("s"); } catch (Exception e) when (Log(e)) { Console.WriteLine("catch"); return; } } 當when()裡面返回的值不為true,將持續拋出異常,不會執行catch裡面的方法.
7.nameof表達式 (nameof expressions)
在對方法參數進行檢查時經常這樣寫: private static void Add(Account account) { if (account == null) throw new ArgumentNullException("account"); } 如果某天參數的名字被修改了,下麵的字元串很容易漏掉忘記修改. 使用nameof表達式後,編譯的時候編譯器將檢查到有修改後自動導航與重構(-_-! 不知道翻譯的對不對) private static void Add(Account account) { if (account == null) throw new ArgumentNullException(nameof(account)); }
8.在cath和finally語句塊里使用await(Await in catch and finally blocks)
c#5.0里是不支持這麼寫. Resource res = null; try { res = await Resource.OpenAsync(…); // You could do this. … } catch(ResourceException e) { await Resource.LogAsync(res, e); // Now you can do this … } finally { if (res != null) await res.CloseAsync(); // … and this. }
9.在屬性里使用Lambda表達式(Expression bodies on property-like function members)
public string Name =>string.Format("姓名: {0}", "summit"); public void Print() => Console.WriteLine(Name);
10.在方法成員上使用Lambda表達式
static int LambdaFunc(int x, int y) => x*y; public void Print() => Console.WriteLine(First + " " + Last);
關於C#6.0新增加的語言特性目前為止也就這麼多.沒有什麼新功能,更多的是語法糖的改進.開發更舒服更快速.
最後附上github上關於c#6.0的相關介紹鏈接:點我點我