C# 類型轉換

1 強制轉換

       (int)table1.rows["id"][0]; 這種轉換在編程中不建議使用,是一種裝箱拆箱的過程,就是說被轉換類型本身必須是將要轉換成的那種類型,否則必然出錯;

如: 

object objTest = new NewType();
NewType newValue = (NewType)objTest;

2.   Convert

       該類基本支持所以類型之間的轉換。但也要求轉換類型本身必須是將要轉換成的那種類型,否則也會出錯;

如: 

Convert.toInt32(table1.rows["id"][0]);

3.   DataType.Parse()

       Note:上述3種方法是不安全的,需要用try-catch語句來進行保護。

4.   DataType.TryParse()

       如果轉換不成功,會直接給目標變量賦初值。如:

decimal p1;
decimal.TryParse("{}", out p1);

5.   As

       如:

object objTest = new NewType();
NewType newValue = objTest as NewType;

       對於as操作符來說,當需要轉換對象的類型屬於轉換目標類型或者轉換目標類型的派生類型的時候,那麼此轉換操作才能成功,而且並不產生新的對象。因此用as來進行類型轉換使安全的。爲什麼用as操作符進行類型轉換的效率要高於老式的類型轉換的,因爲用as操作符進行轉換就如前面所說的,首先判斷當前對象的類型,當類型滿足要求後才進行轉換。而傳統的類型轉換方式,是用當前對象直接去轉換,而且爲了保護轉換成功,要加上try-catch,這就決定了它的效率不會高於as操作符的效率。

       要注意的時候,不管用傳統方式,還是用as操作符進行類型轉換之後,在使用之前,需要進行判斷轉換是否成功,如下:

if( newValue!= null )
{
        //Work with the object named "newValue"
}

       Note:使用as操作符有如下幾點限制。

       1)不用在類型之間進行類型轉化,即如下編寫就會出現編譯錯誤。

NewType newValue = new NewType();
NewType1 newValue = newValue as NewType1;

       2)不能應用在值類型數據,即不能如下寫(也會出現編譯錯誤)。

object objTest = 11;
int nValue = objTest as int;

       對於第一點所提的,可以用傳統的類型轉換方式來完成,但是隻用如下的方式,是不能正確完成。

NewTypeOne newTestOne = new NewTypeOne();
NewTypeTwo newTestTwo = (NewTypeTwo)newTestOne;

       要想使上面的操作能正確完成,在原有類型中增加類型轉換操作符函數,即需要完成類似如下的代碼。

public class NewTypeOne
{
     public static explicit operator NewTypeTwo( NewTypeOne objTest )
     {
            //Convert object into new type
      }
}

       對於第二點所提的,在C#中可以使用is操作符,再加上老式的類型轉換操作,就可以安全完成轉換,那麼要完成如上操作,正確的寫法如下。

object objTest = 11;
if( objTest is int )
{
    int nValue = (int)objTest;
}

6.(int)、int.Parse()、int.TryParse()、Convert.ToInt32()比較

       (int)是一種類型轉換;當我們從int類型到longfloatdoubledecimal類型,可以使用隱式轉換,但是當我們從long類型到int類型就需要使用顯式轉換,否則會產生編譯錯誤。

       int.Parse()是一種類容轉換;表示將數字內容的字符串轉爲int類型。int.Parse 只能轉換數字類型的字符串。如果字符串爲空,則拋出ArgumentNullException異常;如果字符串內容不是數字,則拋出FormatException異常;如果字符串內容所表示數字超出int類型可表示的範圍,則拋出OverflowException異常;

       int.TryParseint.Parse又較爲類似,但它不會產生異常,轉換成功返回 true,轉換失敗返回 false。最後一個參數爲輸出值,如果轉換失敗,輸出值爲0

       Convert.ToInt32()是一種類容轉換;但它不限於將字符串轉爲int類型,還可以是其它類型的參數;

       比較:

       Convert.ToInt32 參數爲 null 時,返回 0

       int.Parse 參數爲 null 時,拋出異常;

       Convert.ToInt32 參數爲 "" 時,拋出異常;

       int.Parse 參數爲 "" 時,拋出異常;

       Convert.ToInt32 可以轉換的類型較多。

7. ToString()、Convert.ToString()、(string)、as比較

       ToString()Convert.ToString()由別的對象得到 string 對象,它們間的區別只表現在要轉換的對象爲null時,如果objnull,調用obj.ToString方法會導致 NullReferenceException異常,調用Convert.ToString不會拋出異常而返回一個null

       用強制轉換 (string)obj要求obj的運行時類型必須是string。如果不是,就會拋出異常。

       as方法則會相對平穩,當obj的運行時類型不是string時會返回null而不拋出異常。

       所以在通常在我們需要得到某個對象的string表達形式時,我們應該使用ToStringConvert.ToString,這時候你就得根據情形選一個,假如你能保證你的對象不爲null,則兩個差不多。如果有可能爲null,你就應該用Convert.ToString,如果你希望它爲null 的時候拋出異常,那麼當然可以選擇ToString

       這裏是說objectstring,如果在其它類型上調用第一種ToString(),得到的不一定是實際的內容,可能是對該類的描述,這取決於該類如何實現ToString()方法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章