Chinaunix首页 | 论坛 | 博客
  • 博客访问: 371358
  • 博文数量: 48
  • 博客积分: 1084
  • 博客等级: 少尉
  • 技术积分: 496
  • 用 户 组: 普通用户
  • 注册时间: 2010-12-17 14:09
文章分类

全部博文(48)

文章存档

2014年(2)

2013年(3)

2012年(13)

2011年(24)

2010年(6)

分类: 嵌入式

2011-03-16 14:27:17

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]。
阅读(6042) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~