分类

链接

2011 年 10 月
 12
3456789
10111213141516
17181920212223
24252627282930
31  

近期文章

热门标签

新人福利,免费薅羊毛

现在位置:    首页 > .NET, Others > 正文
共享办公室出租
C#中强制转换、Convert转换 和Parse转换的差异(二)
.NET, Others 暂无评论 阅读(2,768)

v

Parse , Covert.To,TryParse类型转换

 (2009-02-08 15:14:26)

标签: 

杂谈

分类: Asp.net

这2个方法都可以把string转换为int,那么他们有什么区别?什么时候该用什么?性能如何。
其实在2.0里还有Int32.TryParse也实现了同样的效果。

using System;

using System.Collections.Generic;

using System.Text;

 

namespace ConsoleApplication1

{

class Program

{

static void Main(string[] args)

{

string myString = "1234";

int myint = 0;

 

myint = Convert.ToInt32(myString);

Console.Write(myint+"rn ");

 

myint = Int32.Parse(myString);

Console.Write(myint+"rn ");

 

Int32.TryParse(myString, out myint);

Console.Write(myint+"rn");

 

}

}

}

表面上看,可见3个方法都实现了同样的效果!
那么我们把代码改一下:

//string myString = "1234";
string myString = null;
int myint = 0;
myint = Convert.ToInt32(myString);
Console.Write(myint+"rn");
myint = Int32.Parse(myString);
Console.Write(myint+"rn");
Int32.TryParse(myString, out myint);
Console.Write(myint+"rn");

运行结果:
Convert.ToInt32()在null时不抛异常而是返回0;
Int32.Parse()要抛异常;
Int32.TryParse()不抛异常,会返回true或false来说明解析是否成功,如果解析错误,调用方将会得到0值。

得出结论:
3个方法几乎没有差异!

如果要追求完美,那么可以参靠一下性能的差异:
Int32.TryParse()优于Int32.Parse()优于Convert.ToInt32()。

个人建议:.NET1.1下用Int32.Parse();.NET2.0用Int32.TryParse()。

为什么这样呢?
因为:Convert.ToInt32会把最终的解析工作代理给Int32.Parse,而Int32.Parse和Int32.TryParse则分别把解析工作直接代理给Number.ParseInt32和Number.TryParseInt32,前者在出现解析错误时会抛出异常,而后者则仅仅返回 false。

 

 

Convert.ToInt32 与 int.Parse 较为类似,实际上 Convert.ToInt32 内部调用了 int.Parse:

Convert.ToInt32 参数为 null 时,返回 0; 转换继承自Object的对象为int
int.Parse 参数为 null 时,抛出异常。          转换String为int

Convert.ToInt32 参数为 "" 时,抛出异常;
int.Parse 参数为 "" 时,抛出异常。

Convert.ToInt32 可以转换的类型较多;
int.Parse 只能转换数字类型的字符串。
int.TryParse 与 int.Parse 又较为类似,但它不会产生异常,转换成功返回 true,转换失败返回 false。最后一个参数为输出值,如果转换失败,输出值为 0。

举例说明:string str="1234"; int32.parse(str);Convert.toint32(str);

来看system这个基类:
以int到string类型的转换,不带格式的转换为例,当我们使用int32.parse(str)的时候,他其实是在调用mscorlib基类库的system类中的构造类型int32中的Parse方法。而这个方法调用了本构造中的一个重载(Overload)方法Parse。
public static int Parse(string s)
{
return Parse(s, NumberStyles.Integer, null);
}

而重载的parse中采取调用system中只读函数Nunber
public static int Parse(string s, NumberStyles style, IFormatProvider provider)
{
NumberFormatInfo instance = NumberFormatInfo.GetInstance(provider);
NumberFormatInfo.ValidateParseStyle(style);
return Number.ParseInt32(s, style, instance);
}

Nubmer中的PasreInt32会去执行转换。
好,int的分析到此。看Convert的转换,
当我们调用Convert.toint32这个方法的时候看看Convert类是怎么执行的!

public static int ToInt32(string value, IFormatProvider provider)
{
if (value == null)
{
return 0;
}
return int.Parse(value, NumberStyles.Integer, NumberFormatInfo.GetInstance(provider));
}

你会发现他直接就去找了int这个类的Parse方法。而这个方法直接去执行了int32中parse的那个重载的方法。可见殊途同归他们最后到要落到只读类Number身上去进行类型转换。性能差距在进行到Number之前就产生了!在parse中他会直接找到自身,而Convert转化string到什么类型最终都是落到该类型的parse身上,所以针对string类型的转换还是本身类型的parse效率更高一些。

 

Convert.ToInt32、int.Parse(Int32.Parse)、int.TryParse、(int) 四者都可以解释为将类型转换为 int,那它们的区别是什么呢?

Convert.ToInt32 与 int.Parse 较为类似,实际上 Convert.ToInt32 内部调用了 int.Parse:

  • Convert.ToInt32 参数为 null 时,返回 0;
  • int.Parse 参数为 null 时,抛出异常。
  • Convert.ToInt32 参数为 "" 时,抛出异常;
  • int.Parse 参数为 "" 时,抛出异常。
  • Convert.ToInt32 可以转换的类型较多;
  • int.Parse 只能转换数字类型的字符串。

int.TryParse 与 int.Parse 又较为类似,但它不会产生异常,转换成功返回 true,转换失败返回 false。最后一个参数为输出值,如果转换失败,输出值为 0。

int m;
if(int.TryParse("2"),out m)
{
...
}
返回true ,运行{}内,并给m赋值为2;

if(int.TryParse("ddd"),out m)
{
...
}
返回false,不运行if{}内,并给m赋值为0;

(int) 属 cast 转换,只能将其它数字类型转换成 int 类型,它不能转换字符串,比如下例就会失败:

string v = "1";
int n = (int)v;
 

int i = -1;
int.TryParse(null, out i);

执行完毕后,i等于0,而不是等于 -1,切记。

1 (int)是一种类型转换;当我们从int类型到long,float,double,decimal类型,可以使用隐式转换,但是当我们从long类型到int类型就需要使用显式转换,否则会产生编译错误。

2 int.Parse()是一种类容转换;表示将数字内容的字符串转为int类型。   如果字符串为空,则抛出ArgumentNullException异常;   如果字符串内容不是数字,则抛出FormatException异常;   如果字符串内容所表示数字超出int类型可表示的范围,则抛出OverflowException异常;

3 int.TryParse 与 int.Parse 又较为类似,但它不会产生异常,转换成功返回 true,转换失败返回 false。   最后一个参数为输出值,如果转换失败,输出值为 0

4 Convert.ToInt32()是一种类容转换;但它不限于将字符串转为int类型,还可以是其它类型的参数; 比较:   Convert.ToInt32 参数为 null 时,返回 0; int.Parse 参数为 null 时,抛出异常。    Convert.ToInt32 参数为 "" 时,抛出异常; int.Parse 参数为 "" 时,抛出异常。   Convert.ToInt32 可以转换的类型较多; int.Parse 只能转换数字类型的字符串。

 

============ 欢迎各位老板打赏~ ===========

本文版权归Bruce's Blog所有,转载引用请完整注明以下信息:
本文作者:Bruce
本文地址:C#中强制转换、Convert转换 和Parse转换的差异(二) | Bruce's Blog

发表评论

留言无头像?