【问题标题】:Check if number is 32 bit unsigned without warnings? [duplicate]检查数字是否为 32 位无符号且没有警告? [复制]
【发布时间】:2019-10-10 11:27:00
【问题描述】:

这是一个谜题,我收到一个字符串形式的数字。我需要检查这个输入,确保它是一个有效的无符号 32 位数字(应该拒绝负数)。问题是它是针对“0 个警告”项目的,所以这不起作用:

    try
    {
        uint input = Convert.ToUInt32(textBoxSN.Text.ToString());
    }
    catch(Exception ex)
    {
        //error handling
    }

因为我收到警告“变量 'ex' 已声明但从未使用过。”而且我没有使用该变量的有用方法。如果使用 'ex' 写一行没有效果,我会收到警告。

此外,我的程序的结构方式,我不想对这个函数中的变量“输入”做任何事情,只是验证。所以我也收到警告说“输入”已声明但从未使用过。有任何想法吗?不是超级重要,只是 C# 中的一个有趣问题。

【问题讨论】:

  • 如果textBoxSN.Text 不是Int32,你希望发生什么?
  • UInt32.TryParse。那么你就不需要为任何异常的东西或未使用的变量而烦恼了。
  • 在发送表单数据时向控制台打印一条消息。
  • 另外,Text 已经是string...你不需要调用ToString() 就可以了...

标签: c# validation input


【解决方案1】:

除非我在这里遗漏了什么,否则请使用UInt32.TryParse

UInt32 ui;

if (UInt32.TryParse("100", out ui))
    Console.WriteLine("100: Valid");
else
    Console.WriteLine("100: Not Valid");

if (UInt32.TryParse("-100", out ui))
    Console.WriteLine("-100: Valid");
else
    Console.WriteLine("-100: Not Valid");

输出:

100: Valid
-100: Not Valid

没有显示编译器警告。

在你的情况下,你会像这样使用它:

UInt32 input;

if (UInt32.TryParse(textBoxSN.Text, out input))
{
    // Is valid
}
else
{
    // Is not valid
}

编辑

根据 OP 关于实际上不想使用 TryParse 语句的输出的评论:

if (UInt32.TryParse("100", out _))
    ...

如果您不使用变量来存储输出,这将丢弃输出参数的结果并删除任何编译器警告。

如果您只想处理无效值,您可以执行以下操作:

if (!UInt32.TryParse(textBoxSN.Text, out _))
{
    // Is not valid
}

【讨论】:

  • 如果我没记错的话,您没有收到编译器警告,因为您使用“输入”打印到控制台。我没有在这个函数中使用“输入”,所以我收到了一个警告。
  • @Jedediah 请查看使用out _ 的更新,它会丢弃存储在输出参数中的结果。
  • @Jedediah 请重新考虑“我不在这个函数中使用'输入'”;至少在错误消息中使用它。 “1e+3 不是有效整数”是比“无效”更有用的消息,特别是如果还有其他事情也可能使您的输入无效。
【解决方案2】:

您也可以只编写一个简单的方法,该方法接受 string 并返回反映输入是否为有效 uintbool。注意我们在这里使用uint.TryParse,如果字符串参数被成功解析为uint,它会返回一个bool表示成功,并且它会将out参数设置为解析成功的值:

public static bool IsUint32(string input)
{
    uint result;
    return uint.TryParse(input, out result);
}

然后你可以在你的代码中使用它:

if (IsUint32(textBoxSN.Text))
{
    // Valid input was entered
}

一般来说,最好避免使用异常处理 (try/catch) 进行验证,因为它更昂贵并且会导致代码混乱。

【讨论】:

    猜你喜欢
    • 2016-07-19
    • 2019-02-24
    • 2019-03-10
    • 1970-01-01
    • 2011-01-29
    • 1970-01-01
    • 1970-01-01
    • 2012-12-21
    • 2021-01-03
    相关资源
    最近更新 更多