第4章:C#物件導向的初級特性
1 物件導向基本概念
1) 對象與類:
2) 繼承
3) 封裝:使軟體的錯誤和修改可以局部化。
4) 多態性:動態綁定(晚綁定),編譯器在真正調用的地方插入一段特殊的二進位代
碼,通過使用存放在對象自身的資訊,這段代碼在運行時計算出實際應該被調用對象
方法的地址。
2 方法修飾符:virtual, static, new, abstract, override
3 類的存取修飾詞:public, internal(僅限於當前工程代碼訪問, 預設)
4 類成員存取修飾詞:public, protected internal, internal, protected, private(預設).
5 與C++不同, C#中對象必須通過new來建立。
Object x; //聲明一個引用,並未建立對象執行個體
x = new object();
而且參考型別的比較是其引用地址的比較而非資料內容的比較
6 C#中可以在聲明資料成員時初始化其值,其在建構函式執行前就初始化完畢
。
7 類體繫結構中,建構函式執行順序同C++, 基類->子類
8 this關鍵字
1) 代表當前對象,可以引用非靜態方法及屬性或將當前對象作為參數傳給另一個方法。
2) 建構函式相互調用。
public class Car
{
Car(int i){}
Car(string str, int i): this(i){}
}
3) 用在索引器中
9 解構函式
在C#中大多數對象不需要定義顯式的解構函式, 這與C++有所不同, 原因如下
1) C#中記憶體由GC管理,我們不需要自己做相關的清理工作,除非有不可控資源(檔案, 網路連接, 資料庫連接,控制代碼等)
2) GC的工作機制中, 帶有解構函式的對象在第二遍回收時才釋放, 影響GC效率。
另外,GC一般用Object.Finalize方法來清理非託管資源,在C#中的解構函式,實際會編譯為Finalize方法的重載。而且,因為GC的已耗用時間不可預知,解構函式調用時間無法確定,所以解構函式中不應有任何依賴與程式運行狀態的代碼。
10 強制對象回收(解構函式中的非託管資源)
調用Close或Dispose來命令“系統不要等待對象被判定為終結, 立即回收”
1) Close: 一個對象需要關閉, 然而這個對象關閉後還能再次將其開啟。檔案
2) Dispose: 當清楚對象後不打算繼續使用。 GDI或控制代碼
如何脫離GC的管理:1)GC.SuppressFinalize 2)不定義解構函式
11 using 語句
using(Font font = new Font("Arial", 10.0)){}
保證Dispose會在語句退出時被調用。
12 參數傳遞的方式
1) in: 傳值
2) ref: 傳引用
3) out: 返回參數(不需要初始化)
ref, out在聲明與調用時都要顯式寫出。
13 靜態成員與靜態建構函式
和C++不同, 靜態成員只能通過類名來訪問,而不能通過執行個體名訪問。 靜態建構函式會在類的任意一個執行個體建立之前運行,用來初始化靜態成員,或僅需一次初始化的情況。如匯入DLL函數, 資料庫連接等。。。。。。
14 性質(property)
將類的狀態與訪問狀態的方法分離,通過這個間接性使類的設計者按需改變對象的內部狀態。
public int Hour
{
//we can add custom code to adjust the value.
get{return hour;}
set(hour = value;)
}
15 readonly關鍵字
我們需要這樣的變數:在運行前未知, 但一旦賦值就不會被改變。 這就是readonly變數.