亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

帶著問題讀CLR via C#(筆記二)類型基礎

2020-01-24 03:29:53
字體:
來源:轉載
供稿:網友

Q1: Object類型包含哪些方法?

A1: Object類型共包含6個方法,Equals, GetHashCode, ToString, GetType, MemberwiseClone和Finalize.

Q2: new一個對象的過程是什么?

A2: 1)計算對象所需字節數,包括該類型及其基類型定義的所有實例字段所需的字節數和類型對象指針、同步塊索引所需字節數,類型指針和同步塊索引是CLR用來管理對象的;2)在托管堆上分配該對象所需內存空間;3)初始化類型對象指針和同步塊索引;4)執行構造函數。大多數編譯器都在構造函數中自動生成一段代碼調用基類構造函數,每個類型的構造函數在執行時都會初始化該類型定義的實例字段。5)返回指向新建對象的一個引用,保存在對象變量中。

可用如下代碼驗證第四步:

復制代碼 代碼如下:

View Code
  class Program
     {
         static void Main(string[] args)
         {
             TestThree t = new TestThree();
             Console.Read();
         }
     }

     class Test
     {
         int i;
         public int I { get; set; }

         public Test()
         {
             Console.WriteLine("This is Test's constructor");
         }
     }

     class TestTwo : Test
     {
         public TestTwo()
         {
             Console.WriteLine("This is TestTwo's constructor");
         }       
     }

     class TestThree : TestTwo
     {
         public TestThree()
         {
             Console.WriteLine("This is TestThree's constructor");
         }
     }

執行結果如下:

Q3: 父類型和子類型間如何進行轉換?

A3: C#允許將一個對象從它的本身類型轉換為它的父類型,這是安全的,不需要做任何額外操作,但要將一個對象從它的本身類型轉換為它的子類型,則必須要顯式轉換,因為可能會失敗。見代碼:

復制代碼 代碼如下:

View Code
  class Program
     {
         static void Main(string[] args)
         {
             Person person = new Person();
             Man man = new Man();
             Person p = man;
             Man m = person;
         }
     }

  class Person
     { }

  class Man : Person
     { }

這段代碼是無法編譯通過的,在Main方法的第四行會報一個這樣的錯誤:

Error 1 Cannot implicitly convert type 'TypeBasic.Person' to 'TypeBasic.Man'. An explicit conversion exists (are you missing a cast?) C:/Users/Allen/Documents/Visual Studio 2012/Projects/TypeBasic/TypeBasic/Program.cs 16 21 TypeBasic

很顯然,一個 “男人” 一定是一個人,故可以直接轉換,但一個 “人” 并不一定是一個 “男人”,所以必須要顯式轉換??蓪⒋a這樣改寫:

復制代碼 代碼如下:

// From
Man m = person;

// To
Man m = (Man)person;    

這樣就可以成功通過編譯,但是在運行的時卻拋出了異常,很顯然,Person不能被轉換為Man. 什么情況下Person可以被轉換為Man? 見如下代碼:

復制代碼 代碼如下:

View Code
         static void Main(string[] args)
         {
             Man man = new Man();
             Test(man);
         }

         static void Test(Person p)
         {
             Man m = (Man)p;
         }

Q4: is和as操作符的作用是什么?

A4: is操作符用來判斷一個對象是否屬于某種類型,返回一個布爾值。改寫下上例的Test方法:

復制代碼 代碼如下:

View Code
 static void Test(Person p)
 {
     if (p is Man)
     {
         Man m = (Man)p;
     }
 }

以上代碼共進行了兩次類型檢測,is操作符首先檢測p是否為Man類型,在if的方法體中進行強制轉換時,CLR會再次檢測p的類型,這對性能有一定影響。

as操作符很好的解決了這個問題,再次改寫Test方法:

復制代碼 代碼如下:

View Code
  static void Test(Person p)
  {
      Man m = p as Man;
      if (m != null)
      {
          //...
      }
  }

as操作符在檢測p的類型后會直接對p進行類型轉換,返回一個Man類型的對象,若檢測出p不是Man類型,則會返回null. 整個過程只進行了一次類型檢測。

Q5: 什么是命名空間?

A5: 命名空間是對類型的邏輯分組,對于編譯器而言,命名空間的作用是使類型名稱變得更長更具唯一性,但CLR并不知道命名空間,訪問一個類型時,CLR需要知道該類型的全名以及它所在程序集。

Q6: 命名空間和程序集之間的關系是什么?

A6: 命名空間和程序集間并沒有什么關聯,同一命名空間的類型可以存在于不同程序集,同一程序集中的類型也可以屬于不同命名空間。

