自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

C#3.0中自動(dòng)屬性和對(duì)象初始化器

開(kāi)發(fā) 后端
C#3.0中定義屬性更加方便,不用再在像之前的版本那樣的繁瑣,需要先定義存儲(chǔ)數(shù)據(jù)的字段,然后再定義屬性器,現(xiàn)在只需要定義屬性器就可以了,其它有編譯器自動(dòng)為我們完成,就可以省去定義字段時(shí)需要的那些時(shí)間;在對(duì)象初始化的時(shí)候我們可在對(duì)象構(gòu)造時(shí)實(shí)現(xiàn)對(duì)象屬性的初始化工作,和集合初始化類(lèi)似。

1.匿名屬性

定義屬性如下:

public class Employee
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public string Sex { get; set; }
        public int Age { get; set; }
        public string BirthDate { get; set; }
    }
在C#3.0 之前的寫(xiě)法如下:
    public class Employee
    {
        private int _id;
        private string _name;
        private string _sex;
        private int _age;
        private string _birthDate;
        public int Id
        {
            get { return _id; }
            set { _id = value; }
        }
        public string Name
        {
            get { return _name; }
            set { _name = value; }
        }
        public string Sex
        {
            get { return _sex; }
            set { _sex = value; }
        }
        public int Age
        {
            get { return _age; }
            set { _age = value; }
        }
        public string BirthDate
        {
            get { return _birthDate; }
            set { _birthDate = value; }
        }
    }

僅從代碼量上就前者比后者減少了2/3的代碼,這對(duì)提高效率是顯而易見(jiàn)的,那么這些代碼都到哪里去了呢?其實(shí)那些額外的代碼都是由編譯器為我們完成的,編譯器會(huì)將那些我們“省去"的代碼編譯成托管IL代碼的時(shí)候補(bǔ)進(jìn)去,兩者中代碼在最終生成的IL代碼的體積是差不多的。

image

上圖中的IL代碼中我們看到了 k_BackingField之類(lèi)的字段就是編譯器自動(dòng)產(chǎn)生的字段代碼。

2.對(duì)象初始化器,原來(lái)的對(duì)象初始化都要進(jìn)行先創(chuàng)建構(gòu)造方法,然后才能進(jìn)行成員的相關(guān)操作,C#3.0 提供了對(duì)象成員的直接初始化的能力,和初始化一個(gè)集合或者是數(shù)組一樣來(lái)初始化對(duì)象。

相面來(lái)看,通過(guò)對(duì)象初始化器對(duì)上面的的Employee類(lèi)進(jìn)行進(jìn)行調(diào)用:

Employee employee = new Employee { Id = 1, Name = "藍(lán)之風(fēng)", Age = 24, BirthDate = 
"1984-10-21", Sex = "男" };
            Console.WriteLine("編號(hào);{0}", employee.Id);
            Console.WriteLine("姓名:{0}", employee.Name);
            Console.WriteLine("年齡:{0}", employee.Age);
            Console.WriteLine("生日:{0}", employee.BirthDate);
            Console.WriteLine("性別:{0}", employee.Sex);
            Console.WriteLine("請(qǐng)按任意鍵繼續(xù)..."); 
            Console.ReadLine();
這句
Employee employee = new Employee { Id = 1, Name = "藍(lán)之風(fēng)", Age = 24,
BirthDate = "1984-10-21", Sex = "男" };

就是對(duì)象的初始化,看到代碼很簡(jiǎn)潔,輸出的結(jié)果如下:

image

在C#3.0之前的做法是:

Employee employee = new Employee();
            employee.Id = 1;
            employee.Name = "藍(lán)之風(fēng)";
            employee.Age = 24;
            employee.BirthDate = "1984-10-21";
            employee.Sex = "男";               
           
            Console.WriteLine("編號(hào);{0}", employee.Id);
            Console.WriteLine("姓名:{0}", employee.Name);
            Console.WriteLine("年齡:{0}", employee.Age);
            Console.WriteLine("生日:{0}", employee.BirthDate);
            Console.WriteLine("性別:{0}", employee.Sex);
            Console.WriteLine("請(qǐng)按任意鍵繼續(xù)..."); 
            Console.ReadLine();

或者通過(guò)重載構(gòu)造方法的方式來(lái)初始化這些屬性,二者的達(dá)到的效果是相同的,但是前者使用起來(lái)方便了些,代碼量減少了許多,這個(gè)過(guò)程是怎么完成的呢?其實(shí)C#本身并沒(méi)有太大的變化,這些都是在語(yǔ)法上的一些改變,使得編寫(xiě)代碼的時(shí)候更方便效率更高,把一些編譯器可以推斷出來(lái)完成的工作讓編譯器來(lái)做了,編譯器在編譯程序的時(shí)候?qū)⑽覀儧](méi)有實(shí)現(xiàn)的代碼替我們實(shí)現(xiàn)來(lái)生成IL代碼的:

