1

小さなコンソールアプリはほとんど機能しましたが、唯一の問題は、変数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);            
    }
  }
}
4

4 に答える 4

1

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

副作用のあるコードは、成長するにつれて理解と保守が難しくなるため、2 番目の形式をお勧めします。

于 2012-05-09T01:32:52.350 に答える
0

「totalCommCalc」の呼び出しは、戻り値を格納するか、他のメソッドと同様に out キーワードを使用する必要があります。他のメソッドとの一貫性を保つために、out を使用して戻り値を削除します。

 totalCommCalc(comm, out totalComm);

また

totalComm = totalCommCalc(comm, totalComm)
于 2012-05-09T01:32:43.293 に答える
0

参照ではなくで渡してtotalCommいます。変更を永続化する場合は、それをパラメーターにするか、適切な場合は関数から値を返します。totalCommref

参照渡しするには:

....
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)
于 2012-05-09T01:34:01.153 に答える
0

使用しないrefでください(@Eric Jによると、副作用のあるコードは、成長するにつれて理解と維持が難しくなる可能性があります)

1行を変更するだけです。つまり、変数に関数の戻り値を割り当てます。

totalComm = totalCommCalc(comm, totalComm);

それでおしまい。

于 2012-05-09T01:34:12.367 に答える