今天介紹的是建構子的設計原則
建構子分為兩類:
範例如下
pulbic class Customer{
// instance constructor
public Customer(){...}
// type constuctor
static Customer(){...}
}
我們常見常用的幾乎都是instance constructor
只有在type被建立時才會去呼叫他
而type constuctor則是在一開始就會呼叫
之前常說的default constuctor(預設建構子)則是不帶任何參數的建構子
以下逐條說明設計時的注意事項
1.提供簡單,明確預設的建構子
所謂簡單的建構子,只傳入幾個重要的參數,並且都是int, string...這種簡單的形態,或是Enums
2.建構子可以作為main properties的捷徑
var applicationLog = new EventLog();
applicationLog.MachineNmae = "BillingServer";
applicationLog.Log = "Application";
// 用建構子做捷徑
var applicationLog = new EventLog("BillingServer","Application");
3.在建構子中指定property的值時,用一樣的名稱代表同一個property
這也是為什麼參數要用casmel casing,用來避免名稱重複且易於區別
public class EventLog{
public EventLog(string logName){
this.LogName = logName;
}
public string LogName{get;set;}
}
4.不要在建構子中做複雜的事
5.instance constructor中如果發生錯誤,視情況丟出exception
並且在cache的地方加上finaly{Dispose(false);}
因為當執行到instance constructor表示物件已經產生
如果丟出Exception卻不處理他,可能會OutOfMemoryException
如果不丟出Exception,必須GC.SupperssFinalize(this);
去回收以產生的物件
public FinalizableType(){
try{
...
}cache(Exception e){
GC.SupperssFinalize(this);
throw;
}
}
6.必要時明確的寫出defualt constructor
不宣告任何constructor時,會自動幫你加上一個defualt constructor
public class Customer{
}
public class Customer{
public Customer(){}
}
但是一旦宣告一個有帶參數的運算子,那個Type就會失去defualt constructor
必須要明確宣告一個defualt constructor才有
7.struct不要宣告defualt constructor
8.避免在建構子中呼叫virtural member(可以被實作的member)
1.static constructor宣告為private
2.不要從static constructor丟出Exception
否則將無法在使用這個Type