文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>3_对象和集合初始化器

3_对象和集合初始化器

时间:2011-03-27  来源:乱舞春秋

  首先声明一个类Person:  

Person
1         public class Person 
2 {
3 public string Name { get; set; }
4 public int Age{get;set;}
5 }

  初始化它并调用它:

Main
1         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代码和先初始化在赋值属性的做法相同。【{}里面出现的必须是共有的成员,字段或者属性】。

    集合初始化器:

Main
 1         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】要求的接口也可以。这是比较宽松一点的情 况下;

   可以发现集合初始化器和对象初始化器的共同点【都是编译器做的小技巧】。和以前的写法产生的“效果”没有任何区别,但是集合初始化器产生的每个对象名我们就不知道了【编译器按照它的规则产生相应的对象名】,这一点我们好像控制不了吧【我觉的是这么回事】,了解的解释下,先谢啦!

相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载