一.所有型別都是從system.obejct派生
1.下面兩個型別定義是完全一致的:
12.system.object的公共例項方法class
employee
4class
employee:system.object
a.equals 判斷物件是否具有相等的值
b.gethashcode 返回物件值的雜湊碼
c.tostring 該方法預設返回型別的完整名稱( this.gettype().fullname )
d.gettype 返回從type派生的乙個物件的例項,指出呼叫gettype的那個物件是什麼型別
3.system.object的受保護方法
a.memberwiseclone 這個非虛方法能建立型別的新例項,並將新物件的例項欄位設與this物件的例項字段完全一致.返回的是乙個對新例項的引用( 這是譯文,說實話,沒看懂,然後查閱了msdn,其實這個方法的功能是建立乙個淺表副本,是建立乙個新物件,然後將當前物件的非靜態字段複製到這個淺表副本中,即新物件中.如果欄位是值型別,則執行逐位複製.如果是引用型別,則複製引用而不複製引用物件,因此,原始物件及其副本引用同一物件 )
以下是淺表複製和深入複製操作的區別
1memberwisecopy區別深入複製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 }
b.finalize 在垃圾**器判斷物件是否被作為垃圾**之後,在該物件的實際位址被**之前,會呼叫這個虛方法
4.clr要求new建立物件
1 employee employee = new employee("然而,new需要做的工作是:constructorparam1
");
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在上面這段**中,clr實際上會檢查兩次物件的型別. is 操作符首先核實 o 是否相容於 employee 型別. 如果是,那麼在 if 語句內部執行轉型時,clr再次核實 o 是否引用乙個employee.這無疑造成了效能的損失.if( o is
employee )
2
因為clr必須判斷 變數o 引用的實際型別,然後clr必須遍歷繼承層次結構,用 o 的每個基型別去核對每個指定的型別 employee.
所以,c#提供了另乙個操作符 as ,目的是簡化這段**操作 ,並提公升其效能 .
1 employee e = o as在這段**中,clr核實 o 是否相容 employee 型別 ;如果是,則 as 會返回對同乙個物件的非 null 引用.如果 o 不相容 employee 型別, as 操作符會返回 null .employee;
2if( null !=e )
3
檢查是否為 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...