關於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:轉換後的值為 空字符串
從而證明了,對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值會拋出異常.
關於System.Convert那些事