C# 控制台应用程序 - 变量中的常量零值

本文关键字:常量 变量 控制台 应用程序 | 更新日期: 2023-09-27 18:33:39

我几乎让我的小控制台应用程序工作了,唯一的问题是变量totalComm的值一直为 0。

尝试了一切,我可能只是忽略了一个可以解决问题的小修复。

提前致谢

菲利普

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace CommissionCalculator
{
 class Program
  {
    public static void Main()
    {
        double total;
        double comm = 0;
        double totalComm = 0;
        string name = "";
        string inputLetter = "";
        int whilecount = 0;           
        while (inputLetter != "z")
        {
            if (whilecount == 0)
            {
                Title();
                whilecount = whilecount + 1;
            }
            getNameSales(out inputLetter, out name, out total, comm, totalComm);
            calcComm(total, out comm);
            outputVar(name, total, comm);
            totalCommCalc(comm, totalComm);
        }
    }
    public static void Title()
    {
        Console.WriteLine("'n           Sunshine Hot Tubs 'n        Sales Commissions Report'n");
    }
    public static void getNameSales(out string inputLetter, out string name, out double total, double comm, double totalComm)
    {
        name = "";
        inputLetter = "";
        total = 0;
        Console.WriteLine("'nEnter salespersons initial a,b or e or enter z to quit");
        inputLetter = Console.ReadLine();
            if (inputLetter == "a")
            {
                name = "Andrea";
                string inValue;
                double sale = 0;
                total = 0;
                for (int count = 1; count <= 3; ++count)
                {
                    Console.WriteLine("Please enter sale: ");
                    inValue = Console.ReadLine();
                    sale = Convert.ToDouble(inValue);
                    total = total + sale;
                }
            }
            else if (inputLetter == "b")
            {
                name = "Brittany";
                string inValue;
                double sale = 0;
                total = 0;
                for (int count = 1; count <= 3; ++count)
                {
                    Console.WriteLine("Please enter sale: ");
                    inValue = Console.ReadLine();
                    sale = Convert.ToDouble(inValue);
                    total = total + sale;
                }
            }
            else if (inputLetter == "e")
            {
                name = "Eric";
                string inValue;
                double sale = 0;
                total = 0;
                for (int count = 1; count <= 3; ++count)
                {
                    Console.WriteLine("Please enter sale: ");
                    inValue = Console.ReadLine();
                    sale = Convert.ToDouble(inValue);
                    total = total + sale;
                }
            }
            else if (inputLetter == "z")
            {
                totalCommCalc(comm, totalComm);
                Console.WriteLine("Total commssion paid: {0:C}", totalComm);
                Console.ReadKey();
            }
        }
    public static void calcComm(double total, out double comm)
    {
        comm = total * 0.2;
    }
    public static double totalCommCalc(double comm, double totalComm)
    {            
        totalComm = totalComm + comm;
        return totalComm;
    }
    public static void outputVar(string name, double total, double comm)        
    { 
        Console.WriteLine("'n Name't       Total sales't     Commission 'n{0}     't    {1}     't      {2}", name, total, comm);            
    }
  }
}

C# 控制台应用程序 - 变量中的常量零值

totalComm 按传递给 totalCommCalc。 要么通过引用传递它,要么从 totalCommCalc 返回它并重新分配给 totalComm。

当变量按值传递时,副本将放置在您调用的方法的堆栈上。 对该副本的更改不会影响原始副本。

通过引用传递时,原始文件的地址将放置在堆栈上,并且更改会影响原始文件。

选项 1:

// Passed by reference.
// Changes affect original.  
// Has side effects.  See http://en.wikipedia.org/wiki/Side_effect_%28computer_science%29
totalCommCalc(comm, ref totalComm);  

选项 2:

// Preferred.  Passed by value.  
// Result is assigned to a variable.  
// No side effects.
totalComm = totalCommCalc(comm, totalComm); 

我更喜欢第二种形式,因为随着代码的增长,具有副作用的代码可能更难理解和维护。

对"totalCommCalc"的调用应该存储返回值或使用out关键字,就像其他方法一样。为了与您的其他方法保持一致,我将使用 out 并删除返回值。

 totalCommCalc(comm, out totalComm);

totalComm = totalCommCalc(comm, totalComm)

是通过而不是按引用传入totalComm的。 如果希望保留要totalComm的更改,请将其设置为ref参数,或者,如果适用,从函数返回值。

要通过引用传递:

....
getNameSales(out inputLetter, out name, out total, comm, ref totalComm);
....
public static void getNameSales(out string inputLetter, out string name, out double total, double comm, ref double totalComm)

不要使用ref(根据 @Eric J:随着代码的增长,具有副作用的代码可能更难理解和维护)

只需更改一行,即为变量分配函数返回值。

totalComm = totalCommCalc(comm, totalComm);

就是这样。