偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

淺析C# CLR的語言特性

開發(fā) 后端
本文從7個方面講述C# CLR,其中他們有new和override區(qū)別、構(gòu)造函數(shù)、abstract, virtual、as和強制類型轉(zhuǎn)換等等。

本文從7個方面講述C# CLR,其中他們有new和override區(qū)別、構(gòu)造函數(shù)、abstract, virtual、as和強制類型轉(zhuǎn)換等等。

1. C# CLR之new和override區(qū)別

override在子類中重寫基類的方法;new在子類中為基類同名(virtual)方法添加一個新的版本,會保留基類的同名(virtual)方法。

如果基類的同名方法不給出new和override修飾符,.Net默認采用new的方式,編譯時將產(chǎn)生一條警告信息。

關(guān)于重載:一般有按名稱隱藏和按簽名隱藏兩種策略,C#默認按簽名隱藏,即默認使用hidebysig特性。

2. C# CLR之構(gòu)造函數(shù)

a) static構(gòu)造函數(shù).cctor,對類型初始化。在類里面聲明的靜態(tài)變量將由C#編譯器自動編譯到.cctor中,如果有顯示的聲明靜態(tài)構(gòu)造器,也是編譯到.cctor(在.cctor中局部靜態(tài)變量將位于顯示聲明的靜態(tài)構(gòu)造器前面)。

CLR有兩種策略決定.cctor的執(zhí)行時間,第一種是首次使用類型時,第二種是首次使用類型的靜態(tài)成員時通過給類型添加beforefieldinit 元數(shù)據(jù)特性)。C#編譯器對沒有顯示聲明靜態(tài)構(gòu)造器的類型默認設(shè)置beforefieldinit特性,對存在顯示靜態(tài)構(gòu)造器的類型不會設(shè)置。

b) 類的構(gòu)造函數(shù).ctor。要注意的一點是CLR分配對象時將調(diào)用深度派生(most-derived)類型的構(gòu)造函數(shù)方法,在派生類型構(gòu)造函數(shù)的最開始位置調(diào)用基類構(gòu)造方法,不管在派生類型本身還是基類的構(gòu)造函數(shù)中,對象的實際類型都是派生類型。在這樣的機制下,有些問題需要謹慎處理,例如如果基類在構(gòu)造函數(shù)中調(diào)用被override過的virtual方法,而這時派生類的構(gòu)造函數(shù)并沒有執(zhí)行。

3. C# CLR之a(chǎn)bstract, virtual

abstract的類不能實例化,只能用于子類繼承。

abstract的方法隱式的就是一個virtual方法;abstract的方法子類必須實現(xiàn);abstract方法只能有聲明,不能包含實現(xiàn)。

virtual方法提供給子類override;可以包含實現(xiàn)。

4. C# CLR之a(chǎn)s和強制類型轉(zhuǎn)換

強制類型轉(zhuǎn)換:MyClass myclass=(MyClass)obj; 使用as:MyClass myclass=obj as MyClass;

區(qū)別在于,如果obj不能被轉(zhuǎn)換成MyClass類型,強制類型轉(zhuǎn)換會拋出異常,而使用as時不會有異常,只是轉(zhuǎn)換結(jié)果(myclass變量)的值為null。

強制類型轉(zhuǎn)換使用castclass操作碼(opcode)實現(xiàn),as轉(zhuǎn)換、is判斷使用isinst操作碼實現(xiàn)。這兩個操作碼都使用類型的元數(shù)據(jù)信息,將對象轉(zhuǎn)換成給定類型放在當(dāng)前計算堆棧上,只不過無法轉(zhuǎn)換時一個拋異常,另一個將null放在堆棧中。

關(guān)于類型轉(zhuǎn)換:每個對象通過header中的類型句柄引用類型元數(shù)據(jù),在類型元數(shù)據(jù)中有一個interface table,指示類型實現(xiàn)了哪些接口(每個項都包含指向接口元數(shù)據(jù)的類型指針),一個基類類型元數(shù)據(jù)指針,在接口、繼承體系之間的類型兼容性測試主要基于這些信息進行。類型轉(zhuǎn)換另外需要考慮的,是類型是否有重載隱式、顯示類型轉(zhuǎn)換操作等。 [Page]

5. C# CLR之修飾符

private,只能在同一個類中調(diào)用。

protected,可在派生類中調(diào)用,無論派生類型是否在同一個assembly中。

internal,只能在同一個assembly中調(diào)用。

protected internal,可以在任何assembly的派生類型中調(diào)用,也可由同一個assembly中的任何類型調(diào)用。

6. C# CLR之readonly / const區(qū)別

const在編譯之后將常量編譯到指令流中,只在元數(shù)據(jù)保留有常量名和值的信息。readonly的變量只能在聲明時提供初始化值,或者在構(gòu)造函數(shù)中初始化,之后變量的值不再允許修改。

7.C# CLR之 ref和out區(qū)別

都是表示引用方式傳遞參數(shù),out明確要求調(diào)用者進行初始化,ref對調(diào)用方和被調(diào)用方都沒有明確的職責(zé)要求。因此對于out型的參數(shù),如果在調(diào)用之前沒有初始化賦值,會產(chǎn)生一個編譯器錯誤。

以上就是對C# CLR的簡單介紹。

【編輯推薦】

  1. 淺析基于SQL2005的CLR存儲過程
  2. 分析與對比CLR Via C#靜態(tài)構(gòu)造函數(shù)的性能
  3. 為你解疑:CLR是什么?
  4. linq to sql多表查詢淺析
  5. linq to sql多表基礎(chǔ)描述
責(zé)任編輯:阡陌 來源: VB.NET專題網(wǎng)
相關(guān)推薦

2009-09-18 15:53:37

C# 3.0新語言特性

2009-09-18 09:02:45

CLR Via C#

2009-08-03 16:28:53

Java語言與C#語言

2009-07-31 17:28:35

C#語言調(diào)用DLL

2009-08-19 16:50:32

Visual C#C#語言特性

2009-05-26 09:28:22

C# 4.0dynamic動態(tài)類型

2009-08-28 17:19:15

C#語言學(xué)習(xí)

2016-10-13 13:33:41

反射特性c#

2009-09-18 09:35:36

C# CLR

2009-08-07 17:25:37

C# SortedLi

2011-06-22 10:04:03

C#開發(fā)

2009-08-14 17:45:52

C# ArrayLis

2009-08-17 18:34:50

C# ChangeCo

2009-09-11 11:27:38

AttributeUsC# Attribut

2009-09-02 10:58:02

C#動態(tài)數(shù)組

2009-08-25 17:59:49

C#入門

2009-08-20 14:45:13

C# Switch語句

2009-08-17 13:34:02

C#異步操作

2009-08-21 17:24:06

C# SingleIn

2009-08-26 13:07:07

C#交錯數(shù)組
點贊
收藏

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