在类</t>中列出<t>

时间:2013-03-27 13:42:32

标签: c# list class generic-list

我找到了一个关于在类中使用List的代码示例。有些代码我不理解.Name和Description字段在List defination中有值,但Album字段没有值。(

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

4 个答案:

答案 0 :(得分:13)

此C#语法称为Object and Collection initializers

这是documentation

此语法允许您设置在初始化对象或集合期间有权访问的属性。

答案 1 :(得分:2)

这些是Object and Collection Initializers,用于快速初始化属性。您不需要初始化所有属性,只需要您需要的属性。

答案 2 :(得分:2)

因为编码器不想设置它的值。如果要在末尾添加一个语句Album = new List()。您无需设置所有属性。

答案 3 :(得分:2)

正如其他人所说,代码示例正在使用Object and Collection Initializers。对于集合,初始化程序调用集合的构造函数,然后为大括号内列出的每个元素调用.Add()函数。对于Objects,Initializer调用对象的构造函数,然后为您指定的任何属性设置值。

Object和Collection Initializers实际上在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类中指定的默认值(对于引用类型为null)。 / p>