对象计算验证 C#

Posted

技术标签:

【中文标题】对象计算验证 C#【英文标题】:Object calculating validation C# 【发布时间】:2017-03-28 21:40:09 【问题描述】:

我的目标是让这个程序能够获取许多比萨饼和比萨饼类型,并计算它们的成本。我决定采用对象解决方案。问题是它不计算它,即使字段为空,它也让程序运行。我真的不知道为什么它不计算它。我也是对象新手,所以可能存在一些逻辑错误。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Assignment_2

    public partial class Form1 : Form
    
        public Form1()
        
            InitializeComponent();
        
        private void OrderButton_Click(object sender, EventArgs e)
        
            double withTax = 0;
            double tax = 0;
            double subTotal = 0;
            var pizzas = new Pizza[3];
            if(ValidateAndDeclareQuantities())
            
                pizzas = Declare();
                subTotal = CalcSubTotal(pizzas);
                tax = CalcTax(pizzas);
                withTax = CalcWithTax(pizzas);
            

        
        bool ValidateAndDeclareQuantities()
        
            var combolist = new List<ComboBox>();
            combolist.Add(comboBox1);
            combolist.Add(comboBox2);
        combolist.Add(comboBox3);
        var textboxlist = new List<TextBox>();
        textboxlist.Add(Quantity1);
        textboxlist.Add(Quantity2);
        textboxlist.Add(Quantity3);
        for (int i = 0; i < 3; i++)
        
            if (combolist[i].Text == "Cheese" || combolist[i].Text ==     "Vegetable" || combolist[i].Text == "Meat")
             
            else combolist[i].Text = "Wrong input";
        
        int[] Quantities = new int[3];
        for (int i = 0; i < 3; i++)
        
            if (int.TryParse(textboxlist[i].Text, out     Quantities[i])&&textboxlist[i].Text!=null)
             
            else  textboxlist[i].Text = "Wrong input"; 
        
        return true;
    

    Pizza[] Declare()
    
        var pizzas = new Pizza[3];
        string type;
        int price;
        type = comboBox1.Text;
        price = int.Parse(Quantity1.Text);
        Pizza pizza1 = new Pizza(type, price);
        pizzas[0] = pizza1;

        type = comboBox2.Text;
        price = int.Parse(Quantity2.Text);
        Pizza pizza2 = new Pizza(type, price);
        pizzas[1] = pizza2;

        type = comboBox3.Text;
        price = int.Parse(Quantity3.Text);
        Pizza pizza3 = new Pizza(type, price);
        pizzas[2] = pizza3;

        return pizzas;
    

    double CalcSubTotal(Pizza[] pizzas)
    
        double subTotal = 0;
        for (int i = 0; i < 3; i++)
        
            subTotal += pizzas[i].Price;
        
        return subTotal;
    

    double CalcTax(Pizza[] pizzas)
    
        double tax = 0;
        for (int i = 0; i < 3; i++)
        
            tax += pizzas[i].Tax;
        
        return tax;
    

    double CalcWithTax(Pizza[] pizzas)
    
        double withTax = 0;
        for (int i = 0; i < 3; i++)
        
            withTax += pizzas[i].WithTax;
        
        return withTax;
    

    void WriteOut(double subTotal, double tax, double withTax)
    
        lblSubTotal.Text = "" + subTotal;
        lblTax.Text = "" + tax;
        lblTotal.Text = "" + withTax;
    

    

还有班级: 使用系统; 使用 System.Collections.Generic; 使用 System.Linq; 使用 System.Text; 使用 System.Threading.Tasks;

namespace Assignment_2

