Валидация C # конструктор объект null распоряжаться - PullRequest
0 голосов
/ 08 октября 2011

Я новичок в объектно-ориентированной проге в 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.
        }
    }

Ответы [ 4 ]

4 голосов
/ 08 октября 2011

Проверка этого типа не должна выполняться в конструкторе объекта.Вместо этого это должно быть сделано в методе, который выполняет действие, которое вы намереваетесь выполнить.

Итак, если вы пытаетесь вычесть деньги с банковского счета для оплаты заказа, вы выполняете проверку вМетод снятия средств.

2 голосов
/ 08 октября 2011

За исключением нескольких очень редких случаев, которые здесь не применимы, если конструктор возвращает, он либо возвращает созданный объект, либо выдает исключение.

Итак, чтобы избежать создания объекта, который был бы недействительным, вы должны сгенерировать исключение. Или вы можете создать метод, который возвращает null, если объект будет недействительным, и создать его в противном случае.

Кроме того, вы не должны иметь дело с пользовательским интерфейсом в доменных объектах, поэтому не показывайте это окно сообщения там.

1 голос
/ 08 октября 2011

Невозможно «назначить» это или как-то иначе помешать конструктору выполнять свою работу. Вы можете либо сгенерировать исключение, либо как-то еще указать, что вновь созданный объект недействителен.

РЕДАКТИРОВАТЬ
Вы также можете создать статический метод, который будет возвращать объект Bank, если выполняются ваши условия, или возвращать ноль в противном случае.

0 голосов
/ 08 октября 2011

Здесь нет ничего нового, чем другие ответы.Просто чтобы показать, как вы можете это сделать.

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);
    }
}

Если вы не уверены, попробуйте прочитать «Я» тестового класса

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