Страницы

Поиск по вопросам

четверг, 19 декабря 2019 г.

Как предотвратить ввод значений ниже нуля?

#c_sharp


Здравствуйте, я новичек в этой сфере и поэтому все еще учусь простым вещам.

Делаю программу, чтобы хранила сведения о продуктах в одном каталоге, но я не хочу
чтобы можно было поставить негативную цену на продукт или сделать негативное кол-во
продуктов на складе.

Вот мой код: 

public enum ProductCategory
{
    Electric,
    Household,
    Garden,
    Miscellaneous
}
class Product
{
    // Properties
    private int productID;
    private string productName;
    private double unitPrice;
    private double unitsInStock;

    // Get Product Categories
    public ProductCategory category
    {
        get;
    }

    // Validator for Unit Price
    public double UnitPrice
    {
        get { return unitPrice; }
        set { unitPrice = value > 0.0 ? value : 0.0; }
    }

    // Validator for Units In Stock
    public double UnitsInStock
    {
        get { return unitsInStock; }
        set { unitsInStock = value > 0.0 ? value : 0.0; }
    }

    // Constructor
    public Product(int productID, string productName, ProductCategory category, double
unitPrice, double unitsInStock)
    {
        this.productID = productID;
        this.productName = productName;
        this.category = category;
        this.unitPrice = unitPrice;
        this.unitsInStock = unitsInStock;
    }

    // Default Constructor with Chaining
    public Product(int productID, string productName) : this(productID, productName,
ProductCategory.Miscellaneous, 0.0, 0.0)
    {
    }

    // Override which returns a string with full product information
    public override string ToString()
    {
        return "The product " + productName + " with ID " + productID +
            " costs " + unitPrice + " euro per unit. We have " + unitsInStock + "
items left in our " + category + " stock.";
    }
}

//Testing the app
class TestProduct
{
    static void Main(string[] args)
    {
        // Assigning correct properties to the product
        Product p1 = new Product(1234567, "Cake", ProductCategory.Miscellaneous,
7.5, 150);
        Product p2 = new Product(2345678, "Drill", ProductCategory.Household, -23, 2);
        Product p3 = new Product(3456789, "Shovel", ProductCategory.Garden, 12.7, -10);

        Console.WriteLine(p1);
        Console.WriteLine(p2);
        Console.WriteLine(p3);

        Console.ReadLine();
    }
}


Вот что выдает консоль:

The product Cake with ID 1234567 costs 7.5 euro per unit. We have 150 items left
in our Miscellaneous stock.
The product Drill with ID 2345678 costs -23 euro per unit. We have 2 items left in
our Household stock.
The product Shovel with ID 3456789 costs 12.7 euro per unit. We have -10 items left
in our Garden stock.


Как вы видите у меня цена на Drill -23 евро, а количество Shovel на складе -10. 

Как сделать так, чтобы при негативных цифрах возращало 0?
    


Ответы

Ответ 1



У вас уже вроде всё сделано. Просто в конструкторе присваивайте значения не полям метода, а свойствам: //this.unitPrice= unitPrice; this.UnitPrice= unitPrice;`

Ответ 2



Вставлю свои пять копеек. Для правильной обработки ошибок ввода со стороны пользователя программы в .Net существует IDataErrorInfo и более новый вариант на эту же тему INotifyDataErrorInfo, очень рекомендую ознакомиться с документацией про эти интерфейсы.

Ответ 3



В дополнение к существующих хорошим ответам: молчаливое подавление проблемы — не самая хорошая идея, т. к. при этом ошибки в других частях программы остаются незамеченными. Есть два подхода. Во-первых, это проверки времени компиляции. Допустим, что у вас целочисленное поле, и вы хотите, чтобы оно принимало лишь положительные значения. Тогда часто имеет смысл объявить его не как int, а как uint (хотя при этом нарушится CLS compilance), чтобы отрицательные значения просто не смогли попасть туда. В случае, если проверка во время компиляции невозможна или непрактична (например, у вас есть требования к CLS compliancy, или как в вашем случае несущий тип с плавающей запятой, который невозможно ограничить на этапе компиляции), имеет смысл бросать исключение при неверных параметрах. Таким образом, любой код, который пытается загрузить неправильные значения, приведёт к исключению и падению программы на этапе тестирования. При этом ваш код будет выглядеть как-то так: public double UnitPrice { get { return unitPrice; } set { if (value < 0.0) // или <= в зависимости от того, какая логика вам нужна throw new ArgumentException("Unit price cannot be negative"); unitPrice = value; } }

Комментариев нет:

Отправить комментарий