2013-06-18 74 views
2

由於void簽名用於表示該方法不返回任何東西,這樣那樣的方法,我把它寫方式如下:無效與對象返回null

private void MyMethod() 
{ 
    // Body of the method. 
} 

然而,在許多地方,我有看到方法不打算返回任何東西,寫的方式如下:

private object MyMethod() 
{ 
    // Body of the method 

    return null; 
} 

從我的角度來看,這兩個代碼片段做同樣的。那麼,這可能是使用第二個的目的?他們之間有什麼不同?而且是否有人比其他人更喜歡?

+4

你有在公共代碼這些地方的任何例子嗎?如果它全部是內部的,也許它只是一個開發者對一個乾淨的API有奇怪的概念? –

+0

該方法的主體是否有回報?它並不打算像void一樣返回任何東西。它打算返回需要時可以爲null的對象。除非是你的意圖,否則不要效仿第二種 - 不要混淆視聽。 – ChiefTwoPencils

+0

@JonSkeet例如[here](http://jesseliberty.com/2011/01/09/passing-parameters-with-behaviors-in-mvvm-light-for-windows-phone/)以及許多其他來自他 – anderZubi

回答

7

第二個是按原樣寫的,單次返回通常是無用的,它會稍微減慢性能並使API更難消費。然而,它可能有用的細微變化,如:

  • 有多個返回點,這是最後一個表明缺少一個對象。例如,你可能正在返回一個對象的實例,但由於某種原因,這次你沒有一個實例。 (示例1)

  • 如果方法標記不同,說public virtual那麼默認實現或重寫的一個可能不會返回一個值,但其他人可能會。 (實施例2)

實施例1:

public object MyMethod() 
{ 
    if(myObj != null) 
     return myObj.Result(); 

    return null; 
} 

實施例2:

// Derived Class 
protected override object MyMethod() 
{ 
    // We don't need a result from here so we don't have an implementation of 
    // anything, but the base implementation doesn't make sense. This however 
    // could be breaking SOLID principles. 
    return null; 
} 

// Base Class 
protected virtual object MyMethod() 
{ 
    return new MyObj(); 
} 
0

第二個,調用者可以測試null這是一個有用的指示成功或失敗,如果由於某種原因,不希望拋出一個異常。第一個沒有這樣的設施。

+0

第一個可以改爲使用'out'參數並仍然返回'void'。 –

0

其次是誤導。使用你的類的人會在執行這個方法後得到一些東西。如果他們不打算在任何情況下返回有意義的值,您應該避免編寫這樣的方法。

即使您將類返回有意義的類,您應該考慮使用NullObject設計模式,以便您不打破現有API並遵循LSP。返回空創建冗餘與額外的空檢查邏輯,是違反直覺。

0

第二種是一種不好的做法。我們不需要告訴編譯器檢查返回類型。也許這是爲未來的改變完成的。

1

也許是第二個可以用來調用異常處理

0

對於第二個,如果在方法體中沒有其他的返回值,我會說這是無用的。只要您保證該方法不會返回任何價值,請使用第一個。

0

第二種方法本身返回的東西在你的情況下爲null。我不覺得它作爲非價值迴歸方法。如果方法沒有返回更好的練習與空洞

0

唯一的良好做法是每次都會返回一個布爾值,以確認方法是否已成功接收調用和參數,或者方法是否成功執行了邏輯內部。

返回一個NULL是無用的,誤導性的...