標籤:
- 函數傳參,對於基礎資料型別 (Elementary Data Type)C#使用值傳遞,對於Object使用引用傳遞,因為C# Object的儲存是在堆中存對象的資料,在棧中放一個指向堆中資料的引用(指標)。所以可以認為C#的傳參時棧中元素的傳遞。
- 預設參數
與C++一樣,預設參數必須是最後的幾個連續的參數
是不合法的。
與C++不同的是,
C#除了前兩種方式,還支援第三種顯示傳遞參數的調用方法。
3. Object建立過程與Constructor
先建立對象(分配空間),再調用CLR預設的建構函式(它會按上表初始化所有的類型),如果定義constructor,則調用該constructor,否則直接,
調用初始化語句初始化Object(即指派陳述式,如int time = 300;)
上一篇中說到,class內聲明的class,method,properties都是private,建構函式也不例外。所以建構函式傳統的加上public。
初始化列表會先執行,比如下程式
調用
TestExp obj = new TestExp();
4. Copy Constructor
C# 沒有預設的copy Constructor, 必須手寫
ICloneable實現淺拷貝。
實現介面ICloneable,傳回值寫為Object,返回內建的MemberwiseClone()
使用時,直接調用便好。
5. Destructor
C# 提供記憶體回收行程(garbage collection),不許顯示的銷毀對象。
解構函式
顯式調用是不合法的,只能在程式結束(而不是函數結束)時會預設調用,其實質是把解構函式中的代碼合到基類Object.Finalize()中,並調用該函數。
建構函式,解構函式都不能被繼承;解構函式還不能重載,只能有一個;
解構函式不能帶修飾詞或參數。
關於垃圾自動回收機制
.net垃圾收集器進行垃圾收集的四種時機
a.最常見的﹕當.net覺得合適時﹐例如它感到記憶體緊張了(朮語稱為﹕0代對象充滿)
b.微軟強烈不建議使用的﹕GC的Collect方法調用(就是我們上面用的這種啦﹐因為會降低效能﹐會掛起進程, 等等﹐反正聽微軟的吧。當然某些時候可以用﹐
就像我上面用來測試的代碼﹐呵呵...)
c.應用程式定義域卸載時(AppDomain)
d.CLR被關閉時(程式運行結束)
所以,如果一旦你使用完對象你就想調用解構器,你該怎麼做?有兩個方法:
調用垃圾搜集器(GC.Collect())來清理。
實現IDisposable的Dispose方法。
對於這兩種方法參見http://www.cnblogs.com/paper/archive/2009/07/31/1535998.html
該部落格中的程式說明,當調用建構函式時,會先調用父類的建構函式,而解構函式相反,這點與c++類似。
當出現停用對象(沒有指標指向)時,並不會馬上調用記憶體回收,因為他不滿足上四點,但可通過顯式調用GC.Collect(),來實現記憶體回收
using語句與IDisposable
參考http://www.csharpwin.com/csharpspace/151.shtml
C# note 04——class2