当前位置: 首页 > 编程语言 > C# > 正文

C# 3.0特性 - 对象集合初始化器

时间:2010-12-03 博客园 横刀天笑

在写一些实体类的时候,我们往往在写构造方法的时候思考很长时间,除了 一个无参构造器外还在想需要写几个构造器呢?哪些参数是需要初始化的。现在 你再也不需要为这事烦恼了。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";