【问题标题】:TryParse places 0 on the variable when parse fails [duplicate]解析失败时,TryParse 在变量上放置 0 [重复]
【发布时间】:2016-04-20 13:33:14
【问题描述】:

获取此代码sn-p。

string input = "";
int value = 10;
bool success = int.TryParse(input, out value);

无论我在input 中使用什么,无论是null"""a" 等,当它不是有效数字时,它都会返回false,并将0 移动到value

TryParse() 不是要返回一个布尔值,告知解析成功吗?解析失败时,不应该保持变量不变吗?

这很烦人。所以在调用TryParse()之前我需要一个变量来保存这个值,并创建一个if来验证它的结果,如果失败,将之前的值复制回变量中?

更新。我没有找到official doc 中描述的这种行为,你能指出微软在哪里描述的吗?

我的意思是,一般地解析,TryParse()specially,不仅仅意味着解析字符串。这也意味着验证字符串。如果TryParse() 失败并返回false,这不是错误或异常,这意味着字符串不是有效的int(或任何数据类型),所以我必须处理这个无效的字符串。这可能需要变量的先前值。如果变量设置为 0,则之前的值丢失。

为什么放置一个垃圾值并丢失以前的值?这样,正如我所说,我需要第二个变量来保存该值,这是一种浪费。

我可以扩展或包装TryParse(),但我需要对所有数据类型都这样做。

【问题讨论】:

  • 不能不设置——这是一个out参数。如果您需要所需的功能,将其封装在另一个采用 ref 参数的方法中并不难。
  • 在我看来,它的行为与记录的完全一样:“当此方法返回时,如果转换成功,则包含与 s 中包含的数字等效的 32 位有符号整数值,或者为零如果转换失败。”
  • 关于您的编辑/更新 - @JonSkeet 引用的部分位于 result 下的 Parameters 部分
  • 另外你没有丢失你试图解析的值,它仍然在input中。如果要设置默认值value,请执行int value; if (!int.TryParse(input, out value)) { value = 10 }; 即,而不是之前设置,失败后设置。

标签: c# .net parsing try-catch tryparse


【解决方案1】:

int.TryParse 将数字的字符串表示形式转换为其等效的 32 位有符号整数。返回值表示操作是否成功;所以我们能做的是:

if(int.TryParse(input, out value))
{
 // proceed with your code
} 
else 
{
 // show some message that the input is not valid
}

【讨论】:

    猜你喜欢
    • 2014-06-03
    • 1970-01-01
    • 2022-08-06
    • 2021-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多