2011-09-15 17 views
1

我在構造函數中應用驗證邏輯,並在返回失敗時返回。但是,這個實例仍然被創建。我如何確保如果邏輯失敗,ctor不應該創建實例。驗證和撤銷類的構造函數

class Car 
{ 
    public readonly int maxSpeed; 
    private int currSpeed = 99; 
    public Car(int max) 
    { 
     if (max > 50) 
      return; 
    } 
    public Car() 
    { 
     maxSpeed = 55; 
    } 
} 

回答

9

如果驗證失敗,您應該在構造函數中拋出異常。

各種框架類都可以這樣做,例如查看System.StringSystem.DateTime構造函數。

+0

嗯......該死的男人....我用類似的方式WHI樂在WPF項目上工作......猜猜繼承對我產生了影響;-) –

+1

對不起,我忘了說謝謝。你是Jon Skeet後RAM中的第二位用戶;-) –

+0

@Pankaj Upadhyay:感謝你的榮譽!儘管這可能有點太過榮幸。 – Falcon

1
public static Car GetInstance(int max) 
{ 
    if (max > 50) 
     return null ; 

    return new Car(max); 
} 
+0

我嚴重懷疑這 –

+0

不知道爲什麼-1從某人。儘管這不是我通常使用的工廠模式,但在某些應用程序中,這種情況可能是可以接受的,因爲某些應用程序中失敗的原因並不重要,但常常會出現大量失敗。 –

+0

我沒有做-1,但我不會建議使用這種方法。我更喜歡[clean code](http://www.amazon.ca/Clean-Code-Handbook-Software-Craftsmanship/dp/0132350882)從不從函數返回null的想法,這違反了這一點。如果大量的失敗是常見的,所以你想避免異常,我寧願將它重寫爲'public static bool TryGetInstance(int max,out Car instance)',因爲它更加明確,而且它是慣用的C#。 –

1

我更喜歡在構造函數拋出異常的獵鷹的答案,但如果你想避免拋出異常,你可以這樣做:

public static bool TryGetInstance(int max, out Car instance) 
{ 
    instance = null; 
    if(max > 50) 
    { 
     return false; 
    } 

    instance = new Car(max); 
    return true; 
{ 
0

一般來說,你可以使用下面的一個(這些是我知道的...)

0 - 由於構造函數不能返回一個值,所以創建一個public var並用它來指示對象的狀態。

1(這條線是基於以下的反饋編輯) - 提高在構造異常(有幾個原因不是很好)

2 - 使用一個工廠來創建類客戶

而且,看到這個線程:

http://www.eggheadcafe.com/software/aspnet/31867966/how-to-return-null-from-c-class-constructor-after-a-validation.aspx

https://softwareengineering.stackexchange.com/questions/51062/constructor-parameter-validation-in-c-best-practices

+0

構造函數是否以隱藏的方式返回實例?如果是這樣的話,那麼返回null將是一個更好的選擇 –

+1

我不相信C#中的構造函數可以返回null。 – Scott

+0

感謝紳士們指出了這個錯誤,我改變了我對0號的建議。 –