2012-07-19 58 views
0

略可能重複:使用實例參數或不帶參數的實例方法的靜態方法?

Instance method vs. static method with ref parameter

如果我有一個類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被稱爲有些不同,它會影響嗎?

+4

首先考慮架構/可讀性。性能問題時請考慮性能。 (只是個人觀點) – 2012-07-19 11:58:11

回答

0

我建議你不要在這種情況下使用靜態方法。在很多情況下,靜態方法是非常難看的解決方案。例如,如果您使用實例方法創建數據映射器類,那麼更好的方法是在您決定需要使用繼承來擴展數據映射器類的行爲以獲得不同的保存操作時,它可以幫助您。開始時不要考慮性能,特別是在這個時刻,好程序員的經驗告訴我們,當面對它時,我們需要用性能來解決問題。如果你優化你的應用程序的每一行代碼,你將不會完成你的應用程序。通常情況下,有時候我們需要2-3個地方來提高代碼的性能,但有時候根本沒有這種地方。因此,首先要考慮一下你的設計,關於它的可讀性和可擴展性。

+0

這不就是「Raphel Althaus」在他的評論中所說的嗎? – Razort4x 2012-07-20 12:06:41

2

除了表現,我更願意將保存員工的責任轉移到另一個班級。 SRP兼容,也可能有點OCP。

+0

我很抱歉聽起來太笨,但什麼是SRP和OCP? – Razort4x 2012-07-20 16:31:55

+0

對不起,不是一個非常包容的答案。單一責任原則與開放原則。 Google SOLID OO更多的設計原則。 – 2012-07-20 18:30:59