程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#特征-對象聚集初始化器引見

C#特征-對象聚集初始化器引見

編輯:C#入門知識

C#特征-對象聚集初始化器引見。本站提示廣大學習愛好者:(C#特征-對象聚集初始化器引見)文章只能為提供參考,不一定能成為您想要的結果。以下是C#特征-對象聚集初始化器引見正文


C# 3.0為你供給了對象聚集初始化器:

/// <summary>
/// 圖書類
/// </summary>
public class Book
{
  /// <summary>
  /// 圖書稱號
  /// </summary>
  public string Title { get; set; }
  /// <summary>
  /// 單價
  /// </summary>
  public float Price { get; set; }
  /// <summary>
  /// 作者
  /// </summary>
  public string Author { get; set; }
  /// <summary>
  /// ISBN號
  /// </summary>
  public string ISBN { get; set; }
}
//對象初始化器
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";

被優化了。下面引見的就是對象初始化器了,那甚麼是聚集初始化器呢?


IList<Book> books = new List<Book>();
//這裡就應用了對象初始化器,學乃至用吧
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 });

如許的代碼沒少寫吧,現實上或許比這更龐雜,有了C# 3.0我們睡覺都想笑:


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

照樣像適才一樣,我們來觀賞一下C#編譯器為我們生成的代碼:


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

從下面的代碼來看,編譯器主動的挪用了List的無參結構辦法,然後實例化一個個的Book,再一個個的Add出來,和我們本來的做法沒有甚麼分歧,然則,這是編譯器為我們做的,所以簡省了我們許多的編碼任務。
對象聚集初始化器就算引見完了。有人或許會說,不就是個syntx sugar麼,有甚麼。是的,確切是個語法糖。在編譯器成長晚期,編譯器迷信家門一向在千方百計的優化編譯器生成的代碼,這個時刻,編譯器做的重要是對機械優化,由於誰人時刻機械的時光異常名貴,機械運算速度也不快,明天我們有了足夠好的機械了(但其實不是說我們可以不存眷機能的編寫法式),並且作為編寫軟件的人來講,比機械的時光名貴很多,所以明天的編譯器也在向人優化了,從編程說話的成長之路來說,明天的編程說話比昨天的說話更高等,也更人道化了,我們只需編寫更少的代碼,更相符人的思想的代碼,而只需存眷我們值的存眷的處所。膂力活兒就交給編譯器吧。

附加:

剛開端想一想這對象聚集初始化器或許就一雞肋,沒啥用,不就削減一點點代碼麼,像這類簡略的初始化任務,年夜部門代碼生成器都可以來干。後來在研討匿名類型的時刻忽然發明,假如沒有這個對象初始化器,匿名類型是否是要龐雜一些?或許就是難以完成?
var test = new{Key="test",Value="test"};假如沒有對象初始化器,匿名類型該怎樣辦?

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved