標籤:使用 ar 資料 sp on c ad new ef
第二章主要講解C#中各種讓人模糊不清的概念,用法,類型等等。
1.Equals()與==區別
當比較兩個實值型別時,二者基本一致,當比較參考型別時,==比較的是參考型別的地址是否一致,即兩個引用是否指向同一個堆,Equals()比較的是兩個引用指向的堆空間的內容是否一致。注意:當用一個參考型別對象A給另一個參考型別對象B賦值時,並不是複製一份堆,再把B指向堆,而是直接把A的值,即A指向的堆的地址給B,AB指向同一個堆。
2.const與readonly區別
const是編譯時間確定值,所以它只能用常量賦值。object,Array,struct不能聲明為const。
readonly是運行時確定值,可以用變數來賦值,它可以在建構函式中賦值,實現動態常量表示,更靈活。
3.private,protected,public,internal
(1)private只能類自己內部調用
(2)protected只能類自己和派生自自己的子類調用
(3)public完全開放
(4)internal只能在同一程式集內訪問,即在同一個項目內,不是同一個解決方案。
(5)protected internal只能在同一個程式集的類自己和派生自自己的子類調用
4.
sealed將類變為密封類,不能被繼承。將方法變成密封方法,不能被重載
new顯示隱藏從基類繼承的成員,不使用new也能隱藏,但是會警告。
virtual聲明虛方法,不具體實現,在子類中實現。
abstract聲明抽象類別,抽象方法,派生的子類必須實現所有抽象類別中未實現的方法。
override覆蓋virtual或者abstract修飾的方法
new和override相同點:都能對基類的方法進行隱藏,都可以用base關鍵字調用基類的成員
new和override不同點:(1)override隱藏的只能是virtual或者abstract修飾的方法,new不必要(2)當使用一個基類調用virtual方法時,如果使用override重寫了方法,那麼會調用該重寫方法,但是用new重寫的話還是會調用基類的virtual方法
5.abstract class與interface
6.公開變數與屬性的區別
如果使用公開變數,那麼可以在類的外部隨意的存取控制該成員變數,違背了物件導向中的封裝思想。
使用屬性,對屬性的訪問受限於類自身對於屬性的設定,不直接操作類的資料內容,而是通過訪問器來訪問,例如藉助於get{}set{}來讀取寫入資料,還有更多種用法,例如在更改前驗證資料等等。
屬性是對欄位(資料)的封裝。
屬性可以控制讀寫,變數不可以。
因此:當我們要把類中的一個值設為public時,儘可能使用屬性來代替變數。
7.params,out,ref
params:使得函數的參數的個數是可變的。
void f(params int[] list){..}則下列用法都可以。f(1,2);f(1,2,3);int[] ints={1,2,3};f(ints);
void f(params object[] list){..}f(1,2.23,"123");
out:一個引用傳遞
使用out修飾參數時,函數的定義和調用時都要顯式加out關鍵字,void f(out int i){....} int i;f(out i);對於i賦不賦值都無所謂,因為在進入函數時,i會被清空。因此i不能傳入值都函數內部,只能從函數內將值帶出。它必須在函數內部被賦值,因為它本身沒有值,C#不接受一個只有地址沒有值得變數,會報錯。
ref:僅僅是一個地址
同樣在函數的定義和調用時都要顯式加ref關鍵字,使用ref修飾的參數傳遞前必須初始化,因為它傳入後值不會清空,所以必須初始化,因為它本身已經有了值,所以可以在引用它的函數內部不作改變。
8.實值型別和參考型別的區別
實值型別儲存的是資料。分配在棧中,=操作是複製本體一份。
參考型別是一種行為。分配在堆中,=操作是將堆的指標複製一份。
9.結構體與類的區別
結構體是實值型別
類是參考型別
10.string和StringBuilder的區別
string對象是不可變的,string i="a";i+="b";此時i為ab,貌似string是可以改變的,其實不然,當進行+=操作時是重新建立了一個string對象,賦值ab,原先的string被丟棄,string不能使用new string()來構造一個string對象。
StringBuilder是可變的,它專門用來處理動態變化字元類。StringBuilder str=new StringBuilder("a");str.Append("b");
相對來說,如果對字串要進行大量的動態變化,最好用StringBuilder,因為使用string會不停的建立銷毀string對象,系統開銷很大,使用StringBuilder效率更高。
abstract class與interface的區別還不太理解。
亮劍.NET第二章