tom archer寫的《c#技術內幕》,通俗易懂,翻譯行文流暢,菜鳥如我也能順利地讀下去,不錯。覺得有些東西還是值得邊讀邊記的,留作以後參考。
c#中的數值型別與引用型別
數值型別:數值型別類似c中的變數型別,當宣告乙個數值型別的時候,是在棧上分配相應的儲存空間,並且後續的操作都是直接針對這些已分配的位。傳遞乙個數值型別的變數時,傳遞的是該變數的值,而不是對包含其物件的引用。數值型別有基本型別、列舉、結構等。
引用型別:引用型別類似乙個指標,指向要引用的物件,引用變數的值是指向某個「堆」的首位址。宣告引用型別時,會先在「棧」中分配這個引用變數的空間,如前所述,這只是個指標,指向要應用的物件在堆中的首位址。操作時是直接與該物件的引用打交道,而不是分配的位。引用型別主要有:類、陣列、代表、介面等。
裝箱與開箱
由來:c#是完全物件導向的。這一點有好處,也有缺點。如果只是隨便定義乙個int32的整數也需要建立乙個物件的話,顯然會降低效率,不如數值型別來的明快,直接對位操作就行。曾經有其他語言做過嘗試,將處理的一切單純看做物件,事實證明,這樣的效率是極低的。.net的「公共型別系統」(common type system,cts)採用了將型別分組的方法,即分為數值型別和引用型別。當簡單運算元值時,就用數值型別,當需要對這個數值進行複雜操作時,就把這個數值型別轉換為引用型別(也就是說數值型別和引用型別是可以相互轉換的),這樣就將兩種情況分來了。而這個雙向的動作分別有名稱:裝箱和開箱。
裝箱就是將數值型別轉換為引用型別。
開箱就是將引用型別轉換為數值型別。
其中,裝箱要用到c#中的乙個基類:system.object。這個類無處不在,只要有c#的程式就會有這個類。一切的變數、類、方法都是繼承自這個類。裝箱:
int foo = 42;//將foo宣告為數值型別
object bar = foo;//將bar宣告為應用型別,並將foo裝箱為bar,其中bar的引用變數值是它自己在堆中的首位址,而其包含的資料值是foo的值42
開箱的時候類似型別轉換,將object的變數轉換為相應的形式。為了保證轉換的正確,需要顯示轉換:
int foo = 42;
object bar = foo;
int foo2 = (int) bar;//將bar開箱,把其中包含的資料值賦給foo2,而不是其引用變數值(堆首位址)
C 一些基本概念
建構函式的作用是對物件本身做初始化工作,也就是給使用者提供初始化類中成員變數的一種方式。析構函式是釋放物件執行期間所申請的資源。函式的過載,過載構成的條件 函式的引數型別不同 引數個數不同,才能構成函式的過載 在乙個類中 注意,只有函式的返回型別不同是不能構成函式的過載。在函式過載時,要注意函式帶有...
C語言一些基本概念
exit 0 正常執行程式並退出程式 exit 1 非正常執行導致退出程式 return 返回函式,若在主函式中,則會退出函式並返回一值。再細化一點 1.return返回函式值,是關鍵字 exit 是乙個函式。2.return是語言級別的,它表示了呼叫堆疊的返回 而exit是系統呼叫級別的,它表示了...
Cas中的一些基本概念
ticket granting ticket tgt 可以認為是cas server根據使用者名稱密碼生成的一張票,存在server端.ticket granting cookie tgc 其實就是乙個cookie,存放使用者身份資訊,由server發給client端.service ticket ...