2010-10-13 30 views
1

在将字符串(通常)转换为适当的数据类型时,似乎还存在很多混淆,同时也会对它进行实时验证。无论我在哪里看 - 博客,文章,代码示例,论坛......有几个人似乎都有首选处理这些情况的方式。转换来自未知来源的C#数据类型

的情况下通常是一个字符串/对象是来自未知来源,如查询字符串,会议/视图状态,WebService的,等...

我见过很多不同的例子:

假设我们试图获取id=查询字符串并将其作为整数在我们的代码中使用。但有人篡改了我们的网址,并将其改为

http://www.example.com/page.aspx?id=sometextvalue

一种方式

int id = Convert.ToInt32(Request["id"]); 
// "Input string was not in a correct format" 

另一种方式

int id = (int)Request["id"]; 
// "Input string was not in a correct format" 

另一种方式

int id = int.Parse(Request["id"]); 
// "Input string was not in a correct format" 

我所见过这个(它那种有道理抛出一个异常,并通知用户)

int id = 0; 
try { 
    id = Convert.ToInt32(Request["id"]); 
} 
catch(Exception ex) { 
    lblError.Text = ex.Message; 
} 
if(id > 0) { ... } 

最后,和一个我亲自使用

int id = 0; 
int.TryParse(Request["id"], out id); 

// make sure it's not 0 
if(id > 0) { // live a happy life } 

这同样适用于所有其他类型,booldoubledecimal等..

请帮助我理解正确的方法是什么,因为我发现自己使用这个在一天到一天的基础上。

+0

正确的地方。这就是为什么人们对Ruby/Python如此兴奋!专注于行为和数据类型可以稍后处理 – Perpetualcoder 2010-10-13 02:29:53

回答

6

嗯,首先,你应该使用:

int id; 
if(!int.TryParse(Request["id"], out id) 
    //notify the user, or handle it someother way 

,而不是检查ID> 0 int.TryParse(string, out int)返回true如果解析成功,否则false

MSDN Documentation for int.TryParse(string, out int)

+0

感谢@wawa,我不知道TryParse返回一个布尔值。 – Marko 2010-10-13 02:18:26

0

我不认为任何这些实际上被认为是“正确的”。我喜欢使用Convert.ToInt32(),因为我可以得到一些特定的异常,我可以检查它是否有效的输入。

+0

'Convert.ToInt32'产生与'int.Parse'相同的异常。 – Gabe 2010-10-13 02:39:42

+0

而你应该依赖布尔返回的TryParse方法,因为异常不应该驱动你的程序流。 – 2010-10-13 04:36:00

0

正确:答案是,这取决于。你应该学习类型化,解析的区别。适当地使用它们。

+0

嗯,我想我已经解释了这个场景...... – Marko 2010-10-13 02:19:01

+0

但是,对于所有的场景都没有一揽子答案。 – shaans 2010-10-13 02:23:15

4

System.ComponentModel命名空间包含了整整做这类转换的一个精心设计的框架。

检查命名空间为自己,但是这将让你去为首发:

targetType newValue = (targetType) System.ComponentModel.TypeDescriptor.GetDescriptor(typeof(sourceType)) 
    .ConvertTo((object)value, typeof(targetType)) 

你得到的基本类型转换为免费在一个集中式不可知的地方,而不是通过遗憾的是不一致的搜索在基元类型上找到的X.Parse或X.TryParse方法。

在基础知识之上,你会得到一个可扩展的框架,你可以在其他的东西写你自己的类型转换。 ASP.NET MVC框架大量使用这个命名空间来处理它的类型转换,例如查询字符串值转换为方法参数。

+0

这看起来很有趣@James,我会试着找到更多关于它的信息。 – Marko 2010-10-13 02:27:50

+1

+1,我相信这只是一个错字,NEWVALUE应该是目标类型和的ConvertTo() – 2010-10-13 03:32:17

+0

@克里斯Talyor的结果同样投:正确。该帖子已更新。谢谢。 – 2010-10-13 04:34:53