1.clr最重要的特性之一就是型別安全
:
在執行時,clr總是知道物件的型別是什麼,呼叫gettype()
方法即可知道物件的確切型別。這也就是為什麼gettype()
方法是基類object
中的非虛方法,因為如果可以重寫gettype()
方法,那麼他返回的就不一定是當前的物件型別,違背了型別安全
。
2.使用 is 和 as 操作符來轉型:
is
和as
在任何情況下都不會丟擲異常。
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
型別,其中filestream
在mscorlib.dll
程式集中實現,而filesystemwatcher
在system.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.object
的gettype
方法返回儲存在指定物件的型別物件指標
成員中的位址
,也就是說,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...