今天繼續寫上一篇文章C#4.0語法糖之第二篇,在開始今天的文章以前感謝各位園友的支持,經過昨天寫的文章,今天有不少園友們也提出了文章中的一些不足,再次感謝這些關心個人園友,在之後些文章的過程當中不斷的完善以及自我提升,給各位園友們帶來更好,更高效的文章。程序員
廢話就說到這裏,下面正式進入咱們的今天的C#4.0語法糖,今天給你們分享一下參數默認值、命名參數、對象初始化器和集合初始化器。c#
參數默認值和命名參數:方法的可選參數是.net 4.0最新提出的新的功能,對應簡單的重載可使用可選參數和命名參數混合的形式來定義方法這樣就能夠很高效的提供代碼的運行效率。設計一個方法的參數的時,可爲部分或所有參數分配默認值。調用其方法時,能夠從新指定分配了默認值的參數,也可使用默認值從新指定分配默認值的參數時,能夠顯式地爲指定參數名稱賦值,隱式指定的時候,是根據方法參數的順序,靠c#編譯器的推斷。 ide
咱們用一個現實的例子來講明一下這個問題:比我咱們有個這樣的需求,有個客戶類羣體,他們的年齡默認都25歲,可是有些優質客戶能夠放寬年齡,能夠是24歲或者26等等。下面我直接貼一下傳統寫法的代碼:函數
1 public class Customer 2
3 { 4
5 //構造默認25歲年齡的客戶
6
7 public Customer(string CustomerId, string CustomerName) 8
9 { 10
11 this.Age = 25; 12
13 this.CustomerId = CustomerId; 14
15 this.CustomerName = CustomerName; 16
17 } 18
19 //構造不默認年齡的客戶
20
21 public Customer(string CustomerId, string CustomerName,int Age) 22
23 { 24
25 this.Age = Age; 26
27 this.CustomerId = CustomerId; 28
29 this.CustomerName = CustomerName; 30
31 } 32
33 public string CustomerId { get; set; } 34
35 public int Age { get; set; } 36
37 public string CustomerName { get; set; } 38
39 }
1 //默認年齡的客戶
2
3 Customer customer=new Customer("01","張三"); 4
5 Console.WriteLine("Id:"+customer.CustomerId+"名稱"+customer.CustomerName+"年齡"+customer.Age); 6
7 Console.ReadLine(); 8
9 //指定年齡的客戶
10
11 Customer customerEx = new Customer("01", "張三",26); 12
13 Console.WriteLine("Id:" + customerEx.CustomerId + "名稱" + customerEx.CustomerName + "年齡" + customerEx.Age); 14
15 Console.ReadLine();
輸出效果:工具
咱們從以上代碼能夠看出若是名稱須要默認值時還須要編寫一個重載方法,這樣一來代碼就愈來愈多,代碼的可讀性也會慢慢便複雜。this
這時候咱們在把C#4.0的語法糖亮出來,呵呵。spa
1 public class Customer 2
3 { 4
5 public Customer(string CustomerId, string CustomerName,int Age=25) 6
7 { 8
9 this.Age = Age; 10
11 this.CustomerId = CustomerId; 12
13 this.CustomerName = CustomerName; 14
15 } 16
17 public string CustomerId { get; set; } 18
19 public int Age { get; set; } 20
21 public string CustomerName { get; set; } 22
23 }
調用代碼.net
輸出結果設計
輸出結果:3d
以上輸出結果能夠看出效果是同樣的,可是簡化了一個重載方法,代碼的閱讀性也加強了,這就是參數默認值的魅力支出。
可是它也有它的缺點,咱們在看看使用它是須要注意的地方:
一、能夠爲方法和有參屬性指定默認值
二、有默認值的參數,必須定義在沒有默認值的參數以後
三、默認參數必須是常量
四、ref 和 out參數不能指定默認值
對象初始化器:
咱們在寫一些實體類的時候,咱們每每在寫構造方法的時候思考很長時間,除了一個無參構造器外還在想須要寫幾個構造器呢?哪些參數是須要初始化的。如今你不再須要爲這事煩惱了。語法糖爲你提供了對象集合初始化器,在這裏經過代碼對比一些這兩種寫法的區別和內在的關聯。
1 Customer customer=new Customer(); 2
3 customer.CustomerId = "001"; 4
5 customer.CustomerName = "李四"; 6
7 customer.Age = 25; 8
9 Console.WriteLine("Id:"+customer.CustomerId+"名稱"+customer.CustomerName+"年齡"+customer.Age); 10
11 Console.ReadLine(); 12
13 //對象初始化器
14
15 Customer customerEx = new Customer 16
17 { 18
19 CustomerId = "002", 20
21 CustomerName = "張三", 22
23 Age = 24
24
25 }; 26
27 Console.WriteLine("Id:" + customerEx.CustomerId + "名稱" + customerEx.CustomerName + "年齡" + customerEx.Age); 28
29 Console.ReadLine();
輸出結果:輸出結果:
從效果上看是都同樣,可是經過對象初始化器代碼比較簡潔,讓程序員少些不少代碼。
咱們再經過反編譯工具來看一下對象初始化器和傳統的初始化有什麼關聯的地方。
編譯器代碼以下:
1 private static void Main(string[] args) 2 { 3 Customer customer = new Customer { 4 CustomerId = "001", 5 CustomerName = "李四", 6 Age = 0x19
7 }; 8 Console.WriteLine(string.Concat(new object[] { "Id:", customer.CustomerId, "名稱", customer.CustomerName, "年齡", customer.Age })); 9 Console.ReadLine(); 10 Customer customer2 = new Customer { 11 CustomerId = "002", 12 CustomerName = "張三", 13 Age = 0x18
14 }; 15 Console.WriteLine(string.Concat(new object[] { "Id:", customer2.CustomerId, "名稱", customer2.CustomerName, "年齡", customer2.Age })); 16 Console.ReadLine(); 17 }
集合初始化器:從編譯器代碼中能夠看出這兩種代碼效果是同樣的對象初始化器在編譯器內部調用類默認無參構造函數,因此初始化對象也必須有無參構造函數才能夠,這一點跟傳統的對象初始化是一致的。
經過上面的對象初始化器咱們有個大致的瞭解了,因此集合初始化器也很天然的出來了,從下面的代碼比較一下:
1 Customer customer = new Customer(); 2
3 customer.CustomerId = "001"; 4
5 customer.CustomerName = "張三"; 6
7 customer.Age = 25; 8
9 Customer customer2 = new Customer(); 10
11 customer.CustomerId = "002"; 12
13 customer.CustomerName = "李四"; 14
15 customer.Age = 30; 16
17 // 傳統方式
18
19 List<Customer> list=new List<Customer>(); 20
21 list.Add(customer); 22
23 list.Add(customer2); 24
25 //集合初始化
26
27 List<Customer> listC=new List<Customer>
28
29 { 30
31 new Customer{CustomerId = "001",CustomerName = "張三",Age = 25}, 32
33 new Customer{CustomerId = "002",CustomerName = "李四",Age = 30} 34
35 };
編譯器編譯效果以下:這些代碼能夠看出傳統的方式比較繁瑣,下面的就用幾行代碼實現跟傳統方式同樣的效果。
1 private static void Main(string[] args) 2
3 { 4
5 Customer customer = new Customer { 6
7 CustomerId = "001", 8
9 CustomerName = "張三", 10
11 Age = 0x19
12
13 }; 14
15 Customer customer2 = new Customer(); 16
17 customer.CustomerId = "002"; 18
19 customer.CustomerName = "李四"; 20
21 customer.Age = 30; 22
23 new List<Customer> { customer, customer2 }; 24
25 List<Customer> list3 = new List<Customer>(); 26
27 Customer item = new Customer { 28
29 CustomerId = "001", 30
31 CustomerName = "張三", 32
33 Age = 0x19
34
35 }; 36
37 list3.Add(item); 38
39 Customer customer4 = new Customer { 40
41 CustomerId = "002", 42
43 CustomerName = "李四", 44
45 Age = 30
46
47 }; 48
49 list3.Add(customer4); 50
51 List<Customer> list2 = list3; 52
53 }
以上這些能夠總結出其實語法糖不是什麼新語法,只不過是把之前一些傳統方式的代碼交給編譯器來實現,以便給程序員帶來方便,讓程序員代碼更簡單,代碼結構更清晰,因此我我的比較推薦使用。其中緣由我在這裏就很少講了。
以上這些觀點僅憑表明我我的想法!