CLR via C 第4章 型別基礎

2021-10-07 11:31:07 字數 2567 閱讀 3074

1.clr最重要的特性之一就是型別安全

在執行時,clr總是知道物件的型別是什麼,呼叫gettype()方法即可知道物件的確切型別。這也就是為什麼gettype()方法是基類object中的非虛方法,因為如果可以重寫gettype()方法,那麼他返回的就不一定是當前的物件型別,違背了型別安全

2.使用 is 和 as 操作符來轉型:

isas在任何情況下都不會丟擲異常。

public

class

people

public

class

student

:people

在做型別判斷時,我們可以使用is操作符

var p =

newpeople()

;var s =

newstudent()

;console.

writeline

($"\t\t\t");

// true false true true

在做型別轉換時,使用as操作符

// use is

if(s is people)

var pp =

(people)s;

----

----

----①

// use as

var pp = s as people;

----

----

----

----

----

----

--②

值得注意的是

①中在if中判斷一次後,使用強制轉換時clr會再判斷一次是否相容,如果不相容那麼轉換就會報錯,所以在①中一共有兩次判斷。

②中有且只有clr來判斷一次,並且在不相容的情況下,會返回null而不會丟擲異常。

所以我們在轉化型別時,應該使用as操作符,不僅效能高而且還安全。

3.命名空間和程式集的關係:

命名空間和程式集(實現型別的檔案)不一定相關。特別是,在同一命名空間的型別可能在不同的程式集中實現。例如:在同一命名空間system.io下的filestream型別和filesystemwatcher型別,其中filestreammscorlib.dll程式集中實現,而filesystemwatchersystem.dll程式集中實現。

當然,同乙個程式集也包含不同命名空間中的型別。

4.執行緒棧:

5.執行緒執行乙個方法:

乙個簡單的方法包含

6.堆上所有的物件都包含兩個額外成員:

7.clr建立型別物件時,必須初始化以上兩個成員

我們在建立例項時

student hao =

newstudent()

;student sin =

newstudent()

;teacher jax =

newteacher()

;

在堆上如下

值得注意的是型別物件(student、teacher)本質上也是物件,它們的型別物件指標也必須初始化。事實上clr開始在乙個程序中執行時,會立即為mscorlib.dll中定義的system.type型別建立乙個特殊的型別物件,而student、teacher類都是他的例項,所以結果如下

當然type型別物件也有自己的型別物件指標,他指向自己

所以現在我們知道了,system.objectgettype方法返回儲存在指定物件的型別物件指標成員中的位址,也就是說,gettype方法返回指向物件的型別物件指標

這樣就可以判斷系統中的任何物件了。

下面的執行結果可以驗證

第4章 型別基礎

4.1 所有型別的基型別 system.object 公有方法 equals,gethashcode,tostring,gettype 保護方法 memberwiseclone,finalize clr要求所有的物件 指引用物件 都要用new操作符來建立,new操作符產生 newobj il指令,執...

C 基礎 第4章 型別基礎

4.1 本章主要內容 所有型別都從system.object派生 型別轉化 命名空間和程式集 無 演示 執行時的相互關係 無 演示 using system 該型別隱式派生自system.object internal class employee system.object internal cl...

CLR via C 第10章 屬性

1.clr支援的屬性有兩種 無參屬性,這也是我們平常說的屬性 有參屬性,它在不同的程式語言中有不同的稱呼。例如 在c 中有參屬性被稱為索引器,而在vb中被稱為預設屬性。2.屬性不能作為out或者ref引數傳給方法,而字段可以。public class sometype set static void...