Q7: 分析以下代碼執行時CLR發生的動作。

復制代碼 代碼如下:

View Code
 namespace TestConsole
 {
     class Program
     {
         static void Main(string[] args)
         {
             Employee e;
             Int32 year;
             e = new Employee();
             e = Employee.Lookup("Joe");
             year = e.GetYearsEmployed();
             e.GenProgressReport();
         }
     }

     class Employee
     {
         // 實例方法
         public Int32 GetYearsEmployed()
         {
             //...
         }
         // 虛方法
         public virtual string GenProgressReport()
         {
             //...
         }
         // 靜態方法
         public static Employee Lookup(string name)
         {
             //...
         }
     }

     class Manager : Employee
     {
         // 對父方法重寫
         public override string GenProgressReport()
         {
             //...
         }
     }
 }

A7:

1)CLR檢查該方法內部引用的所有類型(Employee, Int32, Manager, String),確保定義了這些類型的程序集已成功加載;

2)CLR利用程序集的元數據提取這些類型的相關信息,并創建一些數據結構來表示類型本身,如下圖所示:

3)執行"序幕代碼",在線程棧中為局部變量分配內存,并初始化它們,如下圖所示:

4)構建Manager對象,在托管堆中創建一個Manager類型的實例,CLR會初始化該實例的類型對象指針,讓它引用與實例對應的類型對象,本例中為Manager類型對象;此外CLR會初始化同步塊索引,并將該實例所有實例字段設為null或0,再調用構造函數,new操作符會返回該實例內存地址,該地址保存在e中,如下圖:

5)Lookup是一個靜態方法,調用時CLR會定位定義該靜態方法的類型對應的類型對象,然后JIT編譯器在該類型對象的方法表中查找被調用的方法的記錄項,對方法進行JIT編譯(第一次執行),執行編譯后的代碼。本例中,假定查出的實例是一個i額Manager類型,則在堆中創建一個Manager實例,用查出的信息初始化該實例,并返回它的地址儲存在e中,此時,第一個初始化的Manger對象將沒有指針指向它,它成為垃圾回收對象。見下圖:

6)GetYearsLookup是一個非虛實例方法,在調用時,JIT編譯器會找到發出調用的標量(e)的類型對應的類型對象,本例中為Employee類型對象,因為e被定義為了Employee類型。如果Employee中沒有定義該方法,則會繼續向上一層查找,知道查找到Object類型對象,查找到該方法后,JIT編譯器對其進行編譯(第一次執行),再執行變異后的代碼,將執行結果保存在局部變量中。見下圖:

7)GetProgressReport為定義在Employee中的虛方法,調用一個虛方法,JIT編譯器會在方法中生成一些額外代碼,這些代碼在每次調用方法時都會執行。它首先會檢測發出調用的變量,根據地址查找到發出調用的實例,本例為一個Manager對象,然后檢測對象內部的類型指針,找到該對象的實際類型,從實際類型對象的方法列表中查找調用的方法的記錄項,進行JIT編譯(第一次執行),執行變異后代碼。見下圖:

Q8: 如何理解類型對象?

