首页 > 解决方案 > 使用 usassigned 局部变量,但变量已赋值

问题描述

我正在使用 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";
        }


    }
}

我在forms.cs的这段代码中收到错误“使用未分配的局部变量'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);

因为我不希望我的尺码被固定为 Big、Medium、Small 或 None。我不知道该怎么做。有没有人有任何提示?提前致谢!

标签: c#winforms

解决方案


所以是分配的,但不是同时分配的???

我了解这些编译器消息令人困惑,并为此道歉。

随着时间的推移,处理明确分配的错误消息和识别可能错误代码的警告是零碎添加的,并且没有一个可靠的计划来保持它们的一致性。

当我在编译器团队时,我多次尝试让它们更一致和更清晰,但至少可以说这项工作取得了喜忧参半的成功。对所有这些尝试的详细解释将使我们走得更远。我过去写过一些文章和答案;您可能感兴趣的其中之一是这三部分系列

简单的解释是错误和警告使用“分配”来表示两个不同的东西。错误信息是:

use of unassigned local variable 'size'

但这并不完全正确。它应该说的是“局部变量size在读取之前没有明确地在所有可能的控制流上分配一个值”。

如果您查看您的代码,您会发现如果采用 final 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的唯一路径是 read

第二种技术:在所有路径上添加分配:

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

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


推荐阅读