簡體   English   中英

驗證C#構造函數對象null處理

[英]Validation C# constructor object null dispose

我是C#中面向對象編程的新手,請多多包涵。 我不想創建對象,如果this.OrderCost()大於10000.00。如何刪除該對象。 在這里進行驗證是否正確? 最好的方法是什么?

 public Bank(string bankCode, string bankName)
    {
        this.bankCode= bankCode;
        this.bankName= bankName;


        if (this.orderCost() > moneyInBankAccount)
        {
            MessageBox.Show("Order amount exceeds the money in bank account.");
            this. = null;  // <--what to do here.
        }
    }

這種類型的驗證不應該在對象的構造函數中完成。 而是應在執行您要執行的操作的方法中完成此操作。

因此,如果您嘗試從銀行帳戶中扣除款項以支付訂單費用,則可以使用“提款”方法執行驗證。

除非在幾種非常罕見的情況下(不適用於此處),否則如果構造函數返回,則它要么返回構造的對象,要么拋出異常。

因此,為避免構造無效的對象,應引發異常。 或者您可以創建一個返回null的方法,否則該對象將無效,否則將其創建。

另外,您不應該在域對象中處理UI,因此不要在此處顯示該消息框。

不可能“分配”此內容或以其他方式阻止構造函數執行其工作。 您可以拋出異常或以其他方式表明新創建的對象無效。

編輯
您還可以創建一個靜態方法,如果滿足條件,該方法將返回Bank對象,否則返回null。

這沒有什么比其他答案新的了。 只是為了展示您如何做到這一點。

public class Bank
{
    public Bank(string bankCode, string bankName)
    {
        if (ConditionNotMet) throw new SomeException("");
        .....
    }
}

要么

public class Bank
{
    private Bank(string bankCode, string bankName)
    {
    }

    public static Bank Create(string bankCode, string bankName)
    {
        if (ConditionNotMet) return null; //or throw Exception
        return new Bank(string bankCode, string bankName);
    }
}

如果您不相信,請嘗試閱讀測試課程的“ I”

public class Test
{
    public int I=0;
    public Test()
    {
        I=666;
        throw new Exception("No you can't read");
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM