System.Convert 学习笔记

先看看.NET帮助是怎么说明的:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Convert类的作用是将一个基本数据类型转换为另一个基本数据类型。 

存在将每个基类型转换为每个其他基类型的转换方法。不过,所执行的实际转换操作分为三类:

  • 1、从某类型到它本身的转换只返回该类型。不实际执行任何转换。

    2、无法产生有意义的结果的转换引发 InvalidCastException 不实际执行任何转换。下列转换会引发异常:a、从 Char 转换为 BooleanSingleDoubleDecimalDateTime,以及从这些类型转换为 Char。b、从 DateTime 转换为除 String 之外的任何类型,以及从任何类型(String 除外)转换为 DateTime

    3、任何基类型(上面描述的基类型除外)都可以与任何其他基类型进行相互转换。
    注:如果结果超出了特定转换方法的返回值类型所能表示的范围,则将引发异常。)

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

从上面的说明和分析实现代码的基础上,我总结了以下几点:

1、所有的基类型都实现了接口IConvertible,ToString()为显示实现,其他转换为隐示实现

2、对于Char和Boolean、Single、Double、Decimal 或 DateTime之间引发异常的转换,实际执行的代码是在对应的类型里面(即Boolean、Single、Double、Decimal、DateTime)或Char里面。比如Char和Boolean之间的相互转换,这要取决于是调用ToChar(bool value),还是调用ToBoolean(char value)。不过不管是Boolean还是Char 都是通过 IConvertible 借口实现的。
      Convert.ToBoolean(char value)方法的代码:
      public static bool ToBoolean(char value)
      {
            return ((IConvertible) value).ToBoolean(null);
      }
      Convert.ToChar(char value)方法的代码:
      public static char ToChar(bool value)
      {
            return ((IConvertible) value).ToChar(null);
      }
 而对于其余合法的转换(Char到String的转换除外),实现的代码是在Convert类本身里面,不调用任何类的其他方法。
      Convert.ToString(char value)方法的代码:
      public static string ToString(char value)
      {
            return char.ToString(value);
      }

3、DateTime和除String之外的类型转换会引发异常,实现代码及调用关系同Char一样。DataTime和String之间的相互转换ToDateTime(string value)和ToString(DateTime value)的代码如下:
      Convert.ToDateTime(string value)方法的代码:
       public static DateTime ToDateTime(string value)
      {
            if (value == null)
            {
                  return new DateTime((long) 0);
            }
            return DateTime.Parse(value, CultureInfo.CurrentCulture);
      }

      Convert.ToString(decimal value)方法的代码:
      public static string ToString(DateTime value)
      {
            return value.ToString();
      }
可以看出最终转换的实现代码都在DateTime类中。

4、Decimal类和其他类型的转换,首先Decimal和Char、DateTime的之间的相互转换符合2和3点的规则。除此之外,分两种情况:第一,Decimal到其他的类型的转换(当然Char、DateTime除外)在Decimal里有public方法的实现,所以Convert类中相应的转换会调用Decimal的实现(此时Single和Double也除外,不知道为什么,同时在Decimal里ToSingle和ToDouble方法的实现也比较怪异,谁知道什么原因):
      Convert.ToInt32(decimal value)方法的代码:
      public static int ToInt32(decimal value)
      {
            return decimal.ToInt32(decimal.Round(value, 0));
      }
第二、从其他类型(Char、DateTime、String除外)到Decimal转换的实现代码是在Convert类中实现的,String到Decimal的转换是在Decimal实现的:
      Convert.ToDecimal(string value)方法的代码:
      public static decimal ToDecimal(string value)
      {
            if (value == null)
            {
                  return new decimal(0);
            }
            return decimal.Parse(value, CultureInfo.CurrentCulture);
      }

5、String和其他类型之间转换的调用关系比较简单,我们平时使用的次数也最多。最终转换代码基本上都是实现在其他类型里面(String到Char的转换除外),String到其他类型的转换为Parse方法,其他类型到String的转换为ToString。Convert中对于他们转换的代码也基本上是调用这两个系列的方法。

.NET框架内部类之间的调用关系和设计结构比较错综复杂,写这个的目的就是剥离复杂的层面寻找其中的规律来提高我们应用的灵活性和对.NET框架更深入理解,因为我发现光看是远远不够的,当写出来的时候才发现其实有好多东西没有理解透彻。同时希望大家指出错误之处,多多交流,共同提高~

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值