• C#中的空值的判断 和 Convert.ToInt32()和int.Parse()的区别


    (1)NULL

      null 关键字是表示不引用任何对象的空引用的文字值。null 是引用类型变量的默认值。那么也只有引用型的变量可以为NULL,如果 int i=null,的话,是不可以的,因为Int是值类型的。

      (2)""和String.Empty

       这两个都是表示空字符串。只不过""理论上重新开辟内存空间,而String.Empty指向一处。不过优化器会优化的!

       string.Empty不分配存储空间, ""分配一个长度为空的存储空间,所以一般用string.Empty,为了以后跨平台,还是用string.empty。在 C# 中,大多数情况下 "" 和 string.Empty 可以互换使用。比如:

    string s = "";

    string s2 = string.Empty;



    if (s == string.Empty) {

    //

    }if语句成立

      判定为空字符串的几种写法,按照性能从高到低的顺序是:

    s.Length == 0 优于 s == string.Empty 优于 s == "" 

      注意:

       1.string str1="" 和 string str2=null 的区别。str1是一个空字符串,空字符串是一个特殊的字符串,只不过这个字符串的值为空,在内存中是有准确的指向的,string str2=null,这样定义后,只是定义了一个string 类的引用,str2并没有指向任何地方,在使用前如果不实例化的话,都将报错。

      2.在net 2.0中可用String.IsNullOrEmpty(param)检测是否为null或为空值。

      当Request.QueryString的标识不存在时返回的是NULL,可以在空串上调用string类的所有方法,但null不可以,不可以在null上调用方法。

      (3)DBNULL

       DBNull在DotNet是单独的一个类型, 该类用于指示不存在某个已知值(通常在数据库应用程序中)。该类只能存在唯一的实例,DBNULL.Value, DBNull唯一作用是可以表示数据库中的字符串,数字,或日期,为什么可以表示原因是DotNet储存这些数据的类(DataRow等)都是以 object 的形式来储存数据的。对于 DataRow , 它的 row[column] 返回的值永远不为 null , 要么就是具体的为column 的类型的值 。 要么就是 DBNull 。 所以 row[column].ToString() 这个写法永远不会在ToString那里发生NullReferenceException。DBNull 实现了 IConvertible 。 但是,除了 ToString 是正常的外,其他的ToXXX都会抛出不能转换的错误。

      您可以通过将从数据库字段检索到的值传递给 DBNull.Value.Equals 方法,确定该字段值是否为 DBNull 值

      (4)Convert.IsDBNull()

       Convert.IsDBNull()返回有关指定对象是否为 DBNull 类型的指示,即是用来判断对象是否为DBNULL的。其返回值是True或Flase。

      PS:本文经个人网上收集整理,并加入开发中遇到的问题,在此澄清请不要做人身攻击,本文的目的只是只是共享

    以下两点为自己总结,并且已经经过了验证。
    1,Convert.ToInt32()被重写19次,可以满足不同的参数需要
          int.Parse()被重写4次,只能转化string
    2,参数为null时
                  Convert.ToInt32()返回0
                   int.Parse()ArgumentNullException.Value cannot be null.Parameter name: String
         参数中包含字母时包括12ab这种情况,都抛出FormatExcepton异常,Input string was not in a correct format.
    所以在使用的时候假如用Convert.ToInt32()可以省掉一个ToString(),但是增加了一个对NULL的判断具体解释如下:
     
     
     
    以下内容转载于菜菜灰的空间 http://hi.baidu.com/caicaihui/blog/item/d12d2938ee2cb524b8998f27.html
     
    试验进行一亿次转换的时间,结果相同,说明这两个在将字符串转换为整数时基本没区别.(40多秒差0.x秒,应该算是没差别吧)
    这两个方法的最大不同是它们对null值的处理方法:Convert.ToInt32(null)会返回0,而不会产生任何异常;但int.Parse(null)则会产生异常。
    没搞清楚Convert.ToInt32和int.Parse()的细细微区别时千万别乱用,否则可能会产生无法预料的结果。
    举例来说:假如从url中取一个参数ID的值,我们知道这个值是一个int,所以即可以用Convert.ToInt32 (Request.QueryString["ID"]),也可以用,int.Parse(Request.QueryString["ID"]),但是如果ID这个参数在url中不存在,那么前者将返回0,0可能是一个有效的值,所以你不知道url中原来根本就没有这个参数而继续进行下一下的处理,这就可能产生意想不到的效果,而用后一种办法的话没有ID这个参数会抛出异常,我们可以捕获异常然后再做相应的处理,比如提示用户缺少参数,而不是把参数值当做0来处理。
    以下内容转自:http://blog.csdn.net/scucj/archive/2006/06/28/846344.aspx
    在 C# 中,(int),Int32.Parse() 和 Convert.toInt32() 三种方法有何区别?
        int 关键字表示一种整型,是32位的,它的 .NET Framework 类型为 System.Int32。

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

        Int32.Parse()表示将数字的字符串转换为32 位有符号整数,属于内容转换[1]。
        我们一种常见的方法:public static int Parse(string)。
        如果 string 为空,则抛出 ArgumentNullException 异常;
        如果 string 格式不正确,则抛出 FormatException 异常;
        如果 string 的值小于 MinValue 或大于 MaxValue 的数字,则抛出 OverflowException 异常。


        Convert.ToInt32() 则可以将多种类型(包括 object  引用类型)的值转换为 int  类型,因为它有许多重载版本[2]:
        public static int ToInt32(object);
        public static int ToInt32(bool);
        public static int ToInt32(byte);
        public static int ToInt32(char);
        public static int ToInt32(decimal);
        public static int ToInt32(double);
        public static int ToInt32(short);
        public static int ToInt32(long);
        public static int ToInt32(sbyte);
        public static int ToInt32(string);
        ......


        (int)和Int32.Parse(),Convert.ToInt32()三者的应用举几个例子:    

        例子一:

        long longType = 100;
        int intType  = longType;       // 错误,需要使用显式强制转换
        int intType = (int)longType; //正确,使用了显式强制转换

        例子二:

        string stringType = "12345";
        int intType = (int)stringType;                //错误,string 类型不能直接转换为 int  类型
        int intType = Int32.Parse(stringType);   //正确

        例子三:

        long longType = 100;
        string stringType = "12345";
        object objectType = "54321";
        int intType = Convert.ToInt32(longType);       //正确
        int intType = Convert.ToInt32(stringType);     //正确
        int intType = Convert.ToInt32(objectType);    //正确

        例子四[1]:

        double doubleType = Int32.MaxValue + 1.011;
        int intType = (int)doubleType;                                //虽然运行正确,但是得出错误结果
        int intType = Convert.ToInt32(doubleType)            //抛出 OverflowException 异常

       (int)和Int32.Parse(),Convert.ToInt32()三者的区别:

        第一个在对long 类型或是浮点型到int 类型的显式强制转换中使用,但是如果被转换的数值大于 Int32.MaxValue 或小于 Int32.MinValue,那么则会得到一个错误的结果。

        第二个在符合数字格式的 string 到 int  类型转换过程中使用,并可以对错误的 string 数字格式的抛出相应的异常。

        第三个则可以将多种类型的值转换为 int 类型,也可以对错误的数值抛出相应的异常。

        无论进行什么类型的数值转换,数值的精度问题都是我们必须考虑的[1]。



    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/rj03hou/archive/2008/02/19/2107329.aspx
     
     做个推广不要喷我!
    浩缘朋 新款男士带帽短款羽绒服男正品清仓 秋冬男款男装外套
  • 相关阅读:
    codevs 1199 开车旅行 2012年NOIP全国联赛提高组
    poj 3349 Snowflake Snow Snowflakes
    poj 3264 Balanced Lineup
    求二进制数中1的个数
    20个正则表达式,减少千行代码
    推流脚本
    Navicat 管理工具下载地址,破解版
    emoji表情处理研究
    计算机网络学习
    tcp/ip 学习-通过视频学习
  • 原文地址:https://www.cnblogs.com/stalwart/p/1925362.html
Copyright © 2020-2023  润新知