使用已分配的局部变量,但已分配了变量

时间:2020-04-22 18:34:30

标签: c# winforms

我正在使用C#形式的一个小项目(Visual Studio)工作,但遇到了问题。

forms.cs中包含以下代码:

private void Dierbutton_Click(object sender, EventArgs e)
{
    string name = AnimalNameTextbox.Text;
    bool fleshEater = CarnivoorCheckbox.Checked;
    Animal.Sizes size;


    if (AnimalSizeBig.Checked)
    {
        size = Animal.Sizes.Big;
    }
    else if (AnimalCheckboxMedium.Checked)
    {
        size = Animal.Sizes.Medium;
    }
    else if (AnimalCheckboxSmall.Checked)
    {
        size = Animal.Sizes.Small;
    }
    else
    {
        MessageBox.Show("Vul een grootte in!");
    }

    Animal newAnimal = new Animal(size, fleshEater, name);

    allAnimals.Add(newAnimal);
    DierListbox.Items.Add(newAnimal.Name);

}

以及我Animal.cs类中的以下代码:

namespace Circustrein_algoritmic
{
    public class Animal
    {
       public enum Sizes
        {
            None = 0,
            Small = 1,
            Medium = 3,
            Big = 5
        }
        public Sizes Size;
        public bool Flesheater { get; set; }
        public string Name { get; set; }


        /// <param name="size">Size</param>
        /// <param name="flesheater">True of flase wanneer dier vleeseter is</param>
        /// <param name="name">Name</param>

        public Animal(Sizes size, bool flesheater, string name)
        {
            Size = size;
            Flesheater = flesheater;
            Name = name;
        }


        public string getType()
        {
            return Flesheater ? "Flesheater" : "Planteater";
        }


    }
}

在表单中的这段代码中,我收到错误消息“使用未分配的局部变量'size'”

Animal newAnimal = new Animal(size, fleshEater, name);

但是当我将代码更改为此:

Animal newAnimal = new Animal(Animal.Sizes.Big, fleshEater, name);

该错误更改为以下警告:“已分配变量'size',但从不使用其值。

因此已分配,但不是同时分配???? 我不想将代码更改为此:

Animal newAnimal = new Animal(Animal.Sizes.Big, fleshEater, name);

因为我不想将尺寸固定为“大”,“中”,“小”或“无”。 我不知道该怎么办。 有人有提示吗? 预先感谢!

4 个答案:

答案 0 :(得分:7)

因此已分配,但不是同时分配??

我了解这些编译器消息令人困惑,对此深表歉意。

随着时间的推移,逐渐添加了处理确定分配的错误消息和标识可能错误代码的警告,并且没有可靠的计划来使它们保持一致。

当我在编译器团队中时,我做了几次尝试,以使它们更一致,更清晰,但是至少可以说,这项工作取得了不同的成功。对所有这些尝试的详尽解释将使我们走到更远的地方。我过去写过一些文章和答案; this three part series是您可能会感兴趣的人之一。

简单的解释是错误和警告使用“ assigned”来表示两个不同的事物。错误消息是:

use of unassigned local variable 'size'

但是那不是很正确。应该说的是,“在读取之前,未在所有可能的控制流上为局部变量size绝对分配一个值”。

如果您查看代码,就会发现如果使用了最后的else,则size永远不会被写入,但是在该代码路径上它仍是 read ,这是一个错误。没有价值可阅读!

然后您删除 read ,错误消失了,因为未能初始化一个从未读取的变量不是错误。但是,现在的代码看起来是错误的。您做了工作尝试尝试来初始化size,但是您从未使用过该工作,所以这可能是一个错误。警告:

The variable 'size' is assigned but its value is never used.

使用“已分配”的意思是“在此方法的某个点上,您已为该局部变量分配了一个值,但是却从未读取过,所以为什么要分配该值?”

这种警告并不经常出现;编译器通常会抑制它。为什么?因为这种模式非常普遍:

int dummy = Blah(); 
// Note, dummy is never read, but I want to observe it in the debugger.

但是在您的代码中,编译器知道您可能不是出于调试目的而使用size您只为其分配了常量。它的价值何在?您只需阅读代码即可知道每个控制流的确切值。

这就是区别:在错误中,“未分配”表示“未在每个控制流上明确分配”,在警告中,“已分配”表示“至少分配了一次”。

我不知道该怎么办。

有两种方法可以进行。

第一种技术:保持分配不变,但要避免在读取时缺少分配的代码路径。例如:

else
{
    MessageBox.Show("Vul een grootte in!");
    return;
}

现在没有问题;唯一未分配size的路径在读取size之前返回

第二种方法:在所有路径上添加分配:

else
{
    MessageBox.Show("Vul een grootte in!");
    size = Animal.Sizes.None;
}

现在,读取之前的每个路径上都有一个分配。

答案 1 :(得分:5)

如果您点击else语句,则不会为size分配任何值;因此出现编译错误。

要么在声明时初始化变量,要么在else块中分配一个值。

答案 2 :(得分:1)

好吧,所以说“使用未分配的变量”的原因是,在代码可能存在的路径中(在您的第一个代码段中)可能没有分配该路径-如果命中该命中就会发生您的最终if块(您在其中打印消息)。

您也可以通过在方法的THAT部分内分配一个大小来修复它,也可以在MessageBox.show之后插入一个“返回”,这样它就可以简单地退出该方法而无需创建完全是“动物”(因此不会传递未初始化的大小)。

答案 3 :(得分:1)

除了其他人发布的内容之外,我想指出的是,切换到“已分配大小,但从未使用过”的错误与“使用未分配的”并不完全矛盾/相反-如果您坐在那里抓挠你的头说:“下定决心-是分配还是不分配?!”那么您可以查看其他答案以获取有关第一个错误的详细信息:

  • “使用未分配的”表示“在代码中存在一些可能的路径,在使用此变量之前可能未为其分配值”;您可以通过谷歌搜索“ c#明确赋值”来阅读很多技术信息

  • 和第二个错误-“已分配但从未使用”基本上意味着“大小仅出现在=“的左侧,因此它正在检测到您为其分配了一个值,但随后您没有从未真正利用过它

您可以想象,两者并不冲突-可能会出现这样的情况:您使用了一个可能没有值的变量,而如果您放弃使用该变量,则只会留下代码路径,分配一个值,但不要使用它

相关问题