我正在完成一个未完成的C# WinForms项目,这是一个未指定游戏的保存游戏编辑器。我注意到角色肖像和图标的 ID 的有效范围是 1 到 905,但是没有代码来验证角色 ID 是否在该范围内,所以我选择修复它。我对此有一个正在进行的解决方案,其代码(许多函数名称部分经过编辑)位于本文末尾,并且想知道它是否有效。 Visual Studio 表示不存在格式错误,但我知道仅此还不够。我无法编译进行测试,因为我还没有达到代码可编译的阶段,缺少大量 WinForms 数据。如果我设置的特定例外不合适,那么什么例外最适合?如果不应该以这种方式使用 while 循环,我应该使用什么方法而不需要从头开始重写整个代码块?这是我到目前为止的相关代码:
void getImage(int slot)
{
short ID = 0;
if (slot == 1)
{
try
{
ID = convertStringtoID(comboBoxSlot1ID.Text);
}
catch (System.FormatException)
{
ID = 0;
}
while (ID > 0 && ID < 906)
{
if (ID < 10)
{
pictureBoxSlot1Portrait.Image = (Image)Properties.Resources.ResourceManager.GetObject("00" + ID);
pictureBoxSlot1Icon.Image = (Image)Properties.Resources.ResourceManager.GetObject("dot00" + ID);
}
else if (ID > 9 && ID < 100)
{
pictureBoxSlot1Portrait.Image = (Image)Properties.Resources.ResourceManager.GetObject("0" + ID);
pictureBoxSlot1Icon.Image = (Image)Properties.Resources.ResourceManager.GetObject("dot0" + ID);
}
else if (ID > 99 && ID < 906)
{
pictureBoxSlot1Portrait.Image = (Image)Properties.Resources.ResourceManager.GetObject("" + ID);
pictureBoxSlot1Icon.Image = (Image)Properties.Resources.ResourceManager.GetObject("dot" + ID);
}
else
{
try { }
catch (System.IndexOutOfRangeException)
{
ID = 0;
}
}
}
我还无法尝试或测试任何东西;这只是一个关于 C# 代码的有效使用的问题。我还看到了 1 个与我在发布此内容之前在“可能相关的问题”部分中提出的问题类似但不相同的问题,尽管它确实部分表明我正在做的事情可能没问题。如果
IndexOutOfBoundsException
大于 905,我希望代码抛出 ID
,如果不是,则读取正确的图像文件。
记下这个结构:
try
{
ID = convertStringtoID(comboBoxSlot1ID.Text);
}
catch (System.FormatException)
{
ID = 0;
}
注意
try
块如何包装可能会失败的操作。与此结构对比:
try
{
}
catch (System.IndexOutOfRangeException)
{
ID = 0;
}
try
块内的哪些操作可能会失败,为什么?
任何可能失败的操作都会在
try
块内进行。如果该操作是一个完整的循环,那么整个循环都会去那里。
但是,这里所拥有的首先并不是异常的有效使用。不要依赖异常条件,您可以直接在代码中检查。
值得注意的是循环逻辑:
while (ID > 0 && ID < 906)
如果
ID
不在这个范围内,那么循环将不会再次迭代。在此范围之外,如果您想在不在此范围内时将 ID
设置为 0
,这是一个简单的 if
条件:
if (ID <= 0 || ID >= 906)
{
ID = 0;
}
或者,也许在您的特定代码范围内,如果该
else
块的目标是将 ID
设置为 0
那么您可以...将 ID
设置为 0
:
else
{
ID = 0;
}
(请注意,即使是前面所示的结构上有效的 try/catch 也可以用逻辑替换。看一下
TryParse
方法。)
try { }
catch (System.IndexOutOfRangeException)
{
ID = 0;
}
这没有任何作用,应该删除。
"00" + ID
您只需执行
ID.ToString("000")
即可获取该数字的零前缀三位数字符串。
I am expecting the code to throw IndexOutOfBoundsException if ID is greater than 905
返回对象
针对调用者当前文化设置本地化的资源值。如果存在适当的资源集但找不到名称,则该方法返回 null。
那么你为什么期待
IndexOutOfBoundsException
?
while (ID > 0 && ID < 906)
您没有在循环内递增 ID,因此此循环将是无限的。
I noticed that character portraits and icons IDs have a valid range of 1 to 905
对这些值进行硬编码并不是一个好主意,因为这样的事情经常会发生变化。您可能应该列出资源文件中的所有图标,并从某种列表中显示有效选项。或者只是尝试检索用户输入的任何内容,如果不存在则通知用户失败。