C#6.0新語法
一、自動屬性初始化
在以前的C#版本中,屬性是這樣寫的:
1 public int Id { get; set; } 2 public string Name { get; set; }
在C#6.0中,屬性可以自動賦初始值,例如:
1 public string Name { get; set; } = "summit"; 2 public int Age { get; set; } = 22; 3 public DateTime BirthDay { get; set; } = DateTime.Now.AddYears(-20); 4 public IList<int> AgeList 5 { 6 get; 7 set; 8 } = new List<int> { 10, 20, 30, 40, 50 };
二、導入靜態類
我們都知道,使用靜態類的方法時是使用類名.方法名的形式,例如:
1 Console.WriteLine($"之前的使用方式: {Math.Pow(4, 2)}");
這裏的Math是框架自帶的靜態類,要使用Pow()方法,必須要向上面的代碼一樣。在C#6.0中可以用下面的方式使用靜態類的方法,例如:
1、使用using導入靜態類
2、導入靜態類以後,可以像使用普通方法一樣,直接使用,例如:
1 Console.WriteLine($"之前的使用方式: {Math.Pow(4, 2)}"); 2 Console.WriteLine($"導入後可直接使用方法: {Pow(4, 2)}");
三、字符串嵌入值
在以前版本中,如果要對字符串就行格式化,要使用string.Format,例如:
1 Console.WriteLine(string.Format("當前時間:{0}",DateTime.Now.ToString()));
在C#6.0中,可以直接使用$進行字符串的嵌入了,例如:
1 Console.WriteLine(string.Format("當前時間:{0}",DateTime.Now.ToString())); 2 Console.WriteLine($"年齡:{this.Age} 生日:{this.BirthDay.ToString("yyyy-MM-dd")}"); 3 Console.WriteLine($"年齡:{{{this.Age}}} 生日:{{{this.BirthDay.ToString("yyyy -MM-dd")}}}"); 4 Console.WriteLine($"{(this.Age <= 22 ? "小鮮肉" : "老鮮肉")}");
結果:
四、空值運算符
我們都知道,null值是不能調用ToString()方法的,會報“未將對象引用設置到對象實例”的錯誤,例如:
1 string name = null; 2 Console.WriteLine(name.ToString());
結果:
在C#6.0中有了空值運算符,如果是null值也可以調用ToString()方法了,這時程序什麽都不會輸出,例如:
1 int? iValue = 10; 2 Console.WriteLine(iValue?.ToString());//不需要判斷是否為空 3 string name = null; 4 Console.WriteLine(name?.ToString()); // 程序不會報錯,也不會輸出任何值 5 Console.WriteLine("空值運算符");
結果:
這樣就不需要像以前一樣先判斷一下變量是不是null值了。
五、對象初始化器
在前面一篇文章中講過一次C#語法糖,在那裏講過對象初始化器和集合初始化器,以前初始化字典集合要像下面的方式:
1 IDictionary<int, string> dictOld = new Dictionary<int, string>() 2 { 3 { 1,"first"}, 4 { 2,"second"} 5 }; 6 // 循環輸出 7 foreach(KeyValuePair<int,string> keyValue in dictOld) 8 { 9 Console.WriteLine($"key:{keyValue.Key},value:{keyValue.Value}"); 10 }
結果:
在C#6.0中,可以通過索引的方式給字段進行初始化,例如:
1 IDictionary<int, string> dictNew = new Dictionary<int, string>() 2 { 3 [4] = "first", 4 [5] = "second" 5 }; 6 // 循環輸出 7 foreach (KeyValuePair<int, string> keyValue in dictNew) 8 { 9 Console.WriteLine($"key:{keyValue.Key},value:{keyValue.Value}"); 10 }
結果:
六、異常過濾器
在以前的版本中,捕獲異常通常使用try{}catch(),只要是發生了異常,就會進入到catch裏面,例如:
1 try 2 { 3 Int32.Parse("we"); 4 } 5 catch(Exception ex) 6 { 7 Console.WriteLine(ex); 8 }
結果:
在C#6.0中,可以設置在滿足某種條件的情況下,才能進入異常捕獲,例如:
1 int exceptionValue = 10; 2 try 3 { 4 Int32.Parse("s"); 5 } 6 catch (Exception e) when (exceptionValue > 1)//滿足條件才進入catch 7 { 8 Console.WriteLine("catch"); 9 }
結果:
七、nameof表達式
我們以前使用過typeof,typeof()可以獲取類型,nameof表達式和typeof一樣的,例如:
1 Console.WriteLine(nameof(peopleTest)); //獲取peopleTest這個字符串 2 Console.WriteLine(nameof(People)); 3 Console.WriteLine(nameof(CSharpSix));
結果:
應用場景:打印日誌的時候打印出參數的值,如果方法裏面參數的名稱改了,而日誌裏面寫的還是原來參數的名稱,這樣就會導致不一致,使用了nameof可以保證日誌裏面的參數名稱和方法裏面的參數名稱一致。
八、在屬性/方法裏面使用Lambda表達式
1 public string NameFormat => string.Format("姓名: {0}", "summit"); 2 public void Print() => Console.WriteLine(Name);
在Main()方法裏面調用:
1 CSharpSix six = new CSharpSix(); 2 Console.WriteLine(six.NameFormat); 3 six.Print();
結果:
C#6.0新語法