型別與通用語言執行時 型別轉換

2022-09-14 05:12:10 字數 2014 閱讀 3811

clr 最重要的乙個特性就是型別安全。clr 在執行時總能知道乙個物件的型別。我們也可以用過呼叫 gettype方法來得到物件的準確型別。因為該方法是乙個虛方法。所以我們不可能利用它來篡改乙個型別的資訊。

例如:我們不可能重寫 employee 類的 gettype方法使之返回乙個spaceshuttle型別。

作為開發人員,我們經常會遇到需要將乙個物件轉換為其他型別。 clr 允許我們將物件轉換為其原來的型別或者它的任何乙個基型別。各個程式語言自己決定如何提供這些轉型操作。

例如,c# 不需要任何特殊的語法就可以將物件轉換為其任何乙個基型別,因為轉換為基型別被認為是安全的隱式操作。然而在其將物件轉換為它的任何派生型別時,c# 要求進行顯式轉換,因為這樣的轉型有可能會失敗

下面的**將演示如何將物件轉化為它的基類和派生型別:

1

//該型別隱式繼承自 system.object

2class

employee56

class

7public

static

void

main()

18 }

view code

上面的例子顯示了要使**通過編譯我們需要做的一些事情,下面解釋執行時發生的行為,在執行時clr會檢查轉型操作以確保總是將物件轉型它的實際型別、或者它的任何基型別。

例如,下面的**雖然能夠通過編譯,但是執行時,卻會丟擲 invalidcastexception 異常:

1

class

manager:employee 67

8class910

public

static

void

main()

3031

public

static

void

promoteemployee(object o)

4445 }

view code

如果 clr 允許上例中的轉型操作,**則會失去型別安全,並且結果也將變得不可預期——包括應用程式可能崩潰、以及由於型別欺騙引起的安全漏洞。

型別欺騙是很多安全漏洞的原因,它會極大地危機應用程式的 穩定性和健壯性。

* promoteemployee()的正確定義應該是接受乙個 employee物件,而不是 object 物件作為引數,本文使用 object 的目的僅僅只是為了演示編譯器和 clr 是如何處理轉型操作的。

使用 is 和 as 操作符轉型(c#)

檢查物件是否和給定的型別相容,並返回判斷結果:true 或者 false 。另外,is 操作符永遠不會丟擲異常。

看下面的**:

system.object o = new system.object ();

system.boolean b1 = ( o is system.object);  // b1 為true

system.boolean b1 = ( o is employee);    // b1 為false

如果物件引用為null,那麼 is 操作符總是返回 false,因為沒有物件可以用來檢查其型別。下面演示 is 操作符典型的使用方法:

if( o is employee)

在上面的**中,clr實際上對物件的型別檢查了兩次:is操作符首先檢查 o 所引用的物件是否和 employee 型別相容。如果相容,在 if 語句內,

clr 在執行轉型時又會檢查 o 是否為乙個 employee 引用。由於這種程式設計正規化十分常見,c#便為我們提供了一種新的轉型方式,即 as 操作符,它可

以在簡化**的同時提高效能,例如:

employee e = o as employee;

if(e != null)

在上面的**中,clr 會檢查 o 所引用的物件是否和 employee 型別相容,如果相容,as 返回乙個指向同乙個物件的非空指標。如果不相容,as 返回 null.

注意,在 as 操作符執行過程中,clr

只檢查了一次物件的型別。緊接著的 if 語句只需要檢查 e 是否為null 就可以

如何載入通用語言執行時?

net程式的生成以及執行過程 將源 source code 編譯成為託管模組 managed module 將託管模組組合成程式集 載入clr 執行程式集 一 將源 編譯為託管模組 我們可以用任何支援clr的程式語言來建立源 檔案,然後用相應的編譯器來做語法檢查和源 分析,最終生成託管模組。託管模組...

執行時型別識別

執行時的型別識別 rtti 分為兩類 1.typeid操作符 2.dynamic cast操作符 先看第二種 dynamic cast完成將基類型別的指標或者引用安全轉化為派生類型別的指標和引用。對於指標,如果轉化失敗,則將指標置為null,對於引用型別,因為沒有null,所以直接丟擲bad cas...

執行時型別檢查

執行時型別資訊 run time type information 通常記做rtti。在c primer第五版中,譯作執行型別識別 run time type identification 執行時型別資訊包括三部分 1 乙個運算子dynamic cast,給它乙個指向某某物件的基類指標,它能得到乙個...