文档章节

深入理解C# 3.x的新特性(5):Object Initializer 和 Collection Initializer

ATBBE
 ATBBE
发布于 2016/06/28 15:15
字数 1124
阅读 3
收藏 0

深入理解C# 3.x的新特性系列自开篇以后,已经有两个月了。在前面的章节中,我们先后深入讨论了C# 3.x新引入的一些列新特性:Anomynous TypeExtension MethodLambda ExpressionAutomatically Implemented Property今天我们来讨论本系列的涉及的另外两个简单的Feature: Object Initializer Collection Initializer

一、           为什么要引入Object Initializer Collection Initializer

在创建一个具有较多属性的对象时,我们一定经常遇到这样的状况:为了尽量地使我们的Code更加简洁,我们试图调用一个适合的Constructor使得对象在创建过程中就可以为所需的属性进行初始化,但是往往我们找不到这样“完美”的Constructor都能够匹配我们需要进行初始化的属性列表。于是我们通常调用一个相对适合的Constructor创建我们需要的对象,对于没能在Constructor中初始化的Field或者Property,再一次对其进行赋值。现在我们有了一个好的办法有效地解决了这个问题,那就是Object Initializer

上面说的对于一个一般对象的创建和初始化,现在说说我们经常使用的实现了接口System.Collections.IEnumerableCollection的创建和初始化。对于这样的对象,我们一般先通过Constructor创建该对象,然后通过Add方法或者其他的方式将添加我们所需Element。现在我们可以通过Collection Initializer将这个两个过程合二为一。

接下来我们就来介绍如果使用Object InitializerCollection Initializer,以及他们背后的本质是什么:Compiler到底在编译的时候为我们做的什么。

二、           Object Initializer的使用和本质

Object Initializer的使用很简单:在通过new 关键字创建对象的时候,将所需的Field/Proeprty的复制置于Type name后的{}中。比如:

 

class Program
    
{
        
static void Main(string[] args)
        
{
            Vector v 
= new Vector { X = 1, Y = 2 };            
        }

    }


    
class Vector
    
{
        
public double X
        
{
            
get;
            
set;
        }


        
public double Y
        
{
            
get;
            
set;
        }

}

注:对于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来实现。对于上面这句简单的CodeVector v = new Vector { X = 1, Y = 2 }; ),通过编译,将会下面这个样子:

Vector  <> g__initLocal0  =   new  Vector();
<> g__initLocal0.X  =   1 ;
<> g__initLocal0.Y  =   2 ;
Vector v 
=   <> g__initLocal0;

通过对上面一段代码的分析,我们可以归纳出Compiler通过以下3个步骤实现Object Initializer   

  • 调用对应Class对应的Constructor创建一个临时对象。
  • 根据在{}的赋值语句对临时对象对应的Field/Property进行赋值。
  • 将这个临时对象赋值给你创建的对象。 
三、           Collection Initializer的使用与本质

Collection InitializerCollection对象的创建和对于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的实现有一个全面的了解:

List < string >   <> g__initLocal0  =   new  List < string > ();

<> g__initLocal0.Add( " Zhang San " );

<> g__initLocal0.Add( " Li Si " );

<> g__initLocal0.Add( " Wang Wu " );

IList
< string >  list  =   <> g__initLocal0;


Collection Initializer的实现和Object Initializer很类似:       
 
  • 调用对应ClassDefault Constructor(无参的)创建一个临时对象。
  • 根据在{}的赋值语句,通过调用Add方法添加相应的Element
  • 将这个临时对象赋值给你创建的对象。

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

本文转载自:http://www.cnblogs.com/artech/archive/2007/09/30/912166.html

ATBBE
粉丝 4
博文 530
码字总数 2825
作品 0
徐汇
私信 提问
C# 6.0 的新特性

本文的内容包括引入C#6.0中的新的语言特性有哪些. 还有已经被引入的代码名称为 “Roslyn”新编译器. 编译器是开放源码的,并且可以从 codeplex 网站的这个地址下载到源代码: https://roslyn...

oschina
2015/02/10
15.1K
65
tf.constant_initializer

class Constant(Initializer) | Initializer that generates tensors with constant values. | | The resulting tensor is populated with values of type , as | specified by arguments fo......

秦玉坤
2018/05/05
0
0
tf.zeros_initializer

class Zeros(Initializer) | Initializer that generates tensors initialized to 0. | | Method resolution order: | Zeros | Initializer | builtins.object | | Methods defined here: | ......

秦玉坤
2018/05/05
0
0
linq学习笔记(1):c#3.0新特性(2)

4. Object and Collection Initializers (对象和集合初始器) Object Initializer (对象初始器) ,顾名思义就是一种初始化对象的方式,这个“器”并非某个具体的类或者方法。 假设我们有一...

长平狐
2013/06/17
78
0
tf.truncated_normal_initializer

class TruncatedNormal(Initializer) | Initializer that generates a truncated normal distribution. | | These values are similar to values from a | except that values more than two......

秦玉坤
2018/05/05
0
0

没有更多内容

加载失败,请刷新页面

加载更多

只需一步,在Spring Boot中统一Restful API返回值格式与统一处理异常

统一返回值 在前后端分离大行其道的今天,有一个统一的返回值格式不仅能使我们的接口看起来更漂亮,而且还可以使前端可以统一处理很多东西,避免很多问题的产生。 比较通用的返回值格式如下:...

晓月寒丶
昨天
59
0
区块链应用到供应链上的好处和实际案例

区块链可以解决供应链中的很多问题,例如记录以及追踪产品。那么使用区块链应用到各产品供应链上到底有什么好处?猎头悬赏平台解优人才网小编给大家做个简单的分享: 使用区块链的最突出的优...

猎头悬赏平台
昨天
28
0
全世界到底有多少软件开发人员?

埃文斯数据公司(Evans Data Corporation) 2019 最新的统计数据(原文)显示,2018 年全球共有 2300 万软件开发人员,预计到 2019 年底这个数字将达到 2640万,到 2023 年达到 2770万。 而来自...

红薯
昨天
65
0
Go 语言基础—— 通道(channel)

通过通信来共享内存(Java是通过共享内存来通信的) 定义 func service() string {time.Sleep(time.Millisecond * 50)return "Done"}func AsyncService() chan string {retCh := mak......

刘一草
昨天
58
0
Apache Flink 零基础入门(一):基础概念解析

Apache Flink 的定义、架构及原理 Apache Flink 是一个分布式大数据处理引擎,可对有限数据流和无限数据流进行有状态或无状态的计算,能够部署在各种集群环境,对各种规模大小的数据进行快速...

Vincent-Duan
昨天
60
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部