method private hidebysig static void  Main(string[] args) cil managed
{
  .entrypoint
  // 代碼大小       175 (0xaf)
  .maxstack  2
  .locals init ([0] class CS30.Employee employee,
           [1] class CS30.Employee '<>g__initLocal0')
  IL_0000:  nop
  IL_0001:  newobj     instance void CS30.Employee::.ctor()
  IL_0006:  stloc.1
  IL_0007:  ldloc.1
  IL_0008:  ldc.i4.1
  IL_0009:  callvirt   instance void CS30.Employee::set_Id(int32)
  IL_000e:  nop
  IL_000f:  ldloc.1
  IL_0010:  ldstr      bytearray (DD 84 4B 4E CE 98 )                               // ..KN..
  IL_0015:  callvirt   instance void CS30.Employee::set_Name(string)
  IL_001a:  nop
  IL_001b:  ldloc.1
  IL_001c:  ldc.i4.s   24
  IL_001e:  callvirt   instance void CS30.Employee::set_Age(int32)
  IL_0023:  nop
  IL_0024:  ldloc.1
  IL_0025:  ldstr      "1984-10-21"
  IL_002a:  callvirt   instance void CS30.Employee::set_BirthDate(string)
  IL_002f:  nop
  IL_0030:  ldloc.1
  IL_0031:  ldstr      bytearray (37 75 )                                           // 7u
  IL_0036:  callvirt   instance void CS30.Employee::set_Sex(string)
  IL_003b:  nop
  IL_003c:  ldloc.1
  IL_003d:  stloc.0
  IL_003e:  ldstr      bytearray (16 7F F7 53 3B 00 7B 00 30 00 7D 00 )             // ...S;.{.0.}.
  IL_0043:  ldloc.0
  IL_0044:  callvirt   instance int32 CS30.Employee::get_Id()
  IL_0049:  box        [mscorlib]System.Int32
  IL_004e:  call       void [mscorlib]System.Console::WriteLine(string,
                                                                object)
  IL_0053:  nop
  IL_0054:  ldstr      bytearray (D3 59 0D 54 3A 00 7B 00 30 00 7D 00 )             // .Y.T:.{.0.}.
  IL_0059:  ldloc.0
  IL_005a:  callvirt   instance string CS30.Employee::get_Name()
  IL_005f:  call       void [mscorlib]System.Console::WriteLine(string,
                                                                object)
  IL_0064:  nop
  IL_0065:  ldstr      bytearray (74 5E 84 9F 3A 00 7B 00 30 00 7D 00 )             // t^..:.{.0.}.
  IL_006a:  ldloc.0
  IL_006b:  callvirt   instance int32 CS30.Employee::get_Age()
  IL_0070:  box        [mscorlib]System.Int32
  IL_0075:  call       void [mscorlib]System.Console::WriteLine(string,
                                                                object)
  IL_007a:  nop
  IL_007b:  ldstr      bytearray (1F 75 E5 65 3A 00 7B 00 30 00 7D 00 )             // .u.e:.{.0.}.
  IL_0080:  ldloc.0
  IL_0081:  callvirt   instance string CS30.Employee::get_BirthDate()
  IL_0086:  call       void [mscorlib]System.Console::WriteLine(string,
                                                                object)
  IL_008b:  nop
  IL_008c:  ldstr      bytearray (27 60 2B 52 3A 00 7B 00 30 00 7D 00 )             // '`+R:.{.0.}.
  IL_0091:  ldloc.0
  IL_0092:  callvirt   instance string CS30.Employee::get_Sex()
  IL_0097:  call       void [mscorlib]System.Console::WriteLine(string,
                                                                object)
  IL_009c:  nop
  IL_009d:  ldstr      bytearray (F7 8B 09 63 FB 4E 0F 61 2E 95 E7 7E ED 7E 2E 00   // ...c.N.a...~.~..
                                  2E 00 2E 00 )                                     // ....
  IL_00a2:  call       void [mscorlib]System.Console::WriteLine(string)
  IL_00a7:  nop
  IL_00a8:  call       string [mscorlib]System.Console::ReadLine()
  IL_00ad:  pop
  IL_00ae:  ret
} // end of method Program::Main
 
3總結(jié):
自動(dòng)屬性和對(duì)象初始化器都是C#3.0提供的語(yǔ)法級(jí)別的功能改進(jìn),是一種語(yǔ)法糖,是編寫(xiě)代碼的效率更高,將一些重復(fù)性的工作交給編譯器來(lái)做,但是這種改變,也增加了代碼的不透明性,這點(diǎn)在隱式類(lèi)型中體現(xiàn)的更為突出,增加了代碼理解的難度,這些僅僅是提供給代碼編寫(xiě)人員的一種選擇,如果不喜歡也可以按照原來(lái)的方式來(lái)書(shū)寫(xiě)自己的代碼也未嘗不可。 

【編輯推薦】

  1. 簡(jiǎn)述用C#實(shí)現(xiàn)優(yōu)先隊(duì)列方法
  2. 深入解析C#編程中的方法重載
  3. C#中使用單個(gè)對(duì)象的方法實(shí)現(xiàn)Undo/Redo
責(zé)任編輯:彭凡 來(lái)源: cnblogs
相關(guān)推薦

2011-06-17 15:29:44

C#對(duì)象初始化器集合初始化器

2009-08-24 17:55:44

C#3.0新特性

2009-08-24 18:01:45

C#3.0新特性

2009-08-27 10:31:39

C#對(duì)象初始化器

2009-08-26 15:28:52

C#對(duì)象集合初始化器

2009-07-31 17:51:27

C#對(duì)象初始化

2009-07-01 09:56:10

C#3.0

2023-12-18 09:26:12

C++switchif

2023-11-12 23:08:17

C++初始化

2012-02-28 10:04:09

Java

2010-02-06 14:40:50

C++初始化和賦值

2009-12-16 14:04:04

Ruby對(duì)象初始化

2009-08-26 18:28:44

C#數(shù)組

2009-09-18 11:15:52

C#數(shù)組初始化

2011-06-09 14:13:06

C++JAVA缺省初始化

2009-03-11 10:06:42

C#3.0編碼習(xí)慣命名規(guī)則

2024-03-13 08:52:43

C++初始化方式

2019-11-04 13:50:36

Java數(shù)組編程語(yǔ)言

2009-08-14 17:52:27

C#對(duì)象初始化

2023-12-04 10:57:52

函數(shù)C++
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)