C# C值单位化

C# C值单位化,c#,methods,parameters,arguments,C#,Methods,Parameters,Arguments,我有一个问题,我一直在努力解决了很长一段时间,但我只是不能把我的头围绕它。 我有两个初始化的双变量。显然,我得到了一个错误,因为它们应该有一个值。但是,我只能将其设置为0。问题是,如果我将该值设置为0,我的程序将无法正常运行,并且程序的输出也将变为0 错误:访问前可能未初始化局部变量“userSalary” 我仍然在学习方法、参数和参数的方法 class Program { static void Main(string[] args) { double user

我有一个问题,我一直在努力解决了很长一段时间,但我只是不能把我的头围绕它。 我有两个初始化的双变量。显然,我得到了一个错误,因为它们应该有一个值。但是,我只能将其设置为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);
        }
    }

}
类程序
{
静态void Main(字符串[]参数)
{
双薪制;
双份剩菜;
提问(用户工资);
CalculateAX(用户工资、剩余);
}
静态无效AskQuestion(双重用户工资)
{
你的年薪是多少;
userSalary=Convert.ToDouble(Console.ReadLine());
}
静态void CalculateAX(双用户工资,双剩余)
{

如果(userSalary您在这里遇到多个问题

首先,您的“错误:访问前可能未初始化局部变量‘userSalary’”问题:

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

double userSalary = 0;
double leftOver = 0;
下一个问题是,所有变量都是通过值传递的(即创建副本),而不是通过引用传递的。请注意,这并不是说传递的类型不是引用类型,而是变量所表示的指针是作为副本传递的。您可以阅读更多相关内容

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

因此,您可以这样编写代码:

static void AskQuestion(out double userSalary)
然后这样称呼它:

double userSalary;
AskQuestion(out userSalary);
或者简单地说:

AskQuestion(out double userSalary);
虽然更好的方法是让方法简单地返回结果。我们还将从
CalculateTax
中删除
剩余的
参数,因为它在任何地方都不使用:

注意:您应该始终使用
TryParse
风格的方法来验证用户输入

使用:


我认为应该使用方法返回值,而不是将变量传递给它。这只解决了一个问题。
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 = AskQuestion();
CalculateTax(userSalary);
double userSalary=0.0;
double leftOver=0.0;