1. 程式人生 > >關於System.Convert那些事

關於System.Convert那些事

方法 osi system popu exception mes tox resource object

關於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值會拋出異常.

關於System.Convert那些事