C#語法糖之第二篇: 參數默認值和命名參數 對象初始化器與集合初始化器


  今天繼續寫上一篇文章C#4.0語法糖之第二篇,在開始今天的文章之前感謝各位園友的支持,通過昨天寫的文章,今天有很多園友們也提出了文章中的一些不足,再次感謝這些關心我的園友,在以后些文章的過程中不斷的完善以及自我提高,給各位園友們帶來更好,更高效的文章。

廢話就說到這里,下面正式進入我們的今天的C#4.0語法糖,今天給大家分享一下參數默認值、命名參數、對象初始化器和集合初始化器。

參數默認值和命名參數:方法的可選參數是.net 4.0最新提出的新的功能,對應簡單的重載可以使用可選參數和命名參數混合的形式來定義方法這樣就可以很高效的提供代碼的運行效率。設計一個方法的參數的時,可為部分或全部參數分配默認值。調用其方法時,可以重新指定分配了默認值的參數,也可以使用默認值重新指定分配默認值的參數時,可以顯式地為指定參數名稱賦值,隱式指定的時候,是根據方法參數的順序,靠c#編譯器的推斷。    

我們用一個現實的例子來說明一下這個問題:比我我們有個這樣的需求,有個客戶類群體,他們的年齡默認都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     }
View Code
輸出代碼:
 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();
View Code

輸出效果:

我們從以上代碼可以看出如果名稱需要默認值時還需要編寫一個重載方法,這樣一來代碼就越來越多,代碼的可讀性也會慢慢便復雜。

這時候我們在把C#4.0的語法糖亮出來,呵呵。

 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     }
View Code

調用代碼

1  // 默認年齡的客戶
2             Customer customer= new Customer( " 01 ", " 張三 ");
3             Console.WriteLine( " Id: "+customer.CustomerId+ " 名稱 "+customer.CustomerName+ " 年齡 "+customer.Age);
4             Console.ReadLine();
5              // 指定年齡的客戶
6             Customer customerEx =  new Customer( " 02 "" 張三 ", 27);
7             Console.WriteLine( " Id: " + customerEx.CustomerId +  " 名稱 " + customerEx.CustomerName +  " 年齡 " + customerEx.Age);
8             Console.ReadLine();
View Code

 

輸出結果

輸出結果:

以上輸出結果可以看出效果是一樣的,但是簡化了一個重載方法,代碼的閱讀性也增強了,這就是參數默認值的魅力支出。

但是它也有它的缺點,我們在看看使用它是需要注意的地方:

1、可以為方法和有參屬性指定默認值

2、有默認值的參數,必須定義在沒有默認值的參數之后

3、默認參數必須是常量

4、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();
View Code

輸出結果:
輸出結果:

從效果上看是都一樣,但是通過對象初始化器代碼比較簡潔,讓程序員少些很多代碼。

我們再通過反編譯工具來看一下對象初始化器和傳統的初始化有什么關聯的地方。

編譯器代碼如下:

 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 }
View Code

集合初始化器:從編譯器代碼中可以看出這兩種代碼效果是一樣的對象初始化器在編譯器內部調用類默認無參構造函數,所以初始化對象也必須有無參構造函數才可以,這一點跟傳統的對象初始化是一致的。

通過上面的對象初始化器我們有個大體的了解了,所以集合初始化器也很自然的出來了,從下面的代碼比較一下:

 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                 };
View Code

編譯器編譯效果如下:這些代碼可以看出傳統的方式比較繁瑣,下面的就用幾行代碼實現跟傳統方式一樣的效果。

 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 }
View Code

以上這些可以總結出其實語法糖不是什么新語法,只不過是把以前一些傳統方式的代碼交給編譯器來實現,以便給程序員帶來方便,讓程序員代碼更簡單,代碼結構更清晰,所以我個人比較推薦使用。其中原因我在這里就不多講了。

以上這些觀點僅憑代表我個人想法!

源代碼下載地址:http://www.yaosutu.cn/archives/550


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM