通过引用传递一个变量并且"返回"两个变量

时间:2014-06-28 00:01:51

标签: c# pass-by-reference

所以我试图传入一个变量money变量,并将其分解为两个变量。当我只传入一个值时,我陷入困境并试图弄清楚如何传回两个值。我应该从用户那里获得双倍的金钱价值并将其分成两个int值。因此,例如,我得到一个像3.45这样的值并将其拆分并打印出消息," 3.45美元和#34;有3美元和45美分。我理解通过引用传递,但我只想弄清楚我说如何获得两个变量。我只能将money变量传递给方法 我知道我的节目不对。只是寻找一些关于如何做到这一点的想法和解释。感谢

 using System;

 static class Program
 {
      //Declare any constansts
      const int ONE_HUNDRED = 100;

     static void Main()
     {
         //Declare local variables
         double money = 0;

         //Ask the user to input a money value
         Console.WriteLine("Please enter a money value. (ex. 2.95)");

         //Store the value in a variable
          money = double.Parse(Console.ReadLine());

          //Take the variable and call the SplitMoney method
          SplitMoney(ref money);

          //Display the message
          Console.WriteLine("There are {0:d} and {1:d} cents in ${0:f2}", money, dollars cents);

          Console.ReadLine();
     }//End Main()

      //Split Money Method
      //Purpose: To split the money into dollars and cents
      //Parameters: One double passed by reference
      //Returns: Nothing
      static void SplitMoney(ref double money)
      {
            money = (int)(money * ONE_HUNDRED);
            int dollars = (int)(money / ONE_HUNDRED);
            int cents = (int)(money % ONE_HUNDRED);
      }
   }//End class Program

2 个答案:

答案 0 :(得分:3)

对于你的问题:

public class SplittedMoney
{
    public int Dollars { get; set; }
    public int Cents { get; set; }
}

你回来了。那将是最简单的方法。

更好的方法可能是:

public struct SplittedMoney
{
    public readonly int Dollars;
    public readonly int Cents;

    public SplittedMoney(int dollars, int cents)
    {
        Dollars = dollars;
        Cents = cents;
    }
}

这样更好,因为拆分的美元仍然是一个值,所以使用不可变结构就是这里的方法。

现在,不要在任何需要精确十进制计算的事情中使用double 。使用decimal代替他们为该任务设计的内容。 double可能失去精度是基数10,因为它在基数2中存储和操纵。decimal旨在保持基数10的精度。


这里使用上述结构重写了SplitMoney

  static SplittedMoney SplitMoney(decimal money)
  {
        var totalCents = (int)(money * 100);
        int dollars = (int)(totalCents / 100);
        int cents = (int)(totalCents % 100);
        return new SplittedMoney(dollars, cents);
  }

答案 1 :(得分:0)

嗯,SplitMoney当前返回0值。您可以继续变异money以仅包含美元值,然后实际从方法返回cents

  static int SplitMoney(ref double money)
  {
        money = (int)(money * ONE_HUNDRED);
        int dollars = (int)(money / ONE_HUNDRED);
        int cents = (int)(money % ONE_HUNDRED);
        return cents;
  }

然后当你使用它时:

var moneyCents = SplitMoney(ref money);
Console.WriteLine("money = {0:f2}.{1:f2}", money, moneyCents);

更好的是,您可以返回包含dollarscents的元组:

  static Tuple<int,int> SplitMoney(double money)
  {
        var totalCents = (int)(money * ONE_HUNDRED);
        int dollars = (int)(money / ONE_HUNDRED);
        int cents = (int)(money % ONE_HUNDRED);
        return Tuple.Create(dollars,cents);
  }

将用作

var splitMoney = SplitMoney(money);
Console.WriteLine("money = {0:f2}.{1:f2} from {2:d}",
    splitMoney.Item1, splitMoney.Item2, money);