c# - 使用 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。我不知道该怎么做。有没有人有任何提示?提前致谢!
解决方案
所以是分配的,但不是同时分配的???
我了解这些编译器消息令人困惑,并为此道歉。
随着时间的推移,处理明确分配的错误消息和识别可能错误代码的警告是零碎添加的,并且没有一个可靠的计划来保持它们的一致性。
当我在编译器团队时,我多次尝试让它们更一致和更清晰,但至少可以说这项工作取得了喜忧参半的成功。对所有这些尝试的详细解释将使我们走得更远。我过去写过一些文章和答案;您可能感兴趣的其中之一是这三部分系列。
简单的解释是错误和警告使用“分配”来表示两个不同的东西。错误信息是:
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;
}
现在在读取之前的每条路径上都有一个分配。
推荐阅读
- java - ObjectOutputStream/ObjectInputStream 的文件操作问题
- javascript - 我的显示/隐藏发生在所有循环结果上,而不是一键式
- ms-access - 在原始输入后自动将数据输入修剪到 Access 中的文本框中
- javascript - React Material UI 中的网格布局问题
- python - 从 selenium web 对象中获取文本并将其逐行附加到列表中
- requirejs - 防止 RequireJS 干扰遗留代码的建议
- python - Tkinter 异步鼠标和键盘输入
- c# - C# 递归文件夹搜索无法正常工作
- python - 从python中的图像中识别棋子
- javascript - Nodejs即使找不到函数也不会出错