国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C# > 正文

C#特性-對象集合初始化器介紹

2019-10-29 21:47:46
字體:
供稿:網(wǎng)友
在寫一些實(shí)體類的時(shí)候,我們往往在寫構(gòu)造方法的時(shí)候思考很長時(shí)間,除了一個(gè)無參構(gòu)造器外還在想需要寫幾個(gè)構(gòu)造器呢?哪些參數(shù)是需要初始化的。現(xiàn)在你再也不需要為這事煩惱了
 

C# 3.0為你提供了對象集合初始化器:
 

  1. /// <summary> 
  2. /// 圖書類 
  3. /// </summary> 
  4. public class Book 
  5.   /// <summary> 
  6.   /// 圖書名稱 
  7.   /// </summary> 
  8.   public string Title { getset; } 
  9.   /// <summary> 
  10.   /// 單價(jià) 
  11.   /// </summary> 
  12.   public float Price { getset; } 
  13.   /// <summary> 
  14.   /// 作者 
  15.   /// </summary> 
  16.   public string Author { getset; } 
  17.   /// <summary> 
  18.   /// ISBN號 
  19.   /// </summary> 
  20.   public string ISBN { getset; } 
  21. //對象初始化器 
  22. Book book = new Book { Title="Inside COM",ISBN="123-456-789"}; 
?

