标签:line system start 自己 false boolean turn 字符串 source
不知咋的,今天腰疼的不行,疼的站不起来了,今下午突然就疼起来了,唉,这是身体要垮了的节奏啊,再加上自己的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:转换后的值为 空字符串
从而证明了,对Convert的ToXXX方法传递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值会抛出异常.
标签:line system start 自己 false boolean turn 字符串 source
原文地址:http://www.cnblogs.com/clnchanpin/p/7123008.html