我正在使用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);
因为我不想将尺寸固定为“大”,“中”,“小”或“无”。 我不知道该怎么办。 有人有提示吗? 预先感谢!
答案 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#明确赋值”来阅读很多技术信息
和第二个错误-“已分配但从未使用”基本上意味着“大小仅出现在=“的左侧,因此它正在检测到您为其分配了一个值,但随后您没有从未真正利用过它
您可以想象,两者并不冲突-可能会出现这样的情况:您使用了一个可能没有值的变量,而如果您放弃使用该变量,则只会留下代码路径,分配一个值,但不要使用它