先看看.NET協助是怎麼說明的:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Convert類的作用是將一個基礎資料型別 (Elementary Data Type)轉換為另一個基礎資料型別 (Elementary Data Type)。
存在將每個基底類型轉換為每個其他基底類型的轉換方法。不過,所執行的實際轉換操作分為三類:
1、從某類型到它本身的轉換隻返回該類型。不實際執行任何轉換。
2、無法產生有意義的結果的轉換引發 InvalidCastException 不實際執行任何轉換。下列轉換會引發異常:a、從 Char 轉換為 Boolean、Single、Double、Decimal 或 DateTime,以及從這些類型轉換為 Char。b、從 DateTime 轉換為除 String 之外的任何類型,以及從任何類型(String 除外)轉換為 DateTime。
3、任何基底類型(上面描述的基底類型除外)都可以與任何其他基底類型進行相互轉換。
註:如果結果超出了特定轉換方法的傳回值類型所能表示的範圍,則將引發異常。)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
從上面的說明和分析實現代碼的基礎上,我總結了以下幾點:
1、所有的基底類型都實現了介面IConvertible,ToString()為顯示實現,其他轉換為隱示實現
2、對於Char和Boolean、Single、Double、Decimal 或 DateTime之間引發異常的轉換,實際執行的代碼是在對應的類型裡面(即Boolean、Single、Double、Decimal、DateTime)或Char裡面。比如Char和Boolean之間的相互轉換,這要取決於是調用ToChar(bool value),還是調用ToBoolean(char value)。不過不管是Boolean還是Char 都是通過 IConvertible 借口實現的。
Convert.ToBoolean(char value)方法的代碼:
public static bool ToBoolean(char value)
{
return ((IConvertible) value).ToBoolean(null);
}
Convert.ToChar(char value)方法的代碼:
public static char ToChar(bool value)
{
return ((IConvertible) value).ToChar(null);
}
而對於其餘合法的轉換(Char到String的轉換除外),實現的代碼是在Convert類本身裡面,不調用任何類的其他方法。
Convert.ToString(char value)方法的代碼:
public static string ToString(char value)
{
return char.ToString(value);
}
3、DateTime和除String之外的類型轉換會引發異常,實現代碼及調用關係同Char一樣。DataTime和String之間的相互轉換ToDateTime(string value)和ToString(DateTime value)的代碼如下:
Convert.ToDateTime(string value)方法的代碼:
public static DateTime ToDateTime(string value)
{
if (value == null)
{
return new DateTime((long) 0);
}
return DateTime.Parse(value, CultureInfo.CurrentCulture);
}
Convert.ToString(decimal value)方法的代碼:
public static string ToString(DateTime value)
{
return value.ToString();
}
可以看出最終轉換的實現代碼都在DateTime類中。
4、Decimal類和其他類型的轉換,首先Decimal和Char、DateTime的之間的相互轉換符合2和3點的規則。除此之外,分兩種情況:第一,Decimal到其他的類型的轉換(當然Char、DateTime除外)在Decimal裡有public方法的實現,所以Convert類中相應的轉換會調用Decimal的實現(此時Single和Double也除外,不知道為什麼,同時在Decimal裡ToSingle和ToDouble方法的實現也比較怪異,誰知道什麼原因):
Convert.ToInt32(decimal value)方法的代碼:
public static int ToInt32(decimal value)
{
return decimal.ToInt32(decimal.Round(value, 0));
}
第二、從其他類型(Char、DateTime、String除外)到Decimal轉換的實現代碼是在Convert類中實現的,String到Decimal的轉換是在Decimal實現的:
Convert.ToDecimal(string value)方法的代碼:
public static decimal ToDecimal(string value)
{
if (value == null)
{
return new decimal(0);
}
return decimal.Parse(value, CultureInfo.CurrentCulture);
}
5、String和其他類型之間轉換的調用關係比較簡單,我們平時使用的次數也最多。最終轉碼基本上都是實現在其他類型裡面(String到Char的轉換除外),String到其他類型的轉換為Parse方法,其他類型到String的轉換為ToString。Convert中對於他們轉換的代碼也基本上是調用這兩個系列的方法。
.NET架構內部類之間的調用關係和設計結構比較錯綜複雜,寫這個的目的就是剝離複雜的層面尋找其中的規律來提高我們應用的靈活性和對.NET架構更深入理解,因為我發現光看是遠遠不夠的,當寫出來的時候才發現其實有好多東西沒有理解透徹。同時希望大家指出錯誤之處,多多交流,共同提高~