【问题标题】:C# Value unitializedC# 值未初始化
【发布时间】:2021-04-11 20:34:30
【问题描述】:

我有一个问题,我已经尝试解决了很长一段时间,但我就是无法解决它。 我有两个已初始化的双变量。显然,我得到了一个错误,因为它们应该有一个值。但是,我可以将其设置为 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# methods parameters arguments


【解决方案1】:

这里有多个问题。

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

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

double userSalary = 0;
double leftOver = 0;

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

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

所以你可以这样写代码:

static void AskQuestion(out double userSalary)

然后这样称呼它:

double userSalary;
AskQuestion(out userSalary);

或者简单地说:

AskQuestion(out double userSalary);

虽然更好的方法是让方法简单地返回结果。我们还将从 CalculateTax 中删除 leftOver 参数,因为它不会在任何地方使用:

注意:您应该始终使用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并调用CalculateTax

userSalary = AskQuestion();
CalculateTax(userSalary);

【讨论】:

    【解决方案2】:

    用途:

    double userSalary=0.0;
    double leftOver=0.0;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-08
      • 1970-01-01
      • 2011-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多