关于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 :’\0’ , bool : false

 

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

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

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


 

顺道提一下

这种代码会抛出异常:

Convert.ToChar(null);


 

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

           

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

 

出现上述的原因是啥呢?

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值会抛出异常.

 

 

posted @ 2017-07-05 19:00  clnchanpin  阅读(381)  评论(0编辑  收藏  举报