[C#3] 3-对象和集合初始化器

简介: 1.对象初始化器 首先声明一个类Person: public class Person { public string Name { get; set; } public int Age { get; set; } } 初始化它并调用它: static v...

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.总结

可以发现集合初始化器和对象初始化器的共同点是它们都是编译器做的技巧。 和以前的写法产生的效果没有任何本质区别,但是集合初始化器产生的每个对象名我们就不知道了[编译器按照它的规则产生相应的对象名,我们无法直接引用]。

作者: Blackheart
目录
相关文章
|
3月前
|
Java C#
C# 面向对象编程解析:优势、类和对象、类成员详解
OOP代表面向对象编程。 过程式编程涉及编写执行数据操作的过程或方法,而面向对象编程涉及创建包含数据和方法的对象。 面向对象编程相对于过程式编程具有几个优势: OOP执行速度更快,更容易执行 OOP为程序提供了清晰的结构 OOP有助于保持C#代码DRY("不要重复自己"),并使代码更易于维护、修改和调试 OOP使得能够创建完全可重用的应用程序,编写更少的代码并减少开发时间 提示:"不要重复自己"(DRY)原则是有关减少代码重复的原则。应该提取出应用程序中常见的代码,并将其放置在单一位置并重复使用,而不是重复编写。
51 0
|
3月前
|
C# 开发者
C# 9.0中的模块初始化器:程序启动的新控制点
【1月更文挑战第14天】本文介绍了C# 9.0中引入的新特性——模块初始化器(Module initializers)。模块初始化器允许开发者在程序集加载时执行特定代码,为类型初始化提供了更细粒度的控制。文章详细阐述了模块初始化器的语法、用途以及与传统类型初始化器的区别,并通过示例代码展示了如何在实际项目中应用这一新特性。
|
3月前
|
SQL 开发框架 .NET
C#进阶-LINQ实现对集合的增删改查
本篇演示了LINQ在日常开发中的常用操作,实现结果集的增删改查。目前LINQ支持两种语法,我会在每个案例前先用大家熟知的SQL语句表达,再在后面用C#的两种LINQ语法分别实现。LINQ语法第一次接触难免感到陌生,最好的学习方式就是在项目中多去使用,相信会有很多感悟。
38 0
|
29天前
|
存储 SQL C#
C# 读取二维数组集合输出到Word预设表格
C# 读取二维数组集合输出到Word预设表格
|
1月前
|
自然语言处理 C# 数据安全/隐私保护
50.c#:string类初始化
50.c#:string类初始化
12 1
|
1月前
|
存储 安全 Java
34.C#:listT泛型集合
34.C#:listT泛型集合
17 1
|
1月前
|
存储 C#
33.c#:hashtable集合
33.c#:hashtable集合
15 1
|
1月前
|
存储 安全 Java
32.C#:ArrayList集合
32.C#:ArrayList集合
16 1
|
1月前
|
存储 C#
C#对象和类
C#对象和类
15 0
|
1月前
|
开发框架 安全 .NET
C# .NET面试系列三:集合、异常、泛型、LINQ、委托、EF!
<h2>集合、异常、泛型、LINQ、委托、EF! #### 1. IList 接口与 List 的区别是什么? IList 接口和 List 类是C#中集合的两个相关但不同的概念。下面是它们的主要区别: <b>IList 接口</b> IList 接口是C#中定义的一个泛型接口,位于 System.Collections 命名空间。它派生自 ICollection 接口,定义了一个可以通过索引访问的有序集合。 ```c# IList 接口包含一系列索引化的属性和方法,允许按索引访问、插入、移除元素等。 由于是接口,它只定义了成员的契约,而不提供具体的实现。类似于 IEnumera
156 2