略可能重複:使用實例參數或不帶參數的實例方法的靜態方法?
如果我有一個類Employee
,而且有它增加了員工數據庫的方法AddEmployee
。有跡象表明,我可以採取壽方法,一種是這個樣子,
protected void AddEmployee(SQLConnection con)
{
// this is an instance method,
// connection is passed in parameter
// add this class to database, using the connection
}
,我會這樣稱呼它
var emp = new Employee();
// set its properties
emp.AddEmployee(theSQLConnectionObject);
另一種方法是,我創建了一個靜態方法,然後通過Employee
類和SQLConnecion,然後的一個實例添加該實例Employee類到數據庫的,這樣
static protected void AddEmployee(Employee emp, SQLConnection Con)
{
// this is static method
// connection again in parameter
// add emp class to database, using the connection
}
這可以加上,
var emp = new Employee();
// set its properties
Employee.AddEmployee(emp, theSQLConnectionObject);
我想知道哪一個是好方法,哪一個你喜歡,爲什麼?另外,我想知道C#的具體內容,相關的問題不是任何lang特定的。
現在,在開始我說稍微有可能重複,因爲這部分。
我讀CLR通過C#,並且在第8章節類型構造,它是這樣
當編譯的方法,JIT編譯器確定天氣它必須發射 調用執行類型構造進入方法。如果JIT 編譯器決定發出呼叫,它必須決定它應該在哪裏發出呼叫 。有兩種possibilites
精確的語義,發出立即調用代碼之前,將訪問一個 非繼承提交的類的成員的代碼之前創建第一個實例或直接。
Before-field-init語義,在代碼第一次訪問靜態字段或靜態或實例方法之前發出代碼,或調用實例構造函數。
一些更多的說明,然後性能比較的例子給出,並有一個相當多的在性能上的差異,我不包括爲簡潔起見,但如果有人想要那個,評論,我會更新這個問題。
的例子後,他繼續
在C#編譯器看到一個類只能用於使用內聯初始化 靜態字段,編譯器發出 前場-INIT元數據的類型定義表。當它看到一個帶有顯式構造函數的類 時,它不會將before-field- 發送到元數據中。
現在,如果我在我的Employee
類中有一個靜態字段,情況會有什麼不同?從我能想到的,會有4不同的充情況下
AddEmployee是實例,類沒有靜態構造函數
AddEmployee是實例,類有一個靜態構造函數
AddEmployee是靜態的,類沒有靜態構造函數
AddEmployee是靜態的,類有一個靜態構造函數
將如何表現在所有這些情況有所不同,假設方法AddEmployee
被稱爲在buttonClick
每個,創建員工的實例時間(在這兩種情況下,靜態方法還是不行,因爲它們都需要一個實例),因此每次創建一個新的實例。另外,如果這個AddEmployee
被稱爲有些不同,它會影響嗎?
首先考慮架構/可讀性。性能問題時請考慮性能。 (只是個人觀點) – 2012-07-19 11:58:11