2013-03-27 27 views
4

我找到了一個關於在類內使用List的代碼示例。有些代碼我不明白。名稱和說明字段在列表定義中有值,但是相冊字段沒有值。(列表<T>在類裏面使用

new genre { Name = "Rock" , Description = "Rock music", Album?? }

)。爲什麼?

public class Genre 
{ 
    public string Name { get; set; } 
    public string Description { get; set; } 
    public List<Album> Albums { get; set; } 
} 

public class Album 
{ 
    public string Title { get; set; } 
    public decimal Price { get; set; } 
    public Genre Genre { get; set; } 
} 

var genre = new List<Genre> 
{ 
    new genre { Name = "Rock" , Description = "Rock music" }, 
    new genre { Name = "Classic" , Description = "Middle ages music" } 
}; 

new List<Album> 
{ 
    new Album { Title = "Queensrÿche", Price = 8.99M, Genre = genre.Single(g => g.Name == "Rock") }, 
    new Album { Title = "Chopin", Price = 8.99M, Genre = genre.Single(g => g.Name == "Classic") } 
}; 
+0

哪部分你不明白? Name和Description值被設置,而'Albums'不是。它和'genre.Name =「Rock」一樣。 genre.Description =「搖滾音樂」;'沒有'genre.Albums =任何'。 – David 2013-03-27 13:46:36

回答

13

該C#語法被稱爲Object and Collection initializers

這裏是documentation

該語法允許您設置在對象或集合初始化期間有權訪問的屬性。

2

因爲編碼器不想設置它的值。如果你想添加一個聲明到最後Album = new List()。你不需要設置所有的屬性。

2

正如其他人所說的,代碼示例使用的是Object and Collection Initializers。對於集合,初始化程序調用集合的構造函數,然後爲大括號內列出的每個元素調用.Add()函數。對於對象,初始化程序調用該對象的構造函數,然後爲您指定的任何屬性設置值。

對象和集合初始化器實際上是在temp變量中創建對象或集合,然後將結果賦給變量。這可以確保您獲得全有或全無的結果(即,如果您在初始化過程中從另一個線程訪問它時無法獲得部分初始化值)。

var temp_list = new List<Genre>(); 
// new genre { Name = "Rock" , Description = "Rock music" } 
var temp_genre_1 = new Genre(); 
temp_genre_1.Name = "Rock"; 
temp_genre_1.Description = "Rock music"; 
temp_list.Add(temp_genre_1); 
// new genre { Name = "Classic" , Description = "Middle ages music" } 
var temp_genre_2 = new Genre(); 
temp_genre_2.Name = "Classic"; 
temp_genre_2.Description = "Middle ages music"; 
temp_list.Add(temp_genre_2); 
// set genre to the result of your Collection Initializer 
var genre = temp_list; 

因爲這個代碼沒有明確設置類型的Album屬性的值,它被設置爲您Genre類中指定(默認值是空的:初始化代碼可以如下改寫參考類型)。