3_对象和集合初始化器
时间:2011-03-27 来源:乱舞春秋
首先声明一个类Person:
Person1 public class Person
2 {
3 public string Name { get; set; }
4 public int Age{get;set;}
5 }
初始化它并调用它:
Main1 static void Main()
2 {
3 Person person = new Person { Name = "乱舞春秋", Age = 22 };
4 Console.WriteLine("姓名:{0}",person.Name);
5 Console.WriteLine("年龄:{0}", person.Age.ToString());
6 }
这也是编译器的一个小技巧:IL代码和先初始化在赋值属性的做法相同。【{}里面出现的必须是共有的成员,字段或者属性】。
集合初始化器:
Main1 static void Main()
2 {
3 List<Person> personList = new List<Person> {
4 new Person { Name = "乱舞", Age = 22 },
5 new Person { Name = "春秋", Age = 21 } };
6 for (int i = 0; i < personList.Count; i++)
7 {
8 Console.Write(personList[i].Name+"--");
9 Console.WriteLine(personList[i].Age);
10 Console.WriteLine("=====================");
11 }
12 }
这个有必要看看IL代码了,如下:
Main_IL.method private hidebysig static void Main() cil managed
{
.entrypoint
// 代码大小 166 (0xa6)
.maxstack 3
.locals init ([0] class [mscorlib]System.Collections.Generic.List`1<class ConsoleApplication1.Person> personList,
[1] int32 i,
[2] class [mscorlib]System.Collections.Generic.List`1<class ConsoleApplication1.Person> '<>g__initLocal0',
[3] class ConsoleApplication1.Person '<>g__initLocal1',
[4] class ConsoleApplication1.Person '<>g__initLocal2',
[5] bool CS$4$0000)
IL_0000: nop
IL_0001: newobj instance void class [mscorlib]System.Collections.Generic.List`1<class ConsoleApplication1.Person>::.ctor()
IL_0006: stloc.2
IL_0007: ldloc.2
IL_0008: newobj instance void ConsoleApplication1.Person::.ctor()
IL_000d: stloc.3
IL_000e: ldloc.3
IL_000f: ldstr bytearray (71 4E 1E 82 ) // qN..
//对象初始化器_Person::set_Name
IL_0014: callvirt instance void ConsoleApplication1.Person::set_Name(string)
IL_0019: nop
IL_001a: ldloc.3
IL_001b: ldc.i4.s 22
//对象初始化器_Person::set_Age
IL_001d: callvirt instance void ConsoleApplication1.Person::set_Age(int32)
IL_0022: nop
IL_0023: ldloc.3
//调用List<T>的Add方法添加元素
IL_0024: callvirt instance void class
[mscorlib]System.Collections.Generic.List`1<class ConsoleApplication1.Person>::Add(!0)
//省略。。。
} // end of method Program::Main
主要就是这个Add方法了,以前向List中添加元素是手动调用这个方法,现在是编译器帮我们调用。
集合初始化器想要编译成功,需要满足几个基本条件:
1,应该实现了Icollection或者泛型版Icollection<T>接口,这样保证集合支持一个Add方法,这是理想情况下;
2,实现了IEnumerable或者泛型版IEnumerable<T>接口的类型上有一个或者多个Add方法,即使没有实现【1】要求的接口也可以。这是比较宽松一点的情 况下;
可以发现集合初始化器和对象初始化器的共同点【都是编译器做的小技巧】。和以前的写法产生的“效果”没有任何区别,但是集合初始化器产生的每个对象名我们就不知道了【编译器按照它的规则产生相应的对象名】,这一点我们好像控制不了吧【我觉的是这么回事】,了解的解释下,先谢啦!
相关阅读 更多 +