深入理解C# 3.x的新特性(5):Object Initializer 和 Collection Initializer-阿里云开发者社区

开发者社区> 行者武松> 正文

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

简介:
+关注继续查看

深入理解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

作者:蒋金楠
微信公众账号:大内老A
微博:www.weibo.com/artech
如果你想及时得到个人撰写文章以及著作的消息推送,或者想看看个人推荐的技术资料,可以扫描左边二维码(或者长按识别二维码)关注个人公众号(原来公众帐号蒋金楠的自媒体将会停用)。
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
【c#】6.0与7.0新特性介绍记录
c#发展史 引用地址:https://www.cnblogs.com/ShaYeBlog/p/3661424.html 6.0新特性 1.字符串拼接优化     语法格式:$”string {参数}”       解释:以$符号开头开始字符串,其中以{}来进行传参,可以多个参数累加     例如:var results = $"Hello {Name}"; 2.
1203 0
C++ 对引用的深入理解
观看了唐老师讲解的一节《第5课 - 引用的本质分析》感觉非常不错,有深度不废话,我喜欢~~~ 再此总结下,并且奉上视频下载地址~~~ 360网盘下载地址: https://yunpan.cn/cxXynI6sGbHJs      密码(4b1b) //----------------------------------------------正文----------------------------------------------   在C里并没引用这个语法,而在C++里具有这个语法。
776 0
[C#]6.0新特性浅谈
原文:[C#]6.0新特性浅谈 C#6.0出来也有很长一段时间了,虽然新的特性和语法趋于稳定,但是对于大多数程序猿来说,想在工作中用上C#6.0估计还得等上不短的一段时间。所以现在再来聊一聊新版本带来的新特性可能也还不算晚吧? 一、nameof关键字 这绝对是整个新版本最让我期待的内容,它给代码重构带来了巨大的便利。
738 0
+关注
行者武松
杀人者,打虎武松也。
17142
文章
2569
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载