不能不說的C#特性-對象集合初始化器

作者: 橫刀天笑  來源: 博客園  發布時間: 2008-09-23 12:14  閱讀: 18327 次  推薦: 3   原文鏈接   [收藏]  
 
[1] 不能不說的C#特性-對象集合初始化器
[2] 不能不說的C#特性-對象集合初始化器

系列文章導航:

走進Linq--Linq橫空出世篇

走進Linq-輝煌的背后

走進Linq-Linq大觀園

不能不說的C#特性-對象集合初始化器

不能不說的C#特性-匿名類型與隱式類型局部變量

不能不說的C#特性-擴展方法

不能不說的C#特性-匿名方法和Lambda表達式

不能不說的C#特性-迭代器(上)及一些研究過程中的副產品

不能不說的C#特性-迭代器(下),yield以及流的延遲計算

走進Linq-Linq to Objects(上)基礎篇

走進Linq-Linq to Objects(下)實例篇

走進Linq-Linq to SQL感性認識篇

走進Linq-Linq to SQL How do I(1)

走進Linq-Linq to SQL How do I(2)

走進Linq-Linq to SQL How do I(3)

走進Linq-How do I(4)拾遺補零篇第一節

走進Linq-Linq to SQL源代碼賞析 Table的獲取過程

走進Linq-Linq to SQL源代碼賞析之Provider的初始化

走進Linq-Linq to SQL源代碼賞析,通過Linq to SQL看Linq

 

在寫一些實體類的時候,我們往往在寫構造方法的時候思考很長時間,除了一個無參構造器外還在想需要寫幾個構造器呢?哪些參數是需要初始化的。現在你再也不需要為這事煩惱了。C# 3.0為你提供了對象集合初始化器:

/// 
/// 圖書類
/// 
public class Book
{
    
/// 
    /// 圖書名稱
    
/// 
    public string Title { getset; }
    
/// 
    /// 單價
    
/// 
    public float Price { getset; }
    
/// 
    /// 作者
    
/// 
    public string Author { getset; }
    
/// 
    /// ISBN號
    
/// 
    public string ISBN { getset; }
}

//對象初始化器
Book book = new Book { Title="Inside COM",ISBN="123-456-789"};

現在你想初始化幾個就初始化幾個,不需要出現這種情況:

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)
{
        
this.Title = title;
        
this.Price = price;
        
this.ISBN = 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。看到這里,我們應該想到,要使用對象初始化器,那么這個對象必須有一個無參構造方法,如果你給這個方法寫了一個有參構造方法而將它的默認無參構造方法覆蓋了并且沒有提供一個新的無參構造方法,那么使用對象初始化器編譯的時候是不會通過的(不過想不通,為啥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";
[第1頁][第2頁]
3
2
 
標簽:linq C# 對象 集合
 
 

文章列表

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()