c# - 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);
}
}
}
解决方案
您在这里有多个问题。
首先,您的“错误:本地变量 'userSalary' 在访问之前可能未初始化”问题:
虽然在构造类时将字段(类级变量)初始化为其默认值,但不会初始化方法变量。为此,您需要为它们分配一个值。例如:
double userSalary = 0;
double leftOver = 0;
您遇到的下一个问题是所有变量都是按值传递的(即制作副本)而不是按引用传递。请注意,这并不是说被传递的类型不是引用类型,而是变量表示的指针作为副本传递。你可以在这里阅读更多内容。
这对您意味着,虽然AskQuestion
更改了它自己的userSalary
参数变量,但它不会更改调用方法的变量。解决此问题的一种方法是使用ref
orout
关键字。(ref
在变量已经初始化但方法改变它out
的地方使用,在方法初始化变量的地方使用)。更多关于这里。
所以你可以这样写你的代码:
static void AskQuestion(out double userSalary)
然后这样称呼它:
double userSalary;
AskQuestion(out userSalary);
或者简单地说:
AskQuestion(out double userSalary);
尽管更好的方法是让该方法简单地返回结果。我们还将删除leftOver
参数,CalculateTax
因为它没有在任何地方使用:
注意:您应该始终使用TryParse
Style 方法来验证用户输入
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);
推荐阅读
- angular - 等待 http req 单元完成角度(服务)
- html - 将自定义 css 添加到树枝模板,样式不适用
- angular - 角度 6 HttpInterceptor 未触发
- r - 为 ggplot facet_wrap 设置数据
- sql - 检查亚马逊Athena / Presto中两个间隔是否重叠的方法
- vba - Powerpoint - 通过 VBA 将组保存为图像
- android - 您的应用尚未获准加入亲子同乐,并且更新未在 Google Play 上发布
- php - 从 created_at 字段获取日期和时间
- git - 从 Bitbucket 克隆存储库的特定文件夹
- php - 如何使用 htaccess angular 4 prod 重定向除两个文件夹内容之外的所有请求