最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#特性-對(duì)象集合初始化器介紹

 更新時(shí)間:2014年12月25日 14:42:40   投稿:mdxy-dxy  
在寫一些實(shí)體類的時(shí)候,我們往往在寫構(gòu)造方法的時(shí)候思考很長(zhǎng)時(shí)間,除了一個(gè)無(wú)參構(gòu)造器外還在想需要寫幾個(gè)構(gòu)造器呢?哪些參數(shù)是需要初始化的?,F(xiàn)在你再也不需要為這事煩惱了

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

/// <summary>
/// 圖書(shū)類
/// </summary>
public class Book
{
  /// <summary>
  /// 圖書(shū)名稱
  /// </summary>
  public string Title { get; set; }
  /// <summary>
  /// 單價(jià)
  /// </summary>
  public float Price { get; set; }
  /// <summary>
  /// 作者
  /// </summary>
  public string Author { get; set; }
  /// <summary>
  /// ISBN號(hào)
  /// </summary>
  public string ISBN { get; set; }
}
//對(duì)象初始化器
Book book = new Book { Title="Inside COM",ISBN="123-456-789"};

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

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

這一串的構(gòu)造方法都是為了應(yīng)付不同的初始化情況。
好了,來(lái)看看對(duì)象初始化器編譯器在后面為我們做了些什么呢?
使用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)無(wú)參構(gòu)造方法初始化它,然后對(duì)它的屬性進(jìn)行賦值,最后將這個(gè)局部變量賦值給book。看到這里,我們應(yīng)該想到,要使用對(duì)象初始化器,那么這個(gè)對(duì)象必須有一個(gè)無(wú)參構(gòu)造方法,如果你給這個(gè)方法寫了一個(gè)有參構(gòu)造方法而將它的默認(rèn)無(wú)參構(gòu)造方法覆蓋了并且沒(méi)有提供一個(gè)新的無(wú)參構(gòu)造方法,那么使用對(duì)象初始化器編譯的時(shí)候是不會(huì)通過(guò)的(不過(guò)想不通,為啥C#編譯器生成這么一個(gè)奇怪的局部變量名字,還有為啥不直接使用book呢)。像下面的代碼不更好:

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

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

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

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

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

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

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

IList<Book> books = new List<Book>();
//這里就使用了對(duì)象初始化器,學(xué)以致用吧
books.Add(new Book { Title = "Inside COM", ISBN = "123-456-789",Price=20 });
books.Add(new Book { Title = "Inside C#", ISBN = "123-356-d89",Price=100 });
books.Add(new Book { Title = "Linq", ISBN = "123-d56-d89", Price = 120 });

這樣的代碼沒(méi)少寫吧,實(shí)際上也許比這更復(fù)雜,有了C# 3.0我們睡覺(jué)都想笑:

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

IList<Book> books = new List<Book> {
     new Book { Title = "Inside COM", ISBN = "123-456-789",Price=20 },
     new Book { Title = "Inside C#", ISBN = "123-356-d89",Price=100 },
     new Book { Title = "Linq", ISBN = "123-d56-d89", Price = 120 }
};

還是像剛才一樣,我們來(lái)欣賞一下C#編譯器為我們生成的代碼:

復(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);

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

附加:

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

相關(guān)文章

  • 深入探討C#中的結(jié)構(gòu)struct

    深入探討C#中的結(jié)構(gòu)struct

    這篇文章詳細(xì)介紹了C#中的結(jié)構(gòu)struct,有需要的朋友可以參考一下
    2013-09-09
  • Winform實(shí)現(xiàn)鼠標(biāo)可穿透的窗體鏤空效果

    Winform實(shí)現(xiàn)鼠標(biāo)可穿透的窗體鏤空效果

    這篇文章主要介紹了Winform實(shí)現(xiàn)鼠標(biāo)可穿透的窗體鏤空效果的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-10-10
  • C#6.0中你可能不知道的新特性總結(jié)

    C#6.0中你可能不知道的新特性總結(jié)

    C# 6 已經(jīng)出來(lái)很久了,但最近發(fā)現(xiàn)真的有必要整理下,下面這篇文章主要給大家介紹了關(guān)于C#6.0中一些你可能不知道的新特性的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。
    2018-04-04
  • WPF中的導(dǎo)航框架概述

    WPF中的導(dǎo)航框架概述

    這篇文章介紹了WPF中的導(dǎo)航框架,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-06-06
  • C#中的引用類型以及特殊引用類型詳解

    C#中的引用類型以及特殊引用類型詳解

    本文詳細(xì)講解了C#中的引用類型以及特殊引用類型,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-07-07
  • C# TcpClient網(wǎng)絡(luò)編程傳輸文件的示例

    C# TcpClient網(wǎng)絡(luò)編程傳輸文件的示例

    這篇文章主要介紹了C# TcpClient網(wǎng)絡(luò)編程傳輸文件的示例,幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下
    2021-04-04
  • C#中的yield關(guān)鍵字的使用方法介紹

    C#中的yield關(guān)鍵字的使用方法介紹

    yield這個(gè)關(guān)鍵字是和迭代器掛鉤的,而且是與return一起以yield return的形式合用的,用來(lái)返回迭代器中的條目。
    2013-04-04
  • c# Newtonsoft 六個(gè)值得使用的特性(下)

    c# Newtonsoft 六個(gè)值得使用的特性(下)

    這篇文章主要介紹了c# Newtonsoft 六個(gè)值得使用的特性,文中示例代碼非常詳細(xì),幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-06-06
  • C# URL短地址壓縮算法及短網(wǎng)址原理解析

    C# URL短地址壓縮算法及短網(wǎng)址原理解析

    這篇文章主要介紹了C# URL短地址壓縮算法及短網(wǎng)址原理解析,本文重點(diǎn)給出了算法代碼,需要的朋友可以參考下
    2015-03-03
  • C# 如何實(shí)現(xiàn)Token

    C# 如何實(shí)現(xiàn)Token

    這篇文章主要介紹了C# 如何實(shí)現(xiàn)Token,幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下
    2021-03-03

最新評(píng)論

平顶山市| 玉树县| 乌兰浩特市| 清丰县| 启东市| 灵宝市| 化德县| 德钦县| 浏阳市| 玛多县| 海伦市| 车险| 清水河县| 桐庐县| 巨野县| 离岛区| 建阳市| 南岸区| 商洛市| 西畴县| 固原市| 凉城县| 额尔古纳市| 元江| 腾冲县| 油尖旺区| 巴青县| 高要市| 北票市| 当雄县| 桂东县| 玛纳斯县| 镇远县| 清流县| 佛坪县| 清新县| 克山县| 三台县| 北宁市| 东山县| 天峨县|