后来我发现我是在debug模式下编译的换到release模式下变成了这样
Book<>g__initLocal
=newBook();
<>g__initLocalTitle=InsideCOM;
<>g__initLocalISBN=;
被优化了上面介绍的就是对象初始化器了那什么是集合初始化器呢?
IList<Book>books=newList<Book>();
//这里就使用了对象初始化器学以致用吧
booksAdd(newBook{Title=InsideCOMISBN=Price=});
booksAdd(newBook{Title=InsideC#ISBN=dPrice=});
booksAdd(newBook{Title=LinqISBN=ddPrice=});
这样的代码没少写吧实际上也许比这更复杂有了C# 我们睡觉都想笑
IList<Book>books=newList<Book>{
newBook{Title=InsideCOMISBN=Price=}
newBook{Title=InsideC#ISBN=dPrice=}
newBook{Title=LinqISBN=ddPrice=}
};
还是像刚才一样我们来欣赏一下C#编译器为我们生成的代码
List<Book><>g__initLocal=newList<Book>();
Book<>g__initLocal=newBook();
<>g__initLocalTitle=InsideCOM;
<>g__initLocalISBN=;
<>g__initLocalPrice=f;
<>g__initLocalAdd(<>g__initLocal);
Book<>g__initLocal=newBook();
<>g__initLocalTitle=InsideC#;
<>g__initLocalISBN=d;
<>g__initLocalPrice=f;
<>g__initLocalAdd(<>g__initLocal);
Book<>g__initLocal=newBook();
<>g__initLocalTitle=Linq;
<>g__initLocalISBN=dd;
<>g__initLocalPrice=f;
<>g__initLocalAdd(<>g__initLocal);
从上面的代码来看编译器自动的调用了List的无参构造方法然后实例化一个个的Book再一个个的Add进去和我们原来的做法没有什么不同但是这是编译器为我们做的所以简省了我们很多的编码工作
对象集合初始化器就算介绍完了有人也许会说不就是个syntx sugar么有什么是的确实是个语法糖在编译器发展早期编译器科学家门一直在想方设法的优化编译器生成的代码这个时候编译器做的主要是对机器优化因为那个时候机器的时间非常宝贵机器运算速度也不快今天我们有了足够好的机器了(但并不是说我们可以不关注性能的编写程序)而且作为编写软件的人来说比机器的时间宝贵得多所以今天的编译器也在向人优化了从编程语言的发展之路来讲今天的编程语言比昨天的语言更高级也更人性化了我们只要编写更少的代码更符合人的思维的代码而只要关注我们值的关注的地方体力活儿就交给编译器吧
附加
刚开始想想这对象集合初始化器也许就一鸡肋没啥用不就减少一点点代码么像这种简单的初始化工作大部分代码生成器都可以来干后来在研究匿名类型的时候突然发现如果没有这个对象初始化器匿名类型是不是要复杂一些?或者就是难以实现?
var test = new{Key=testValue=test};如果没有对象初始化器匿名类型该怎么办?
[] []