zoukankan      html  css  js  c++  java
  • C#类型转换

    关于C#类型转换的知识点,在各书籍以及博客文章中一抓一大把。那么我为什么又要重复这些文字呢----只因在各类文章中描述的很不错、明了,但是到了实际使用中(写代码)却被自己忽略了。仅此记下。

    例如当封装了数据库执行返回受影响行数的方法ExcuteNonQuery使其方法返回了object类型,而到了业务上层,却需要将其转换数值型,或者说直接拆箱成数值型(如int),根据其是否大于零来判断操作是否成功。

    当时我的想法是底层ExcuteNonQuery方法返回的是int类型,直接强转

    string insertStr="insert into ..."     ///插入数据库语句
    XXXDal xxxDal=new XXXDal()       //Dal底层为orm一封装好了的
    object result =xxxDal.ExcuteNonQuery(insertStr)  
    if((int)result>0)
    {
    //TODO成功后操作....
    }
    else
    {
    
    }
    

    尼玛报错了,(int)result 类转换错误。原来底层返回的object实为long类型(关于底层为什么要返回long,暂时不去理)。

    那时在这个问题上纠结了蛮久的,一、我为什么要这样写?----只是单纯的以为返回受影响行数,应该是int;二、这样写是否合理,别人框架返回一个object,而你需要将其转成int,怎样写才合理?-----1、Convert.ToInt();2、int.TryParse();3、 拆箱强转(需要知道元类型是什么)。

    C#类型

    值类型

    bool -> 布尔型,其值为 true 或者 false

    char -> 字符型,占有两个字节,表示 1 个 Unicode 字符(C#中是统一两个字节,不是所谓的中文才两个字节)

    byte -> 字节型,占 1 字节,表示 8 位正整数,范围 0 ~ 255

    sbyte ->带符号字节型,占 1 字节,表示 8 位整数,范围 -128 ~ 127

    ushort -> 无符号短整型,占 2 字节,表示 16 位正整数,范围 0 ~ 65,535

    uint -> 无符号整型,占 4 字节,表示 32 位正整数,范围 0 ~ 4,294,967,295

    ulong -> 无符号长整型,占 8 字节,表示 64 位正整数,范围 0 ~ 大约 10 的 20 次方

    short -> 短整型,占 2 字节,表示 16 位整数,范围 -32,768 ~ 32,767

    int -> 整型,占 4 字节,表示 32 位整数,范围 -2,147,483,648 到 2,147,483,647

    long -> 长整型,占 8 字节,表示 64 位整数,范围大约 -(10 的 19) 次方 到 10 的 19 次方

    float -> 单精度浮点型,占 4 个字节

    double -> 双精度浮点型,占 8 个字节

    decimal ->128位高精度浮点数,常用于金融运算,不会出现浮点数计算的误差(在CLR中不是基本类型,decimal类型变量的运算不是直接生成IL指令,而是调用System.Decimal结构的方法)

    枚举、结构体

    引用类型

    1、string

    2、object

    3、类

    4、委托

    5、接口

    6、数组

    类型转换

    基本类型之间的转换

     1、隐式转换:基本上就是位数少的可以隐式的转换成位数长的,非数值型的除外,例如char,bool。当然decimal也要注意。byte, short, int, long, float, double这个顺序前面的类型可以隐式的转成后面类型。

    2、显示转换:位数长的类型转换成位数短的类型需要进行显示的转换。当然显示的转换有可能会造成数据的错误,因为数据值在目标类型的范围外时会造成得到的结果错误,而不报异常,可以通过check进行验证捕获异常。

    值类型和引用类型的转换

    其实也就是所谓的装箱与拆箱。值类型转成引用类型为装箱操作,引用类型转换成值类型则为拆箱操作。值类型位于栈中,而引用类型位于堆中...(关于装箱与拆箱原理,涉及到的内存转换这里就不说了,有很多文章已经说得很清楚了。如《你必须知道的.net》中就写的非常好)。

    回过头来

    所以现在回过头来,其实上面自己的代码是错误的,object转成数值型,是拆箱操作。强制的拆箱操作只能是先将对象转成原先类型的变量,然后再显示转换成int:

    long l=(long) result;    //result本身是long装箱而成

    int i=(int)l;               //显示转换

    不过并不需要写得这么麻烦,.net Framework 提供给我们一个很强大的基本类型转换的帮助类:Convert 

    当然也可以使用int.Parse(result.ToString()); 只是Parse只接受string类型参数。

    结论:其实这个问题没什么好纠结的,是把强制类型转换和拆箱弄一块去了。

    Top
    收藏
    关注
    评论
  • 相关阅读:
    display:none;与visibility:hidden;的区别
    前端优化:雅虎35条
    JQ中find()和filter()的区别
    attr属性
    媒体查询器(转)@media screen and
    javascript解决URL (转)
    使用 js 处理 html entities(转)
    FileReader详解与实例---读取并显示图像文件
    HTML5中File对象初探
    createTextRange和createRange的一些用法(重点)
  • 原文地址:https://www.cnblogs.com/Joy-et/p/4508284.html
Copyright © 2011-2022 走看看