c# 3.0為你提供了物件集合初始化器:
///
/// 圖書類
///
public class book
///
/// 單價
///
public float price
///
/// 作者
///
public string author
///
/// isbn號
///
public string isbn
}//物件初始化器
book book = new book ;
現在你想初始化幾個就初始化幾個,不需要出現這種情況:
public book():this("")
public book(string title):this(title,0)
public book(string title, float price):this(title,price,"")
public book(string title, float price, string isbn)
這一串的構造方法都是為了應付不同的初始化情況。
好了,來看看物件初始化器編譯器在後面為我們做了些什麼呢?
使用reflector反編譯程式集:
複製** **如下:
book <>g__程式設計客棧initlocal0 = new book();
<>g__initlocal0.title = "inside com";
<>g__initlocal0.isbn = "123-456-789";
book book = <>g__initlocal0;
c#編譯器生成了乙個新的區域性變數<>g__initlocal0,呼叫book的預設無參構造方法初始化它,然後對它的屬性進行賦值,最後將這個區域性變數賦值給book。看到這裡,我們應該想到,要使用物件初始化器,那麼這個物件必須有www.cppcns.com乙個無參構造方法,如果你給這個方法寫了乙個有參構造方法而將它的預設無參構造方法覆蓋了並且沒有提供乙個新的無參構造方法,那麼使用物件初始化器編譯的時候是不會通過的(不過想不通,為啥c#編譯器生成這麼乙個奇程式設計客棧怪的區域性變數名字,還有為啥不直接使用book呢)。像下面的**不更好:
複製** **如下:
book book = new book();
book.title = "inside com";
book.isbn = "123-456-789";
後來我發現我是在debug模式下編譯的,換到release模式下變成了這樣:
複製** **如下:
book <>g__initlocal0 = new book();
<>g__initlocal0.title = "inside com";
<>g__initlocal0.isbn = "123-456-789";
被優化了。上面介紹的就是物件初始化器了,那什麼是集合初始化器呢?
複製** **如下:
ilist books = new list();
//這裡就使用了物件初始化器,學以致用吧
books.add(new book );
books.add(new book );
books.add(new book );
這樣的**沒少寫吧,實際上也許比這更複雜,有了c# 3.0我們睡覺都想笑:
複製** **如下:
ilist books = new list ,
new book ,
new book
};還是像剛才一樣,我們來欣賞一下c#編譯器為我們生成的**:
複製** **如下:
list <>g__initlocal0 = new list();
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);
從上面的**來看,編譯器自動的呼叫了list的無參構造方法,然後例項化乙個個的book,再乙個個的add進去,和我們原來的做法沒有什麼不同,但是,這是編譯器為我們做的,所以簡省了我們很多的編碼工作。
物件集合初始化器就算介紹完了。有人也許會說,不就是個syntx sugar麼,有什麼。是的,確實是個語法糖。在編譯器發展早期,編譯器科學家門一直在想方設法的優化編譯器生成的**,這個時候,編譯器做的主要是對機器優化,因為那個時候機器的時間非常寶貴,機器運算速度也不快,今天我們有了足夠好的機器了(但並不是說我們可以不關注效能的編寫程式),而且作為編寫軟體的人來說,比機器的時間寶貴得多,所以今天的編譯器也在向人優化了,從程式語言的發展之路來講,今天的程式語言比昨天的語言更高階,也更人性化了,我們只要編寫更少的**,更符合人的思維的**,而只要****值的關注的地方。體力活兒就交給編譯器吧。
附加:剛開始想想這物件集合初始化器也許就一雞肋,沒啥用,不就減少一點點**麼,像這種簡單的初始化工作,大部分**生成器都可以來幹。後來在研究匿名型別的時候突然發現,如果沒有這個物件初始化器,匿名型別是不是要複雜一些?或者程式設計客棧就是難以實現?
var test = new;如果沒有物件初始化器,匿名型別該怎麼辦?
本文標題: c#特性-物件集合初始化器介紹
本文位址:
物件初始化器和集合初始化器
c 語言開發團隊在c 3.0中增加了乙個名為 物件初始化器 object initializer 的特性 它能初始化乙個物件中的所有允許訪問的字段和屬性。別以為這和你沒關係。我們先來看乙個你非常熟悉不過的 user operator new user operator.id 1 operator.p...
物件初始化器與集合初始化器
物件初始化器 使用物件初始化器,可以在建立時直接向物件賦值,無需顯示的呼叫物件的建構函式。利用這個技術可發人員可以建立匿名型別,顯著的減少編寫物件初始化語句的 new p 不採用物件初始化器寫的 user new user user.id 1 user.pwd 123 user.name 孫悟空 採...
C 物件和集合初始化器
為了提供更合理的建構函式,我們不得不進行多次建構函式的過載,使得使用者的呼叫更加簡單。但是這樣的排列組合隨著引數的增加成幾何級增長,的確很不方便。現在有了object and collection initializer 物件和集合初始化器 就方便多了。舉個例子 private class cat ...