“使用未分配的局部变量”是什么意思?

时间:2011-04-19 01:03:29

标签: c# unassigned-variable

我不断收到annualRate,monthlyCharge和lateFee的错误。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Lab_5___Danny_Curro
{
    class Program
    {
        static void Main(string[] args)
        {
            string firstName;
            string lastName;
            int accNumber;
            string creditPlan;
            double balance;
            string status;
            Boolean late = false;
            double lateFee;
            double monthlyCharge;
            double annualRate;
            double netBalance;


            Console.Write("Enter First Name: ");
            firstName = Console.ReadLine();

            Console.Write("Enter Last Name: ");
            lastName = Console.ReadLine();

            Console.Write("Enter Account Number: ");
            accNumber = Convert.ToInt32(Console.ReadLine());


            Console.Write("Enter Credit Card Plan Number[Blank Will Enter Plan 0]: ");
            creditPlan = Console.ReadLine();

            Console.Write("Enter Balance: ");
            balance = Convert.ToDouble(Console.ReadLine());

            Console.Write("Is This Account Late?: ");
            status = Console.ReadLine().Trim().ToLower();

            if (creditPlan == "0")
            {
                annualRate = 0.35;  //35%
                lateFee = 0.0;
                monthlyCharge = balance * (annualRate * (1 / 12));
                return;
            }

            if (creditPlan == "1")
            {
                annualRate = 0.30;  //30%
                if (status == "y")
                {
                    late = true;
                }

                else if (status == "n")
                {
                    late = false;
                }
                if (late == true)
                {
                    lateFee = 25.00;
                }
                monthlyCharge = balance * (annualRate * (1 / 12));
                return;
            }
            if (creditPlan == "2")
            {
                annualRate = 0.20;  //20%
                if (status == "y")
                {
                    late = true;
                }

                else if (status == "n")
                {
                    late = false;
                }
                if (late == true)
                {
                    lateFee = 35.00;
                }
                if (balance > 100)
                {
                    monthlyCharge = balance * (annualRate * (1 / 12));
                }
                else
                {
                    monthlyCharge = 0;
                }
                return;
            }
            if (creditPlan == "3")
            {
                annualRate = 0.15;  //15%
                lateFee = 0.00;

                if (balance > 500)
                {
                    monthlyCharge = (balance - 500) * (annualRate * (1 / 12));
                }
                else
                {
                    monthlyCharge = 0;
                }
                return;
            }
            netBalance = balance - (lateFee + monthlyCharge);


            Console.WriteLine("Name: \t\t\t {0}  {1}", firstName, lastName);
            Console.WriteLine("Account Number: \t{0}", accNumber);
            Console.WriteLine("Credit Plane: \t\t{0}",creditPlan);
            Console.WriteLine("Account Late: \t\t{0}", late);
            Console.WriteLine("Balance: \t\t{0}", balance);
            Console.WriteLine("Late Fee: \t\t{0}", lateFee);
            Console.WriteLine("Interest Charge: \t{0}", monthlyCharge);
            Console.WriteLine("Net Balance: \t\t{0}",netBalance);
            Console.WriteLine("Annual Rate: \t\t{0}", annualRate);
            Console.ReadKey();
        }
    }
}

11 个答案:

答案 0 :(得分:51)

编译器不够聪明,不知道至少会有一个if块被执行。因此,无论如何都不会分配像annualRate这样的变量。以下是如何使编译器理解:

if (creditPlan == "0")
{
    // ...
}
else if (creditPlan == "1")
{
    // ...
}
else if (creditPlan == "2")
{
    // ...
}
else
{
    // ...
}

编译器知道使用if / else块,其中一个块保证会被执行,因此如果你在所有块中分配变量,它将不会给编译器错误。

顺便说一句,您还可以使用switch语句代替if来使代码更清晰。

答案 1 :(得分:15)

将您的声明更改为:

double lateFee = 0.0;
double monthlyCharge = 0.0;
double annualRate = 0.0;

导致错误的原因是代码中至少有一条路径,这些路径最终没有设置为任何路径。

答案 2 :(得分:11)

因为如果if语句都没有计算为true,那么将取消分配局部变量。在那里抛出else语句,并在if语句不计算为true的情况下为这些变量赋值。如果不能使错误消失,请回到此处。

您的另一个选择是在代码开头声明变量时将变量初始化为某个默认值。

答案 3 :(得分:9)

给他们一个默认值:

double lateFee=0.0;
double monthlyCharge = 0.0;
double annualRate = 0.0;

基本上,所有可能的路径都不会初始化这些变量。

答案 4 :(得分:3)

您的分配都嵌套在条件if块中,这意味着它们有可能永远不会被分配。

在班级的顶部,将它们初始化为0或其他值

答案 5 :(得分:2)

您的代码中有许多路径,您的变量未初始化,这就是编译器抱怨的原因。

具体来说,您没有验证creditPlan的用户输入 - 如果用户输入的值不是"0","1","2" or "3",那么所有分支都不会被执行({{1}根据您的用户提示,不会默认为零)。

正如其他人所提到的,可以通过在检查分支之前对所有派生变量进行默认初始化来避免编译器错误,或者确保执行至少一个分支(即,分支的互斥性,以及堕落creditPlan声明。)

但我想指出其他潜在的改进:

  • 在您信任用户输入代码之前验证用户输入。
  • 对参数进行整体建模 - 有几个属性和计算适用于每个计划。
  • 为数据使用更合适的类型。例如else似乎有一个有限的域,更适合CreditPlanenumeration而不是Dictionary。财务数据和百分比应始终建模为string,而不是decimal,以避免舍入问题,“状态”似乎是布尔值。
  • 干掉重复的代码。计算double对于多个分支是通用的。出于维护原因,请勿复制此代码。
  • 可能更高级,但请注意,函数现在是C#的一等公民,因此您可以将函数或lambda指定为属性,字段或参数!。

e.g。这是您的模型的替代表示:

monthlyCharge = balance * annualRate * (1/12))

答案 6 :(得分:1)

如果CreditPlan无法识别,编译器会说annualRate没有值。

创建局部变量(annualRate,monthlyCharge和lateFee)时,为它们分配默认值(0)。

此外,如果信用计划未知,您应该显示错误。

答案 7 :(得分:1)

使用“默认” !!!

Int

答案 8 :(得分:0)

并非所有代码路径都为lateFee设置了值。您可能希望在顶部为其设置默认值。

答案 9 :(得分:0)

您不会在if语句之外分配值...并且可能信用可能是0,1,2或3以外的其他内容,如@iomaxx所示。

尝试将单独的if语句更改为单个if / else if / else if / else。或者在顶部指定默认值。

答案 10 :(得分:0)

如果您将变量“annualRate”声明为

课程计划 {

**static double annualRate;**

public static void Main() {

试试..