您的位置:知识库 » 数据库

不能不说的C#特性-对象集合初始化器

作者: 横刀天笑  来源: 博客园  发布时间: 2008-09-23 12:14  阅读: 18781 次  推荐: 4   原文链接   [收藏]  
[1] 不能不说的C#特性-对象集合初始化器
[2] 不能不说的C#特性-对象集合初始化器

系列文章导航:

走进Linq--Linq横空出世篇

走进Linq-辉煌的背后

走进Linq-Linq大观园

不能不说的C#特性-对象集合初始化器

不能不说的C#特性-匿名类型与隐式类型局部变量

不能不说的C#特性-扩展方法

不能不说的C#特性-匿名方法和Lambda表达式

不能不说的C#特性-迭代器(上)及一些研究过程中的副产品

不能不说的C#特性-迭代器(下),yield以及流的延迟计算

走进Linq-Linq to Objects(上)基础篇

走进Linq-Linq to Objects(下)实例篇

走进Linq-Linq to SQL感性认识篇

走进Linq-Linq to SQL How do I(1)

走进Linq-Linq to SQL How do I(2)

走进Linq-Linq to SQL How do I(3)

走进Linq-How do I(4)拾遗补零篇第一节

走进Linq-Linq to SQL源代码赏析 Table的获取过程

走进Linq-Linq to SQL源代码赏析之Provider的初始化

走进Linq-Linq to SQL源代码赏析,通过Linq to SQL看Linq


被优化了。上面介绍的就是对象初始化器了,那什么是集合初始化器呢?

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页]
4
2
标签:linq C# 对象 集合

数据库热门文章

    数据库最新文章

      最新新闻

        热门新闻