zoukankan      html  css  js  c++  java
  • 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 只能转换数字类型的字符串。

    参考资料:

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

    百度云下载

    评测


  • 相关阅读:
    OLAP ODS项目的总结 平台选型,架构确定
    ORACLE ORA12520
    ORACLE管道函数
    ORACLE RAC JDBC 配置
    ORACLE RAC OCFS连接产生的错误
    ORACLE 启动和关闭详解
    OLAP ODS项目的总结 起步阶段
    ORACLE RAC 配置更改IP
    ORACLE RAC OCR cann't Access
    ORACLE RAC Debug 之路 CRS0184错误与CRS初始化
  • 原文地址:https://www.cnblogs.com/longle/p/Parse2.html
Copyright © 2011-2022 走看看