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