A8: 類型對象本質上也是對象,它也包含類型對象指針成員,CLR創建這些類型對象時,也會對其進行初始化。CLR開始在一個進程中運行時,會立即為MSCorLib.dll中定義的System.Type對象創建一個特殊的類型對象,Q7中的Emloyee和Manager都是Type類型的“實例”,它們的類型對象指針都會指向Type類型對象,而Type類型對象的類型對象指針則會指向自己。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产午夜精品久久久| 国产精品第10页| 日韩精品有码在线观看| 国产一区二区三区日韩欧美| 日韩精品福利在线| 国产精品久久久久久久久久新婚| 久久久久久亚洲精品| 国产精品老女人精品视频| 日韩精品在线看| 久久视频在线播放| 亚洲美女av在线播放| www.亚洲一区| 欧美一级大胆视频| 国产精品国产亚洲伊人久久| 午夜精品一区二区三区视频免费看| 欧美性xxxx在线播放| 在线观看免费高清视频97| 97视频在线看| 亚洲国产日韩欧美在线99| 亚洲影视九九影院在线观看| 成人在线国产精品| 一区二区欧美日韩视频| 欧美性猛交xxxx偷拍洗澡| 亚洲人成电影在线观看天堂色| 久久琪琪电影院| 国产精品jizz在线观看麻豆| 日韩大陆欧美高清视频区| 久久深夜福利免费观看| 久久成人精品电影| 欧美成aaa人片免费看| 日韩欧美第一页| 欧美精品999| 亚洲人a成www在线影院| 欧美午夜性色大片在线观看| 69av在线播放| 国产精品久久久久久久久久久久久| 日韩精品在线观看一区| 成人黄色生活片| 欧美性猛交xxxx免费看久久久| 91九色在线视频| 欧美大学生性色视频| 日韩欧美一区二区三区久久| 精品动漫一区二区三区| 亚洲美女动态图120秒| 亚洲老司机av| 欧美丰满少妇xxxx| 欧美激情手机在线视频| 成人av.网址在线网站| 91精品国产色综合| 亚洲va久久久噜噜噜久久天堂| 国产欧美在线播放| 91成人福利在线| 日韩av最新在线| 国产精品成人一区二区三区吃奶| 国产亚洲一区二区在线| 草民午夜欧美限制a级福利片| 青青久久aⅴ北条麻妃| 韩日欧美一区二区| 亚洲美女av在线| 亚洲福利在线看| 亚洲免费小视频| 久久精品国产亚洲精品2020| 久久成人18免费网站| 国产精品福利在线观看| 国产精品一区二区三区成人| 国产欧美亚洲精品| 亚洲毛片在线观看.| 日韩精品在线看| 亚洲国产另类 国产精品国产免费| 亚洲精品在线91| 国产精品久久久久久久久借妻| 日韩精品久久久久| 高清欧美性猛交xxxx| 欧美在线视频在线播放完整版免费观看| 国内成人精品视频| 日韩电影在线观看永久视频免费网站| 亚洲аv电影天堂网| 久久91超碰青草是什么| 亚洲视频专区在线| 亚洲最大的av网站| 91精品国产网站| yellow中文字幕久久| 亚洲自拍偷拍福利| 欧美激情一区二区三区在线视频观看| 亚洲人成电影在线播放| 欧美大片大片在线播放| 成人免费视频97| 欧美高清一级大片| 在线观看日韩av| 国外成人性视频| 欧美洲成人男女午夜视频| 国产视频精品在线| 亚洲成avwww人| 2018国产精品视频| 欧美丰满老妇厨房牲生活| 亚洲精品一区在线观看香蕉| 国产精品免费视频xxxx| 亚洲999一在线观看www| 久久人人爽人人爽爽久久| 2019亚洲男人天堂| 午夜精品三级视频福利| 日韩av在线网页| 国内精品免费午夜毛片| www.精品av.com| 亚洲情综合五月天| 最新国产成人av网站网址麻豆| 日韩av在线免费观看一区| 九九视频直播综合网| 国产精选久久久久久| 国产亚洲视频在线观看| 亚洲欧美国产日韩中文字幕| 精品一区二区三区四区| 亚洲国产欧美在线成人app| 亚洲xxxx视频| 久久躁狠狠躁夜夜爽| 日韩av片永久免费网站| 精品久久久久人成| 国产免费一区二区三区香蕉精| 国产精品精品视频一区二区三区| 亚洲美女在线看| 日韩av在线网页| 欧美最猛性xxxxx(亚洲精品)| 中文字幕亚洲无线码在线一区| 日韩大片在线观看视频| 亚洲成人久久久| 国产欧美日韩精品在线观看| 日韩中文字幕在线观看| 日韩在线小视频| 久久精品这里热有精品| 国产精品户外野外| 国产欧美精品在线播放| 日韩在线观看高清| 亚洲成人免费网站| 国产精品九九久久久久久久| 国产精品久久久久久久久粉嫩av| 丝袜美腿亚洲一区二区| 欧美一级淫片播放口| 中日韩美女免费视频网站在线观看| 国产精品永久免费视频| 国产精品96久久久久久又黄又硬| 日韩美女视频免费看| 精品少妇v888av| 久久久精品网站| 欧美日韩国产中文字幕| 亚洲国产91精品在线观看| 亚洲高清av在线| 成人精品视频久久久久| 欧美裸身视频免费观看| 久久久国产精品x99av| 精品二区三区线观看| 欧美寡妇偷汉性猛交| 欧美激情按摩在线| 国产日本欧美一区二区三区| 91在线视频九色| 亚洲网站在线播放| 亚洲自拍偷拍视频| 国内精品小视频在线观看| 久久天天躁狠狠躁夜夜躁2014| 亚洲mm色国产网站| 国产精品久久久久久av福利| 欧美人交a欧美精品| www.国产精品一二区| 狠狠爱在线视频一区| 久久伊人精品一区二区三区|