class Pizza

    string type;
    int quantity;
    public double Price;
    public double SubTotal;
    public double Tax;
    public double WithTax;
    public Pizza(string type, int quantity)
    
        this.type = type;
        this.quantity = quantity;
        FindPrice();
        CalcSubTotal();
        CalcTax();
        CalcWithTax();
    
    private void FindPrice()
    
        switch (type)
        
            case "Cheese":
                Price = 9.95;
                break;
            case "Vegetables":
                Price = 10.95;
                break;
            case "Meat":
                Price = 11.95;
                break;
        
    
    private void CalcSubTotal()
    
        SubTotal = Price * quantity;
    
    private void CalcTax()
    
        Tax = SubTotal * 0.13;
    
    private void CalcWithTax()
    
       WithTax = SubTotal + Tax;
    


Solution form

【问题讨论】:

很抱歉......但您需要重新考虑这里的整个设置。至少在 validate - declare 部分 【参考方案1】:

快速回答:

ValidateAndDeclareQuantities 永远不会返回 false。当您设置“错误输入”时,它应该(可能)返回 false。

(次要) int[] 数量 = new int[3];从未使用过,除了写入它。

(次要)var pizzas = new Pizza[3]; 也从未使用过。它只是在几行之后被 Declare 覆盖。 Pizza[] pizzas=null; 或只是 Pizza[] pizzas; 是更好的选择。不过这里不是最棒的结构。

(次要)您在 Declare 中名为 price 的变量命名不当,因为它看起来实际上是数量。这样的事情很容易让人失望。

永远不会调用 WriteOut。 OrderButton_Click 中的withTaxtaxsubTotal可能被正确计算,但没有输出值。

更长的答案

有点乱!我很欣赏这只是一个学习的东西——我们都经历过——但是良好的代码卫生与语言的结构同样重要(如果不是更重要的话)。

UX:不要覆盖用户输入的内容——特别是不要用“错误输入”替换文本框输入;最好使用其他标签。我想你在测试代码时已经感觉到这种体验是多么奇怪。

命名的东西不需要特定的类:比如奶酪比萨和火腿。枚举是你的朋友!使用它们而不是像“Cheese”这样的字符串:

public enum PizzaType
    Cheese,
    Tomato

以这种方式使用枚举有助于避免意外大写的痛苦世界,而且速度也相当快。奶酪披萨有人吗?

重复:你的大部分代码也是重复的;你会想尽可能多地练习避免它。 (“干燥”/“不要重复自己”)。一点前瞻性计划会大有帮助。每个人对代码结构都有偏好;我的这里将是一个单独的“Pizza displayer”类,它包含一个数量输入框并进行验证。

垃圾: 与上述略有相关,您正在创建一堆列表和数组,每次调用函数时都会创建这些列表和数组,然后就被丢弃。创建一些更抽象类型的单个数组(如“Pizza displayers”数组)并将该数组保留为表单上的属性。这在此处是次要的,但更多地了解您的程序创建了多少垃圾有助于使您的代码运行得更快。

关于浮点数的注意事项:你不应该,永远使用 float/double 来赚钱。改用小数,或者只用便士做所有事情。浮点数不精确,您迟早会遇到舍入问题。

【讨论】:

为我辩护:我认为我必须在声明时告诉数组其中有多少元素。谢谢您的帮助!现在一切正常。我在文本框中做了错误报告,因为无论如何用户都必须更改它,所以为什么要创建更多标签。我将再次重写代码。还不太了解对象的概念。我知道理论而不是如何在实践中很好地使用它们。无论如何,谢谢! @alex3wielki 没问题!数组是对的,但数组也是一个对象 - 每次执行“new something”时,您都在创建一个全新的对象,除非它是一个结构。例如,var pizzas = new Pizza[3]; 和里面声明你第二次得到new Pizza[3]; - 这是两个完全不同的对象;第一个未使用:)

以上是关于对象计算验证 C#的主要内容,如果未能解决你的问题,请参考以下文章

如何在 c# 中使用来自 2 个类的对象进行计算?

C# Lazy Loading

C#中各版本的单例模式

C# 基本语法

C# ASP.NET;获取登录用户的 NetworkCredential 对象?

将坐标存储为对象的性能与 C# 中的两个双精度