型別基礎 CLR Via C 筆記一

2022-01-15 01:53:30 字數 3344 閱讀 6721

一.所有型別都是從system.obejct派生

1.下面兩個型別定義是完全一致的:

1

class

employee

4class

employee:system.object

2.system.object的公共例項方法

a.equals 判斷物件是否具有相等的值

b.gethashcode 返回物件值的雜湊碼

c.tostring 該方法預設返回型別的完整名稱( this.gettype().fullname )

d.gettype 返回從type派生的乙個物件的例項,指出呼叫gettype的那個物件是什麼型別

3.system.object的受保護方法

a.memberwiseclone 這個非虛方法能建立型別的新例項,並將新物件的例項欄位設與this物件的例項字段完全一致.返回的是乙個對新例項的引用( 這是譯文,說實話,沒看懂,然後查閱了msdn,其實這個方法的功能是建立乙個淺表副本,是建立乙個新物件,然後將當前物件的非靜態字段複製到這個淺表副本中,即新物件中.如果欄位是值型別,則執行逐位複製.如果是引用型別,則複製引用而不複製引用物件,因此,原始物件及其副本引用同一物件 )

以下是淺表複製和深入複製操作的區別

1

public

class

idinfo29

}1011public

class

person

1222

23//

深入複製

24public

person deepcopy()

2530}31

32class

program

33 , age:

",p.name,p.age);

37 console.writeline("

value:

",p.idinfo.idnumber);38}

3940

static

void main(string

args)

41109 }

memberwisecopy區別深入複製

b.finalize 在垃圾**器判斷物件是否被作為垃圾**之後,在該物件的實際位址被**之前,會呼叫這個虛方法

4.clr要求new建立物件 

1 employee employee = new employee("

constructorparam1

");

然而,new需要做的工作是:

a.它計算型別及其所有基型別( 一直到system.object )中定義欄位所需的位元組數.堆上每個成員都需要一些overhead成員,即開銷成員——"型別物件指標"( type object pointer )和"同步塊索引"( sync block index ).這些成員由clr共同管理物件.這些額外成員的位元組數會計入物件大小.

b.它從託管中分配指定型別要求的位元組數,從而分配物件的記憶體,分配所有位元組都設為零.

c.初始化"型別物件指標"和"同步化索引塊"

d.呼叫型別的例項構造器.

注:引用型別有除了例項字段開銷之外,還包括兩個欄位的開銷,即"同步化索引塊"和"型別物件指標".

5.型別轉換 ( 看父不看子 )

clr最重要的特性就是型別安全性.在執行時,clr總是知道乙個物件是什麼型別.呼叫gettype方法,總是知道乙個物件確切的型別是什麼.由於這個方法是非虛方法(不能重寫覆蓋),所以乙個型別不能偽裝成另乙個型別.這句話很好理解,乙個employee類不能重寫gettype方法,所以不能返回乙個其他型別,比如superhero型別.

c#不要求任何特殊語法即可將乙個物件轉化為它的任何基型別,因為基型別轉換被認為是一種安全的隱式轉換.然而,將物件轉化為它的某個派生型別時,c#要求只能進行顯式轉換,因為這樣的轉換可能在執行時失敗.

注:宣告方法引數型別的最好方法是將引數型別指定,而不是object,這避免了執行時錯誤,將錯誤提早到編譯時.

6.使用c#的 is 和 as 操作符來轉型

使用 is 檢查乙個物件是否相容於指定的型別,並返回乙個 boolean 值: true 或 false . ( is 永遠也不會丟擲異常 ).

如果物件的引用是 null , is 操作符總是返回 false ,因為沒有可供檢查的物件.

is 操作符的使用:

1

if( o is

employee )

2

在上面這段**中,clr實際上會檢查兩次物件的型別. is 操作符首先核實 o 是否相容於 employee 型別. 如果是,那麼在 if 語句內部執行轉型時,clr再次核實 o 是否引用乙個employee.這無疑造成了效能的損失.

因為clr必須判斷 變數o 引用的實際型別,然後clr必須遍歷繼承層次結構,用 o 的每個基型別去核對每個指定的型別 employee.

所以,c#提供了另乙個操作符 as ,目的是簡化這段**操作 ,並提公升其效能 .

1 employee e = o as

employee;

2if( null !=e )

3

在這段**中,clr核實 o 是否相容 employee 型別 ;如果是,則 as 會返回對同乙個物件的非 null 引用.如果 o 不相容 employee 型別, as 操作符會返回 null .

檢查是否為 null 比校驗乙個物件的型別要效率的多.

同樣, as 操作符也不會丟擲異常.

7.命名空間和程式集

命名空間用於邏輯性分組;

clr不知道命名空間的任何事,訪問乙個型別時,clr需要知道型別的完整名稱以及該型別具體定義在哪個程式集中.

建立命名空間別名:

1

using microsoft; //

嘗試新增"microsoft."字首

2using wintellect; //

嘗試新增"wintellect."字首34

//將wintellectwidget符號定義成wintellect.widget的別名

5using wintellectwidget =wintellect.widget;67

public

sealed

class

program

814 }

命名空間別名

1

namespace

companyname26

7namespace

x //

typeof : companyname.x.b9}

10 }

命名空間規則

CLR via C 學習筆記 型別

類的記憶體分配 關鍵字 abstract 類 該類不能構建例項 方法 屬性 事件 表示構建派生型別的例項之前派生型別必須重寫並實現這個成員 常量 字段 不允許 virtual 類 不允許 方法 屬性 事件 表示這個成員可以由派生類重寫 常量 字段 不允許 override 類 不允許 方法 屬性 事...

CLR via C 第4章 型別基礎

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

淺學CLR via C 筆記之型別轉換

我們都知道clr最重要的乙個特性就是型別安全,它在執行時就知道物件型別。但我們會經常用到將一種型別轉換成另一種型別,clr也允許將物件轉成他的實際型別,或者是它的基型別。在c 中,支援隱士轉換成它的基型別。型別轉換會用到以下方式 1 public class entitybase24 5public...