通过方法设置变量

时间:2017-01-23 08:18:51

标签: c#

我想通过方法设置变量。

string size
double sizeprice

这是代码

    public static void PizzaSizeUI(int choice, string size, double sizeprice, bool Quit){
        Console.WriteLine("Size");
        Console.WriteLine("1.Small");
        Console.WriteLine("2.Medium");
        Console.WriteLine("3.Large");

        //To Check if Int is entered, If a character / string is entered, program doesn't crash.
        while (!int.TryParse(Console.ReadLine(), out choice))
        {
            break;
        }


        if (choice == 1)
        {
            size = "Small";
            sizeprice = 5.00;
            Quit = true;
        }
        else if (choice == 2)
        {
            size = "Medium";
            sizeprice = 7.00;
            Quit = true;
        }
        else if (choice == 3)
        {
            size = "Large";
            sizeprice = 10.00;
            Quit = true;
        }




    }

这就是调用方法的地方

PizzaSizeUI(choice, size, sizeprice, Quit);

我已经打印了来自方法本身的值,并且已经设置了它们,但外部值仍然按原样设置,"未选择"和0。 如何通过方法设置变量?

2 个答案:

答案 0 :(得分:3)

您只是更改方法内的值。您没有给变量指定',而是复制它们(或者复制它们的引用,具体取决于类型)。

为了完成这项工作,您应该使用ref传递变量,或者如果只有输出,则应标记out

public static void PizzaSizeUI(out int choice, out string size, out double sizeprice, out bool Quit){

并使用out调用它们:

int choice;
string size;
double sizeprice;
bool Quit;
PizzaSizeUI(out choice, out size, out sizeprice, out Quit);

答案 1 :(得分:2)

你的代码是一个小块中几个代码味道的例子。

  1. 使用if时应使用case
  2. 调用void方法但期望返回结果(在CQS上阅读更多内容)
  3. 结合" UI"有逻辑
  4. 期望将值类型用作参考类型
  5. 至少,您的方法应返回某些内容,以便您获得结果。有些人可能会建议使用refout值类型参数,但我强烈反对你这样做。

    相反,你需要创建这样的东西:

    public enum PizzaSize
    {
        Small,
        Medium,
        Large
    }
    
    public struct PizzaDetails
    {
        public PizzaDetails(int choice, PizzaSize size, double price)
        {
            Choice = choice;
            Size = size;
            Price = price;
        }
    
        int Choice { get; set; }
        PizzaSize Size { get; set; }
        double Price { get; set; }
    }
    
    public class PizzaChoice
    {
        public PizzaDetails GetPizzaDetails(int choice)
        {
            switch (choice)
            {
                case 1:
                    return new PizzaDetails(choice, PizzaSize.Small, 5);
                case 2:
                    return new PizzaDetails(choice, PizzaSize.Medium, 7);
                case 3:
                    return new PizzaDetails(choice, PizzaSize.Large, 10);
                default:
                    throw new ArgumentOutOfRangeException("Invalid choice", nameof(choice));
            }
        }
    }