国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 綜合 > 正文

C# 3.0新特征之創建和初始化集合對象

2024-07-21 02:28:55
字體:
來源:轉載
供稿:網友

  一、 引言

  c# 3.0中新的對象初始化器是一種簡單的語法特征-借助于這種特征,對象的構建和初始化變得非常簡單。假定你有一個類student,它看起來有如下樣子:

public class student{
 public string firstname;
 public string lastname;
}

  那么,你可以使用對象初始化器來創建這個類的一個對象,如下所示:

var student1 = new student{firstname = "bruce", lastname = "willis"};

  c# 3.0中新的集合初始化器語法也具有類似操作特征。例如,實現system.collections.generic.icollection<t>的任何對象都可以使用一個集合初始化器來初始化它的值。

  一個集合初始化器由下列部分組成:

  · 一個對象初始化器序列,用"{"和"}"符號包括,并且由逗號隔開。

  · 元素初始化器,它們中每一個都指定一個元素以被添加到指定的集合對象中(元素初始化器不能是一個集合初始化器中的賦值表達式)。

  那么,究竟它是如何工作的呢?一個集合初始化器必須遵循下列規則:

  · 應用集合初始化器的每一個集合對象必須是一種實現了system.collections.generic.icollection<t>的類型(恰好針對一個t)。

  · 必須存在從每一個元素初始化器到t類型的一種隱式轉換。一個集合初始化器針對每一個指定的元素都會按序調用icollection<t>.add(t)方法。

  作為一個例子,下面的集合初始化器創建并初始化一個新的字符串集合-這個集合具有3個成員:"alice","bob"和"chris",參考如下:

list<string> names = new list<string> { "alice", "bob", "chris" };

  注意:所有的初始值都是字符串類型。否則,你將得到一個編譯器錯誤。

  二、 實現集合初始化

  假定你想描述一個班及其中的注冊同學。為此,你可以通過使用c# 3.0中的集合初始化器編程實現,如下所示:

using system;
using system.collections.generic;
using system.text;
using system.query;
using system.xml.xlinq;
using system.data.dlinq;
namespace collectioninitializer
{
 class program
 {
  public class myclass
  {
   public string nameofclass;
   public list<string> studentnames = new list<string>();
  }
  static void main(string[] args)
  {
   var classes = new list<myclass>
   {
    new myclass
    {
     nameofclass = "science",
     studentnames = {"laura", "george"}
    },
    new myclass
    {
     nameofclass = "commerce",
     studentnames = {"bill", "hillary"}
    }
   };
  }
 }
}

  如果你有visual studio 2005并且安裝了linq preview,那么可以在ide中編譯上面的代碼。

  如果你沒有vs 2005但是安裝了linq preview,那么你可以使用下列命令來從命令行編譯該代碼:

c:/program files/linq preview/bin/csc.exe
/reference:"c:/program files/linq preview/bin/system.data.dlinq.dll"
/reference:c:/windows/microsoft.net/framework/v2.0.50727/system.data.dll
/reference:c:/windows/microsoft.net/framework/v2.0.50727/system.dll
/reference:"c:/program files/linq preview/bin/system.query.dll"
/reference:c:/windows/microsoft.net/framework/v2.0.50727/system.xml.dll
/reference:"c:/program files/linq preview/bin/system.xml.xlinq.dll" program.cs

  三、 代碼剖析

  讓我們更細致地分析一下前面的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
?。糲lass collectioninitializer.program/myclass>
 classes,
 [1] class [mscorlib]system.collections.generic.list`1
?。糲lass 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
?。約tring> 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新引入的特征之一,提供了一種新的語法來初始化集合對象。這種簡單的語法把集合對象的創建和初始化結合到一個步驟中。

商業源碼熱門下載www.html.org.cn

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 眉山市| 凤翔县| 郑州市| 衡阳县| 罗定市| 太康县| 胶州市| 甘洛县| 商河县| 监利县| 汤阴县| 商水县| 沂源县| 海兴县| 门头沟区| 叙永县| 徐闻县| 铜鼓县| 江口县| 新野县| 神木县| 马山县| 陵水| 安福县| 天等县| 抚顺县| 合作市| 湖口县| 烟台市| 阜南县| 平安县| 会泽县| 清河县| 故城县| 乌鲁木齐县| 桐城市| 格尔木市| 翁牛特旗| 务川| 大竹县| 湘西|