科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件C# 3.0新特征之创建和初始化集合对象

C# 3.0新特征之创建和初始化集合对象

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

C# 3.0中新的对象初始化器是一种简单的语法特征-借助于这种特征,对象的构建和初始化变得非常简单。

作者:朱先忠编译 来源:天极开发 2007年11月11日

关键字:

  • 评论
  • 分享微博
  • 分享邮件
三、 代码剖析

  让我们更细致地分析一下前面的C# 3.0代码:

var classes = new List<MyClass>
{
 new MyClass
 {
  nameofClass = "Science",
  studentNames = {"Laura", "George"}
 },
 new MyClass
 {
  nameofClass = "Commerce",
  studentNames = {"Bill", "Hillary"}
 }
};

  对于编译器来说,它具有与下面代码相同的效果:

var classes = new List<MyClass>();
var __c1 = new MyClass ();
__c1.nameofClass = "Science";
__c1.studentNames.Add("Laura");
__c1.studentNames.Add("George");
classes.Add(__c1);
var __c2 = new MyClass();
__c2.nameofClass = "Commerce";
__c2.studentNames.Add("Bill");
__c2.studentNames.Add("Hillary");
classes.Add(__c2);

  如果激活ILDASM并且打开了编译的二进制代码形式,那么你能够看到如图1类似的内容。

点击放大此图片
图1.示例代码片断的编译的二进制形式

  如果你双击在ILDASM中的Main结点,那么你会看到下列代码:

.method private hidebysig static void Main(string[] args) cil managed
{
 .entrypoint
 //代码大小 138 (0x8a)
 .maxstack 3
 .locals init ([0] class [mscorlib]System.Collections.Generic.List`1
 <class CollectionInitializer.Program/MyClass>
 classes,
 [1] class [mscorlib]System.Collections.Generic.List`1
 <class CollectionInitializer.Program/MyClass>
 '<tampa>f__0',
 [2] class CollectionInitializer.Program/MyClass
 '<tampa>f__1',
 [3] class CollectionInitializer.Program/MyClass
 '<tampa>f__2')
 IL_0000: nop
 IL_0001: nop
 IL_0002: newobj instance void class [mscorlib]System.Collections.
 Generic.List`1<class CollectionInitializer.
 Program/MyClass>::.ctor()
 IL_0007: stloc.1
 IL_0008: ldloc.1
 IL_0009: nop
 IL_000a: newobj instance void CollectionInitializer.
 Program/MyClass::.ctor()
 IL_000f: stloc.2
 IL_0010: ldloc.2
 IL_0011: ldstr "Science"
 IL_0016: stfld string CollectionInitializer.
 Program/MyClass::nameofClass
 IL_001b: nop
 IL_001c: ldloc.2
 IL_001d: ldfld class [mscorlib]System.Collections.Generic.List`1
 <string> CollectionInitializer.
 Program/MyClass::studentNames
 IL_0022: ldstr "Laura"
 IL_0027: callvirt instance void class [mscorlib]System.
 Collections.Generic.List`1<string>::Add(!0)
 IL_002c: nop
 IL_002d: ldloc.2
 IL_002e: ldfld class [mscorlib]System.Collections.Generic.List`1
 <string> CollectionInitializer.
 Program/MyClass::studentNames
 IL_0033: ldstr "George"
 IL_0038: callvirt instance void class [mscorlib]System.Collections.
 Generic.List`1<string>::Add(!0)
 IL_003d: nop
 IL_003e: nop
 IL_003f: ldloc.2
 IL_0040: nop
 IL_0041: callvirt instance void class [mscorlib]System.Collections.
 Generic.List`1<class CollectionInitializer.
 Program/MyClass>::Add(!0)
 IL_0046: nop
 IL_0047: ldloc.1
 IL_0048: nop
 IL_0049: newobj instance void CollectionInitializer.
 Program/MyClass::.ctor()
 IL_004e: stloc.3
 IL_004f: ldloc.3
 IL_0050: ldstr "Commerce"
 IL_0055: stfld string CollectionInitializer.
 Program/MyClass::nameofClass
 IL_005a: nop
 IL_005b: ldloc.3
 IL_005c: ldfld class [mscorlib]System.Collections.Generic.List`1
 <string> CollectionInitializer.
 Program/MyClass::studentNames
 IL_0061: ldstr "Bill"
 IL_0066: callvirt instance void class [mscorlib]System.Collections.
 Generic.List`1<string>::Add(!0)
 IL_006b: nop
 IL_006c: ldloc.3
 IL_006d: ldfld class [mscorlib]System.Collections.Generic.List`1
 <string> CollectionInitializer.
 Program/MyClass::studentNames
 IL_0072: ldstr "Hillary"
 IL_0077: callvirt instance void class [mscorlib]System.Collections.
 Generic.List`1<string>::Add(!0)
 IL_007c: nop
 IL_007d: nop
 IL_007e: ldloc.3
 IL_007f: nop
 IL_0080: callvirt instance void class [mscorlib]System.Collections.
 Generic.List`1<class CollectionInitializer.
 Program/MyClass>::Add(!0)
 IL_0085: nop
 IL_0086: ldloc.1
 IL_0087: nop
 IL_0088: stloc.0
 IL_0089: ret
} //Program::Main方法结束

  四、 小结

  从前面的一些代码片断中你可以看到,C# 3.0在语法方面迈出了很大的一步。

  集合初始化器,作为C# 3.0新引入的特征之一,提供了一种新的语法来初始化集合对象。这种简单的语法把集合对象的创建和初始化结合到一个步骤中。

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章