zoukankan      html  css  js  c++  java
  • 关于System.Convert那些事

    关于System.Convert那些事

    前言

    不知咋的,今天腰疼的不行,疼的站不起来了,今下午突然就疼起来了,,这是身体要垮了的节奏啊,再加上自己的VAX试用期到了,弄了半天也不行,.

    正文

    看到过一个这种代码:

    bool?obj=从server返回来的值,可能为null.

    if(obj!=null&&Convert.ToBoolean(obj)==true)
    {
    //code
    }


    上面的代码非常清楚,先推断obj是不是null,假设不是null的话,再调用Convert.ToBoolean方法,推断是不是true.

    上面的方法没有不论什么问题,可是有一点要确认的是,obj!=null这句话须要推断吗?

    于是有了以下的代码

           

     static void Test()
            {
                Type t = typeof(Convert);
                var methods = t.GetMethods(BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static);
     
                foreach (var method in methods)
                {
                    if (!method.Name.StartsWith("To"))
                    {
                        continue;
                    }
     
                    var paras = method.GetParameters();
                    if (paras.Length==1&¶s[0].ParameterType==typeof(object))
                    {
                        object result;
                        try
                        {
                            result = method.Invoke(null, new object[] { null });
                        }
                        catch (Exception)
                        {
                            Console.WriteLine("{0}:{1}",method.Name,"转换null失败");
                            continue;
                        }
                        Console.WriteLine("{0}:转换后的值为 {1}",method.Name,result==null?

    "null" :(result.ToString().Equals(string.Empty))?"空字符串":(result is char)?"空字符":result); } } }


    能够看到,method.Invoke(null,new object[]{null})

    刻意的为ToXXX方法传递null.

    结果是这种呢?

    输出例如以下:

    ToBoolean:转换后的值为 False
    ToChar:转换后的值为 空字符
    ToSByte:转换后的值为 0
    ToByte:转换后的值为 0
    ToInt16:转换后的值为 0
    ToUInt16:转换后的值为 0
    ToInt32:转换后的值为 0
    ToUInt32:转换后的值为 0
    ToInt64:转换后的值为 0
    ToUInt64:转换后的值为 0
    ToSingle:转换后的值为 0
    ToDouble:转换后的值为 0
    ToDecimal:转换后的值为 0
    ToDateTime:转换后的值为 0001/1/1 0:00:00
    ToString:转换后的值为 空字符串

    从而证明了,ConvertToXXX方法传递null值是不会抛出异常的,而且不返回默认的值.

    比如int : 0 ,string : “” ,char :’’ , bool : false

    有了上面这个几轮有声没用处呢?

    这代表了上面的代码能够简化为

    if(Convert.ToBoolean(obj))
    {
    //code
    }


    顺道提一下

    这种代码会抛出异常:

    Convert.ToChar(null);


    可是这种代码不会抛出异常:

               

     object obj = null;
                Convert.ToChar(obj);//返回’’空字符

    出现上述的原因是啥呢?

    Convert.ToChar(null)在内部实际调用的是Convert.ToChar(null,null),然而ToChar(null,,null)的实现例如以下:

    if (value == null){     throw new ArgumentNullException("value");}
    if (value.Length != 1){     throw new FormatException(Environment.GetResourceString("Format_NeedSingleChar"));}
    return value[0];


    所以直接传递null值会抛出异常.

  • 相关阅读:
    jquery另外一种类似tab切换效果
    简单的Tab切换组件
    switchable图片切换
    web前端性能优化总结
    iframe之间通信问题及iframe自适应高度问题
    javascript cookie
    grunt项目构建工具
    input全选与单选(把相应的value放入隐藏域去)
    Ajax跨域问题
    Jquery回到顶部功能
  • 原文地址:https://www.cnblogs.com/clnchanpin/p/7123008.html
Copyright © 2011-2022 走看看