首页 > 解决方案 > C# 值单元化

问题描述

我有一个问题,我一直试图解决很长一段时间,但我就是无法解决它。我有两个已初始化的双变量。显然,我得到了一个错误,因为它们应该有一个值。但是,我可以将其设置为唯一的值是 0。问题是,如果我将值设置为 0,我的程序将无法正确运行,并且我的程序的输出也变为 0。

错误:局部变量“userSalary”在访问之前可能未初始化

我还在学习方法、参数和参数的方式。

class Program
{
    static void Main(string[] args)
    {
        double userSalary;
        double leftOver;
        AskQuestion(userSalary);
        CalculateTax(userSalary, leftOver);
    }
    
    static void AskQuestion(double userSalary)
    {
        Console.WriteLine("What is annual your salary?");
        userSalary = Convert.ToDouble(Console.ReadLine());

    }

    static void CalculateTax(double userSalary, double leftOver)
    {
        if (userSalary <= 14_000) //10%
        {
            Console.WriteLine("You are in Tax Category 1. 10% of your Salary goes to the state!");
            Console.WriteLine("Calculating Salary...");
            Thread.Sleep(500);
            leftOver = userSalary - (userSalary * 10 / 100);
            Console.WriteLine("Your Salary after taxation is: $" + leftOver);
        }
    }

}

标签: c#methodsparametersarguments

解决方案


您在这里有多个问题。

首先,您的“错误:本地变量 'userSalary' 在访问之前可能未初始化”问题:

虽然在构造类时将字段(类级变量)初始化为其默认值,但不会初始化方法变量。为此,您需要为它们分配一个值。例如:

double userSalary = 0;
double leftOver = 0;

您遇到的下一个问题是所有变量都是按值传递的(即制作副本)而不是按引用传递。请注意,这并不是说被传递的类型不是引用类型,而是变量表示的指针作为副本传递。你可以在这里阅读更多内容。

这对您意味着,虽然AskQuestion更改了它自己的userSalary参数变量,但它不会更改调用方法的变量。解决此问题的一种方法是使用reforout关键字。(ref在变量已经初始化但方法改变它out的地方使用,在方法初始化变量的地方使用)。更多关于这里

所以你可以这样写你的代码:

static void AskQuestion(out double userSalary)

然后这样称呼它:

double userSalary;
AskQuestion(out userSalary);

或者简单地说:

AskQuestion(out double userSalary);

尽管更好的方法是让该方法简单地返回结果。我们还将删除leftOver参数,CalculateTax因为它没有在任何地方使用:

注意:您应该始终使用TryParseStyle 方法来验证用户输入

static double AskQuestion()
{
   double userSalary;
   Console.WriteLine("What is annual your salary?");
   // simple validation loop
   while (!double.TryParse(Console.ReadLine(), out userSalary))
      Console.WriteLine("You had one job... What is annual your salary?");
   return userSalary;
}

static void CalculateTax(double userSalary)
{
    if (userSalary <= 14_000) //10%
    {
        Console.WriteLine("You are in Tax Category 1. 10% of your Salary goes to the state!");
        Console.WriteLine("Calculating Salary...");
        Thread.Sleep(500);
        double leftOver = userSalary - (userSalary * 10 / 100);
        Console.WriteLine("Your Salary after taxation is: $" + leftOver);
    }
}

然后像这样初始化userSalary和调用CalculateTax

userSalary = AskQuestion();
CalculateTax(userSalary);

推荐阅读