現(xiàn)在你想初始化幾個(gè)就初始化幾個(gè),不需要出現(xiàn)這種情況:
 

  1. public Book():this(""
  2. {  
  3. public Book(string title):this(title,0) 
  4. public Book(string title, float price):this(title,price,""
  5. {  
  6. public Book(string title, float price, string isbn) 
  7.     this.Title = title; 
  8.     this.Price = price; 
  9.     this.ISBN = isbn; 
?

這一串的構(gòu)造方法都是為了應(yīng)付不同的初始化情況。
好了,來看看對象初始化器編譯器在后面為我們做了些什么呢?
使用Reflector反編譯程序集:

 

復(fù)制代碼代碼如下:

Book <>g__initLocal0 = new Book();
<>g__initLocal0.Title = "Inside COM";
<>g__initLocal0.ISBN = "123-456-789";
Book book = <>g__initLocal0;

 

C#編譯器生成了一個(gè)新的局部變量<>g__initLocal0,調(diào)用Book的默認(rèn)無參構(gòu)造方法初始化它,然后對它的屬性進(jìn)行賦值,最后將這個(gè)局部變量賦值給book。看到這里,我們應(yīng)該想到,要使用對象初始化器,那么這個(gè)對象必須有一個(gè)無參構(gòu)造方法,如果你給這個(gè)方法寫了一個(gè)有參構(gòu)造方法而將它的默認(rèn)無參構(gòu)造方法覆蓋了并且沒有提供一個(gè)新的無參構(gòu)造方法,那么使用對象初始化器編譯的時(shí)候是不會通過的(不過想不通,為啥C#編譯器生成這么一個(gè)奇怪的局部變量名字,還有為啥不直接使用book呢)。像下面的代碼不更好:

 

復(fù)制代碼代碼如下:

Book book = new Book();
book.Title = "Inside COM";
book.ISBN = "123-456-789";

 

后來我發(fā)現(xiàn)我是在debug模式下編譯的,換到release模式下變成了這樣:

 

復(fù)制代碼代碼如下:

Book <>g__initLocal0 = new Book();
<>g__initLocal0.Title = "Inside COM";
<>g__initLocal0.ISBN = "123-456-789";

 

被優(yōu)化了。上面介紹的就是對象初始化器了,那什么是集合初始化器呢?

 

復(fù)制代碼代碼如下:

IList<Book> books = new List<Book>();
//這里就使用了對象初始化器,學(xué)以致用吧
books.Add(new Book { style="border-left-color: rgb(0, 153, 204); border-left-width: 1px; border-left-style: solid; padding: 0px 3px; margin: 3px auto 0px; width: 640px; background-color: rgb(242, 246, 251); clear: both; border-top-color: rgb(0, 153, 204); border-top-width: 1px; border-top-style: solid; border-right-color: rgb(0, 153, 204); border-right-width: 1px; border-right-style: solid;"> 復(fù)制代碼代碼如下:

IList<Book> books = new List<Book> { 
     new Book { style="border-left-color: rgb(0, 153, 204); border-left-width: 1px; border-left-style: solid; padding: 0px 3px; margin: 3px auto 0px; width: 640px; background-color: rgb(242, 246, 251); clear: both; border-top-color: rgb(0, 153, 204); border-top-width: 1px; border-top-style: solid; border-right-color: rgb(0, 153, 204); border-right-width: 1px; border-right-style: solid;"> 復(fù)制代碼代碼如下:

List<Book> <>g__initLocal0 = new List<Book>();
    Book <>g__initLocal1 = new Book();
    <>g__initLocal1.Title = "Inside COM";
    <>g__initLocal1.ISBN = "123-456-789";
    <>g__initLocal1.Price = 20f;
    <>g__initLocal0.Add(<>g__initLocal1);
    Book <>g__initLocal2 = new Book();
    <>g__initLocal2.Title = "Inside C#";
    <>g__initLocal2.ISBN = "123-356-d89";
    <>g__initLocal2.Price = 100f;
    <>g__initLocal0.Add(<>g__initLocal2);
    Book <>g__initLocal3 = new Book();
    <>g__initLocal3.Title = "Linq";
    <>g__initLocal3.ISBN = "123-d56-d89";
    <>g__initLocal3.Price = 120f;
    <>g__initLocal0.Add(<>g__initLocal3);

 

從上面的代碼來看,編譯器自動的調(diào)用了List的無參構(gòu)造方法,然后實(shí)例化一個(gè)個(gè)的Book,再一個(gè)個(gè)的Add進(jìn)去,和我們原來的做法沒有什么不同,但是,這是編譯器為我們做的,所以簡省了我們很多的編碼工作。 
對象集合初始化器就算介紹完了。有人也許會說,不就是個(gè)syntx sugar么,有什么。是的,確實(shí)是個(gè)語法糖。在編譯器發(fā)展早期,編譯器科學(xué)家門一直在想方設(shè)法的優(yōu)化編譯器生成的代碼,這個(gè)時(shí)候,編譯器做的主要是對機(jī)器優(yōu)化,因?yàn)槟莻€(gè)時(shí)候機(jī)器的時(shí)間非常寶貴,機(jī)器運(yùn)算速度也不快,今天我們有了足夠好的機(jī)器了(但并不是說我們可以不關(guān)注性能的編寫程序),而且作為編寫軟件的人來說,比機(jī)器的時(shí)間寶貴得多,所以今天的編譯器也在向人優(yōu)化了,從編程語言的發(fā)展之路來講,今天的編程語言比昨天的語言更高級,也更人性化了,我們只要編寫更少的代碼,更符合人的思維的代碼,而只要關(guān)注我們值的關(guān)注的地方。體力活兒就交給編譯器吧。

附加:

剛開始想想這對象集合初始化器也許就一雞肋,沒啥用,不就減少一點(diǎn)點(diǎn)代碼么,像這種簡單的初始化工作,大部分代碼生成器都可以來干。后來在研究匿名類型的時(shí)候突然發(fā)現(xiàn),如果沒有這個(gè)對象初始化器,匿名類型是不是要復(fù)雜一些?或者就是難以實(shí)現(xiàn)?
var test = new{Key="test",Value="test"};如果沒有對象初始化器,匿名類型該怎么辦?


發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 报价| 濉溪县| 萍乡市| 嘉黎县| 高州市| 石柱| 昭平县| 田阳县| 廊坊市| 郎溪县| 泸西县| 石门县| 临洮县| 正定县| 讷河市| 吉安县| 和静县| 曲水县| 寻乌县| 灵石县| 崇信县| 滦平县| 安宁市| 永吉县| 林周县| 静海县| 汕尾市| 晋城| 兴仁县| 阿瓦提县| 新宁县| 宣威市| 竹山县| 大余县| 忻州市| 保山市| 洛川县| 酉阳| 拜泉县| 紫阳县| 紫阳县|