2013-02-01 70 views
-2

我使用此代碼從另一個MDIchild窗體中加載MDIchild窗體。我仍然在學習如何在我的方法中使用泛型,所以當我最終在人們的幫助下讓我的方法開始工作時,我會用兩個稍微不同的代碼來結束,這些代碼在我的情況下以相同的方式執行。所以我的問題是 - 這兩個變體做同樣的工作或兩種方法之間沒有區別是巧合。C# - 調用這個通用方法的兩種方法。有什麼區別嗎?

因此,這裏是版本1:

protected void LoadAForm<T>(ref T sendTo) where T : Form 
{ 
    MainForm frm = this.MdiParent as MainForm; 
    if (frm != null) 
    { 
     sendTo = SingletonFormProvider.GetInstance<T>(frm, true); 
     sendTo.MdiParent = frm; 
     sendTo.Dock = DockStyle.Fill; 
     sendTo.Show(); 
    } 
} 

這裏是第2版:

protected void LoadAForm<T>(ref T sendTo) where T : Form 
{ 
    MainForm frm = this.MdiParent as MainForm; 
    T temp; 
    if (frm != null) 
    { 
     temp= SingletonFormProvider.GetInstance<T>(frm, true); 
     temp.MdiParent = frm; 
     temp.Dock = DockStyle.Fill; 
     temp.Show(); 
    } 
} 

那麼,有沒有(如果有差異)使用T temp實例或者它僅僅是一回事嗎?

+2

有什麼問題?你在第二個版本中使用'sendTo'在哪裏?如果他們是相似的,請解釋HOW –

+0

您**從來沒有**在第二種方法中使用'sendTo',除非您將'sendTo'設置爲temp。 – LukeHennerley

+0

這兩種方法都是直接使用'sendTo'或者聲明'T temp'並使用它來完成相同的工作。我只想知道這兩種工作方式是否有差異。 – Leron

回答

3

主要區別在於,在第二種情況下,您的新創建並顯示的表單在您的sendTo參數中的LoadAForm外部不可用。 第一種方法似乎正常工作,通過向其傳遞參考參數來完成它的目的。

另一種自然的方式是返回新創建的函數返回值形式,而不是通過ref'ed參數返回它。

後編輯: 坦率地說,正如Henk Holterman所說,你濫用ref的用法。

順便說一句,如果你還想要一個參數傳遞給方法,使用出來代替裁判

好吧,這就是我的意思是:你申報的方法是這樣的:

protected T LoadAForm<T>() where T : Form 

,回到你剛纔實例化的形式。簡單。

+0

好的,謝謝,讓我試試。但是反正用起來不是更好嗎?我剛讀了一些信息,看起來像一個解決方案? – Leron

+0

out和ref總是解決方案,取決於你需要什麼。但在這種情況下,最好的是按照我向您展示的方式實施它。但如果你非常想要這個參數,ref應該被替換爲out。 – Adi

+0

不,我沒有'保護T LoadAForm ()其中T:Form',它的工作原理就是我想要的。會接受它,因爲它確實是最好的解決方案。非常感謝。 – Leron

3

這與泛型沒有任何關係。這是關於(錯誤)使用ref參數。

那麼,有沒有(如果有任何區別)使用T臨時實例​​或它只是一樣的東西?

這個方法裏面沒有區別。但在通話結束後,傳遞給'sendTo'的參數將被版本1更改,並且在使用版本2時保持不變。

哪一個是正確的,不能從這段代碼中猜出。

+0

+1贊同濫用ref參數 – Adi

+0

好吧,我問這個問題,因爲這兩種情況都是由比我有更多經驗的人提出的。如果他們對同樣的工作(似乎是這樣),哪一個是正確的,或者兩者都不是很好? – Leron

+0

'鞋鞋=新鞋(); LoadAForm (ref shoe);'那是我怎麼稱呼它 – Leron

相關問題