对象/集合初始化器

1. 对象初始化器

对象的初始化工作一般都是在其构造函数中进行的,但是有些时候,需要我们手动的来进行一些赋值操作,比如

            //传统的方式
            Person p1 = new Person();
            p1.Name = "小李";
            p1.Age = 23;

            //对象初始化器
            Person p2 = new Person() {Name="小明",Age=26 };

反编译代码:

我们可以看出出来,对象初始化器的作用:创建一个person类型的临时对象<>g_initLocal0,然后把该临时对象赋值给我们已经创建的对象p2,因此CLR底层并没 有为对对象初始化器做任何附加操作,这些工作都是c#编译器完成了。

从IL代码中,我也可以看出来,这两种初始化方式最终都编译成相同的IL代码,只不过使用对象初始化器,编译器创建了一个临时的对象

2 集合初始化器

            List<Person> list1 = new List<Person>();
            list1.Add(new Person() { Name = "小李", Age = 26 });
            list1.Add(new Person() { Name = "小方", Age = 23 });

            List<Person> list2 = new List<Person>() {
             new Person (){ Name="小涛",Age=24},
             new Person (){ Name="小王",Age=21}
            };

反编译后的结果可知,编译后的IL也是编译器生成临时集合对象,然后调用其Add方法加入集合元素,最后将临时对象赋值给我们创建的对象

时间: 2025-01-10 14:44:55

对象/集合初始化器的相关文章

C#高级知识点概要(3) - 特性、自动属性、对象集合初始化器、扩展方法、Lambda表达式和Linq查询

1.特性(Attributes) 特性(Attributes),MSDN的定义是:公共语言运行时允许你添加类似关键字的描述声明,叫做attributes, 它对程序中的元素进行标注,如类型.字段.方法和属性等.Attributes和Microsoft .NET Framework文件的元数据保存在一起,可以用来向运行时描述你的代码,或者在程序运行的时候影响应用程序的行为.例如,在一个方法前标注[Obsolete]特性,则调用该方法时VS则会提示该方法已过期的警告,如下图: 又如,在.Net Re

C#4.0语法糖之第三篇: 参数默认值和命名参数 对象初始化器与集合初始化器

今天继续写上一篇文章C#4.0语法糖之第二篇,在开始今天的文章之前感谢各位园友的支持,通过昨天写的文章,今天有很多园友们也提出了文章中的一些不足,再次感谢这些关心我的园友,在以后些文章的过程中不断的完善以及自我提高,给各位园友们带来更好,更高效的文章. 废话就说到这里,下面正式进入我们的今天的C#4.0语法糖,今天给大家分享一下参数默认值.命名参数.对象初始化器和集合初始化器. 参数默认值和命名参数:方法的可选参数是.net 4.0最新提出的新的功能,对应简单的重载可以使用可选参数和命名参数混合

隐式类型、对象集合初始化、匿名类型

隐式类型和对象集合初始化器是在C# 3.0中引入的. 1 隐式类型 var关键字,主要还是编译器根据变量的值来推断其类型. 1.1隐式类型的局部变量 1 class Program 2 { 3 static void Main(string[] args) 4 { 5 var stringvariable="learning hard"; 6 stringvariable=2; 7 } 8 } 其实当你把鼠标放在var上面的时候,还是可以看到其类型的. 使用隐式类型时有一些限制,包括一

C#中的自动属性、隐式类型var、对象初始化器与集合初始化器、扩展方法

1.自动属性(Auto-Implemented Properties) //以前的写法 .net2.0 private string _userName; public string UserName { get { return _userName; } set { _userName= value; } } //现在 只适合3.5以上 public string_userName {get;set;} 2.隐式类型var 它是在编译已经能确定变量的类型,是根据后面的值自动推断类型,编译时把推

对象初始化器和集合初始化器

C#语言开发团队在C# 3.0中增加了一个名为"对象初始化器"(object initializer)的特性 ,它能初始化一个对象中的所有允许访问的字段和属性.别以为这和你没关系.我们先来看一个你非常熟悉不过的代码. User operator=new User(); operator.ID=1; operator.Pwd=1; operator.Name="操作员" 以前是不是大家都像上面一样写代码.现在c#3.0以后我们有了更简单的方法. <pre nam

集合初始化器、类初始化器、匿名类

1:集合初始化器集合添加数据的两种方法第一种方法:第二种方法:利用集合初始化器2:对象初始化器1.当一个类中有构造方法,我们可以用构造方法来进行实例化一个对象2.当一个类中没有任何的构造方法,这个时候我们就可以利用对象初始化器进行实例化一个对象3:匿名类 原文地址:http://blog.51cto.com/11871779/2087253

自定义集合初始化器

对int类型集合初始化,这样写: static void Main(string[] args) { var list = new List<int> {0, 1}; foreach (var item in list) { Console.WriteLine(item); } Console.ReadKey(); } 对键值对集合初始化,这样写: static void Main(string[] args) { var dic = new Dictionary<string, str

.NET中那些所谓的新语法之一:自动属性、隐式类型、命名参数与自动初始化器

开篇:在日常的.NET开发学习中,我们往往会接触到一些较新的语法,它们相对以前的老语法相比,做了很多的改进,简化了很多繁杂的代码格式,也大大减少了我们这些菜鸟码农的代码量.但是,在开心欢乐之余,我们也不禁地对编译器内部到底为我们做了哪些事儿而感到好奇?于是,我们就借助反编译神器,去看看编译器到底做了啥事!其实本篇中很多都不算新语法,对于很多人来说可能都是接触了很久了,这里主要是针对.NET的老版本来说,是一个“相对”的新语法. /* 新语法索引 */ 1.自动属性 Auto-Implemente

[C#详解] (1) 自动属性、初始化器、扩展方法

代码下载:点我下载 目录 前言 属性与自动属性 属性 自动属性 初始化器 对象初始化器 集合初始化器 扩展方法 无参数扩展方法 带参数扩展方法 结尾 前言 首先祝大家2015新年快乐! 新的一年,新的开始.来博客园安家已经快两个月了.每天看博客.写博客.评论.回答博问已经渐渐养成了一种习惯.可以很明显的感觉到泡在博客园里真的可以学到很多,不论是技术文章的还是一些记叙经历.抒发感想的随笔,都让我从各个方面受益良多.不知道大家是否和我一样,就是感觉博客园有一种特殊的魔力,让你没事就想上去看一眼,看上