Develop every application as an art using the most suitable technologies!
2007.10-2008.9: Solutions Architect
2008.10-2009.9: Connected System
本blog原创文字(标明[原创]字样)只代表本人某一时间内的观点或结论,与本人所在公司没有任何关系。第三方若用于商业用途的转载,须取得本人授权。一般的引用、转载请标明出处!
深入理解C# 3.x的新特性系列自开篇以后,已经有两个月了。在前面的章节中,我们先后深入讨论了C# 3.x新引入的一些列新特性:Anomynous Type、Extension Method、Lambda Expression、Automatically Implemented Property,今天我们来讨论本系列的涉及的另外两个简单的Feature: Object Initializer 和 Collection Initializer。
一、 为什么要引入Object Initializer 和 Collection Initializer
在创建一个具有较多属性的对象时,我们一定经常遇到这样的状况:为了尽量地使我们的Code更加简洁,我们试图调用一个适合的Constructor使得对象在创建过程中就可以为所需的属性进行初始化,但是往往我们找不到这样“完美”的Constructor都能够匹配我们需要进行初始化的属性列表。于是我们通常调用一个相对适合的Constructor创建我们需要的对象,对于没能在Constructor中初始化的Field或者Property,再一次对其进行赋值。现在我们有了一个好的办法有效地解决了这个问题,那就是Object Initializer。
上面说的对于一个一般对象的创建和初始化,现在说说我们经常使用的实现了接口System.Collections.IEnumerable的Collection的创建和初始化。对于这样的对象,我们一般先通过Constructor创建该对象,然后通过Add方法或者其他的方式将添加我们所需Element。现在我们可以通过Collection Initializer将这个两个过程合二为一。
接下来我们就来介绍如果使用Object Initializer和Collection Initializer,以及他们背后的本质是什么:Compiler到底在编译的时候为我们做的什么。
二、 Object Initializer的使用和本质
Object Initializer的使用很简单:在通过new 关键字创建对象的时候,将所需的Field/Proeprty的复制置于Type name后的{}中。比如:
注:对于Vector的定义,还使用到了C#3.x的另一个新的特性:Automatically Implemented Proeprty。
在上面的例子中,我们通过一句代码(Vector v = new Vector { X = 1, Y = 2 }; )实现对Vector对象的创建和对X&Y的初始化。
在本系列开始的时候,我就一直在强调: C# 3.x这些Feature仅仅是基于一种Programming Language层面的新特性而已,这些特性通过Programming Language对应的Compiler在编译过程添加一些辅助的Code来实现。对于上面这句简单的Code(Vector v = new Vector { X = 1, Y = 2 }; ),通过编译,将会下面这个样子:
通过对上面一段代码的分析,我们可以归纳出Compiler通过以下3个步骤实现Object Initializer。
Collection Initializer将Collection对象的创建和对于Element的初始化合二为一,他的使用和Object Initializer很类似:将Element List直接加个Class name后的{}中:
IList<string> list = new List<string> { "Zhang San", "Li Si", "Wang Wu" };
和分析Object Initializer的本质一样,我们之后看看通过Compiler变异后的Code是什么样子,就会对Collection Initializer的实现有一个全面的了解:
posted on 2007-09-30 17:17 Artech 阅读(3282) 评论(12) 编辑 收藏 网摘 所属分类: O. C#, E. LINQ
不错! Artech兄紧跟技术发展,佩服! 回复 引用 查看
真的很好!这篇文章很好、这个系列很好、你做的很好!Good! 回复 引用 查看
发现一个bug:“下面的Code是不*同*通过编译的:”:) 回复 引用 查看
@Adrian H. 谢谢提醒,已经改过来了^_^ 回复 引用 查看
@张子阳. @Zhuang miao 谢谢关注! 回复 引用 查看
有個錯誤的地方: 只有對於得Class具有一個Default Constructor..... 在沒有default constructor的情況下,Object Initializer 一樣是可以運作的. 例如: class ClassA{ public string Str; public int C; public ClassA(int v){ C = v; } } ClassA a = new ClassA(12){ Str = "A String" }; 對於Constructor的限制與以往相同:就是編譯器要找的到匹配的建構子.只是對於public 成員可以額外使用Object Initializer語法. 回复 引用
@臉皮軟QQ我把这个给忽略了,谢谢提醒^_^ 回复 引用 查看
不错!!! 回复 引用
太好,今天终于看完了“[原创]深入理解C# 3.x的新特性”系列。谢谢。 回复 引用 查看
花了两天看了楼主的这个系列文章,谢谢楼主的指点! 回复 引用 查看
昵称: [登录] [注册]
主页:
邮箱:(仅博主可见)
验证码: 看不清,换一个
评论内容:
登录 注册
[使用Ctrl+Enter键快速提交评论]
Powered by: 博客园 Copyright © Artech