• C#中强制转换、Convert转换 和Parse转换的差异(二)


    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+"\r\n ");

     

    myint = Int32.Parse(myString);

    Console.Write(myint+"\r\n ");

     

    Int32.TryParse(myString, out myint);

    Console.Write(myint+"\r\n");

     

    }

    }

    }

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


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

    运行结果:
    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 只能转换数字类型的字符串。

    参考资料:

    -------------------------------------------------------------------------------------------------------------------------------------------------
    数据库优化
    数据库教程
    数据库实战经验分享博客

    百度云下载

    评测


  • 相关阅读:
    (转)Tomcat7+Redis存储Session
    (转)Nginx SSL+tomcat集群,request.getScheme() 取到https正确的协议
    Oracle行转列、列转行的Sql语句总结(转)
    http升https笔记
    quartz 线程问题
    SQL语句汇总
    IDEA 入坑
    ssm 配置文件intit
    黑马-springMvC 运行加载顺序
    实训--git 好文
  • 原文地址:https://www.cnblogs.com/longle/p/Parse2.html
Copyright © 2020-2023  润新知