深入理解C# 3.x的新特性(5):Object Initializer 和 Collectio
深入理解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",1)">"Wang Wu" }; 和分析Object Initializer的本质一样,我们之后看看通过Compiler变异后的Code是什么样子,就会对Collection Initializer的实现有一个全面的了解: List<>?List();
Collection Initializer的实现和Object Initializer很类似:??????? ?
C# 3.x相关内容: [原创]深入理解C# 3.x的新特性(1):Anonymous Type [原创]深入理解C# 3.x的新特性(2):Extension Method - Part I [原创]深入理解C# 3.x的新特性(2):Extension Method - Part II [原创]深入理解C# 3.x的新特性(3):从Delegate、Anonymous Method到Lambda Expression [原创]深入理解C# 3.x的新特性(4):Automatically Implemented Property [原创]深入理解C# 3.x的新特性(5):Object Initializer 和 Collection Initializer (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net-mvc – 从我的网页链接下载文件
- asp.net – Chrome浏览器不显示HTTP处理程序生成的图像
- mime-types – 在ASP.NET 5中使用MimeMapping(vNext)
- asp.net – 向实体框架添加其他属性4代码首先是CTP 5实体
- asp.net-mvc – 具有ASP.NET MVC的多语言网站
- asp.net-mvc – NHibernate – 懒惰地初始化一个角色集合
- asp.net-mvc – 如何动态添加到ASP.NET MVC RouteTable?
- asp.net-mvc – requestValidationMode =“2.0”实际上是做
- asp.net-core – 在ASP.NET Core中使用Entity Framework 6
- asp.net-mvc – 用于拆分日期时间字段的ASP.NET MVC 2自定义
- ASP.NET在嵌套在更新面板中的用户控件中注入java
- asp.net – 会话超时后重定向到登录页面
- asp.net-mvc – 如何在EditorTemplate中获取完全
- ASP.NET MVC5使用Area区域
- asp.net-mvc – MVC授权属性HttpUnauthorizedRes
- asp.net – IIS 7 UrlReferrer抛出异常
- asp.net-mvc – 禁用生产中的Glimpse和glimpse.a
- 在ASP.NET MVC中解码HTML 3
- asp.net-mvc – IoC Castle Windsor – 没有为此
- asp.net-mvc – 我可以从子部分视图访问父视图的