C# 安全解析字符串的最佳实践是什么?

C# 安全解析字符串的最佳实践是什么?,c#,.net,coding-style,C#,.net,Coding Style,C#中类型转换的最佳实践是什么 如果Id不知何故变成“abc”,则此操作失败 除if-else语句外,请建议使用三元运算符和其他单行语句(如使用单行三元运算符)。还有,你们更喜欢TryParse而不是Convert&为什么?让你的同事们发言。使用int类的TryParse方法 int temp; if (int.TryParse(Request.QueryString["Id"], out temp) { // logic goes here } 如果id不包含数字,TryParse将返回

C#中类型转换的最佳实践是什么

如果Id不知何故变成“abc”,则此操作失败


除if-else语句外,请建议使用三元运算符和其他单行语句(如使用单行三元运算符)。还有,你们更喜欢TryParse而不是Convert&为什么?让你的同事们发言。

使用int类的TryParse方法

int temp;
if (int.TryParse(Request.QueryString["Id"], out temp)
  { // logic goes here }
如果id不包含数字,TryParse将返回false


更新:更改为显示
int.TryParse
TryParse
具有明显的优势,即在发生故障时,它将返回false而不是引发异常

标准模式类似于:

int value;
if (int.TryParse(Request.QueryString["Id"], out value))
{
    // Use value
}
else
{
    // Do whatever you want on failure
}
现在,还值得记住的是,您可以给
int.TryParse
一个
IFormatProvider
和一个
NumberStyles
——例如,如果这真的是一个自动生成的ID,您可能需要将
CultureInfo.InvariantCulture
指定为
IFormatProvider
(而不是用户输入的)

如果您想有效地拥有“默认值”,可以编写如下帮助器方法:

public static int? NullableTryParseInt32(string text)
{
    int value;
    return int.TryParse(text, out value) ? value : (int?) null;
}
然后,您可以这样使用:

int value = NullableTryParseInt32(text) ?? 10;

或者你可以写一个默认值的方法,当然:)

当要解决任何有几个类似解决方案的问题时,我也会试图找到一个能向代码读者表达我试图完成的任务的方法。在我的建议中,这意味着在这种特殊情况下,要使用.TryParse

使用TryParse告诉读者,不能保证输入是有效的(如果是,我将使用parse)
由于您实际上是在尝试将输入解析为int,因此您最好让代码读取您的意图

您有两种方法可以做到这一点

int i;
if (Int32.TryParse(Request.QueryString["Id"], out i))
{
}
或者你可以:

try
{
     Convert.ToInt32(Request.QueryString["Id"]);
}
catch (FormatException ex)
{
   // The field Id it's not convertible
}
catch (Exception ex)
{
   // It could throw also ArgumentException or OverflowException
}
这似乎是:
回答您的问题

使用TryParse将是最佳选择。从convert方法捕获异常是一项昂贵的操作。当然,TryParse只接受字符串,而Convert.ToInt32将接受对象,除了解析之外,还可以执行转换(取消装箱、从long/double向下转换)。

要介绍此问题的三元运算符方面:

关于三元运算符的使用,我的建议是,如果您对所讨论的代码还不太熟悉,以致于无法自然阅读,就不要使用它们。简洁让熟悉的人更熟悉,让陌生的人更陌生

当你在这里摸索了关于TryParse的讨论,你甚至不需要再仔细思考,从if-else到?:的转换将不仅仅是琐碎的,而是自动的。在那之前,你只会增加你自己的困惑


当我对某些东西不熟悉时,我会先使用“婴儿语言”代码,学习新的东西,然后将其整合到我正常的更简洁的风格中。

Temp在上述Hi Jon中永远不会为空,感谢您的回复。你会如何用三元运算符来表示?而且,不是每次我求值时都初始化“out”,匹配还是不匹配?我们不应该仅仅因为这个就避免tryParse吗?@Popo:是的,
out
参数是以任何一种方式初始化的,但是为什么要因为这个而避免
tryParse
?在默认值有意义的情况下,我添加了另外两个选项来简化此操作,但通常第一个表单才是最合适的。谢谢Jon,TryParse会只返回true/false吗?我可以像Sunrisas在使用Convert时那样检查TryParse中的异常吗?string似乎没有适合我的TryParse方法。。。你确定你不是要键入int.TryParse吗?这里的out temp不是一个问题吗?我想你的意思是使用int.TryParse没有string.TryParse,毕竟你为什么要将字符串解析为字符串;-)Hi sinrisas,我如何在tryParse中捕获异常?好吧,您可以将其放入try-catch语句中。据我所知,TryParse可以抛出的唯一异常是ArgumentException,但在这种情况下,我想您将始终向它传递一个字符串,因此您永远不会得到这样的异常。TryParse it背后的思想不是使用try-catch语句,因为它根据转换的成功返回true或false
try
{
     Convert.ToInt32(Request.QueryString["Id"]);
}
catch (FormatException ex)
{
   // The field Id it's not convertible
}
catch (Exception ex)
{
   // It could throw also ArgumentException or OverflowException
}