[C#3] 3-对象和集合初始化器
时间:2022-04-23
本文章向大家介绍[C#3] 3-对象和集合初始化器,主要内容包括1.对象初始化器、2.集合初始化器、3.总结、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。
1.对象初始化器
首先声明一个类Person:
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
初始化它并调用它:
static void Main()
{
Person person = new Person { Name = "乱舞春秋", Age = 22 };
Console.WriteLine("姓名:{0}",person.Name);
Console.WriteLine("年龄:{0}", person.Age.ToString());
}
这是编译器的一个小技巧:IL代码显示它和一般的初始化操作效果完全相同。{}里面出现的必须是共有的成员,字段或者属性。 可以支持对象初始化器的类型要满足一个条件是要有一个公有的无参的构造函数。
2.集合初始化器
static void Main()
{
List<Person> personList = new List<Person> {
new Person { Name = "乱舞", Age = 22 },
new Person { Name = "春秋", Age = 21 } };
for (int i = 0; i < personList.Count; i++)
{
Console.Write(personList[i].Name+"--");
Console.WriteLine(personList[i].Age);
Console.WriteLine("=====================");
}
}
这个有必要看看IL代码了,如下:
1 .method private hidebysig static void Main() cil managed
2 {
3 .entrypoint
4 // 代码大小 166 (0xa6)
5 .maxstack 3
6 .locals init ([0] class [mscorlib]System.Collections.Generic.List`1<class ConsoleApplication1.Person> personList,
7 [1] int32 i,
8 [2] class [mscorlib]System.Collections.Generic.List`1<class ConsoleApplication1.Person> '<>g__initLocal0',
9 [3] class ConsoleApplication1.Person '<>g__initLocal1',
10 [4] class ConsoleApplication1.Person '<>g__initLocal2',
11 [5] bool CS$4$0000)
12 IL_0000: nop
13 IL_0001: newobj instance void class [mscorlib]
14 System.Collections.Generic.List`1<class ConsoleApplication1.Person>::.ctor()
15 IL_0006: stloc.2
16 IL_0007: ldloc.2
17 IL_0008: newobj instance void ConsoleApplication1.Person::.ctor()
18 IL_000d: stloc.3
19 IL_000e: ldloc.3
20 IL_000f: ldstr bytearray (71 4E 1E 82 ) // qN..
21 //对象初始化器_Person::set_Name
22 IL_0014: callvirt instance void ConsoleApplication1.Person::set_Name(string)
23 IL_0019: nop
24 IL_001a: ldloc.3
25 IL_001b: ldc.i4.s 22
26 //对象初始化器_Person::set_Age
27 IL_001d: callvirt instance void ConsoleApplication1.Person::set_Age(int32)
28 IL_0022: nop
29 IL_0023: ldloc.3
30 //调用List<T>的Add方法添加元素
31 IL_0024: callvirt instance void class
32 ·[mscorlib]System.Collections.Generic.List`1<class ConsoleApplication1.Person>::Add(!0)
33 //省略。。。
34 } // end of method Program::Main
从32行看得出这里主要就是这个Add方法了,以前向List中添加元素是手动调用这个方法,现在是编译器帮我们调用。集合初始化器想要编译成功,需要满足几个基本条件:
1应该实现了Icollection或者泛型版Icollection<T>接口,这样保证集合支持一个Add方法,这是理想情况下;
2实现了IEnumerable或者泛型版IEnumerable<T>接口的类型上有一个或者多个Add方法,即使没有实现1要求的接口也可以。 这是比较宽松一点的情况下;
3.总结
可以发现集合初始化器和对象初始化器的共同点是它们都是编译器做的技巧。 和以前的写法产生的效果没有任何本质区别,但是集合初始化器产生的每个对象名我们就不知道了[编译器按照它的规则产生相应的对象名,我们无法直接引用]。
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 完美解决JavaScript的深浅拷贝
- 来,我们在重新说下,线程状态?
- [不定时一题]LeetCode两数相加
- [不定时一题]Leetcode两数之和
- 深入浅出mongodb(一)
- 深入浅出mongodb(二)
- 算法——快速排序
- 算法——二分查找算法
- 第一篇——Ubuntu 安装 Elasticsearch
- Ubuntu安装Redis(手动编译)
- 第五节:Activiti6.0——流程定义相关API
- 第四节:Activiti6.0——使用zip、bpmn代码生成流程图的资源部署以及资源的查询
- 第三节:Activiti6.0——Query的API使用
- 第二节:Activiti6.0配置文件的读取
- SpringMvc配置文件上传