天天看點

C#中的資料類型轉換總結

      初學c#經常為這幾種資料類型轉換方式而迷茫,為了徹底搞清它們之間的差別和優缺點,結合網上前輩總結的資料和自己的動手驗證,在此寫出來,一方面,為那些跟我有過相似經曆的朋友們搜尋資料的時候能提供一點微小的幫助,另一方面,希望前輩們路過的時候指導一下,看哪裡有不合适的地方。

    衆所周知,C#是一門強類型語言,對類型要求比較嚴格,但是在一定的條件下是可以互相轉換的,如将int型資料轉換成double型資料。C#允許使用兩種轉換方式:隐式轉換和顯式轉換。

1、隐式轉換

隐式轉換就是系統預設的、不需要加以聲明就可以進行的轉換。隐式轉換不要求在源代碼中使用任何特殊文法,編譯器自動執行隐式強制轉換。在隐式轉換過程中,編譯器無需對轉換進行詳細檢查就能夠安全地執行轉換。隐式強制轉換也稱為“擴充轉換“,因為要将窄資料類型轉換為寬資料類型,且還将確定不會在轉換過程中丢失資料。(注意:(1)轉換前後的類型必須相相容 (例如:int和double  (2)、隐式數值轉換實際上就是從低精度的數值類型到高精度的數值類型的轉換,即小的類型轉大的類型)

int a = 10;
double b = a;//隐式轉換
           

2、顯式轉換

顯式類型轉換,又叫強制類型轉換。與隐式轉換正好相反,顯式轉換需要使用者明确地指定轉換的類型。顯式轉換包括所有的隐式轉換,也就是說把任何系統允許的隐式轉換寫成顯式轉換的形式都是允許的。用()實作顯示轉換,這表示,把轉換的目标類型名放在要轉換的值之前的圓括号中。

long val = 30000;
int i = (int)val;//顯式轉換
           

提醒:

(1)、顯式轉換可能會導緻錯誤。進行這種轉換時編譯器将對轉換進行溢出檢測。如果有溢出說明轉換失敗,就表明源類型不是一個合法的目标類型。無法進行類型轉換。

(2)、強制類型轉換會造成資料精度丢失。

3、通過方法進行類型轉換

(1)、使用ToString()方法。所有類型都繼承了Object基類,是以都有ToString()這個方法(轉化成字元串的方法)。

int i=200;
string s=i.ToString();
//這樣字元串類型變量s的值就是”200” 。 
           

(2)、通過int.Parse()方法轉換,參數類型隻支援string類型。注意:使用該方法轉換時string的值不能為NULL,不然無法通過轉換;另外string類型參數也隻能是各種整型,不能是浮點型,不然也無法通過轉換 (例如int.Parse("2.0")就無法通過轉換)。

int i;
i = int.Parse("100");
           

(3)、通過int.TryParse()方法轉換,該轉換方法與int.Parse()轉換方法類似,不同點在于int.Parse()方法無法轉換成功的情況該方法能正常執行并傳回0。也就是說int.TryParse()方法比int.Parse()方法多了一個異常處理,如果出現異常則傳回false,并且将輸出參數傳回0。

int i;
string s = null;
int.TryParse(s,out i);
           
bool isSucess=int.TryParse("12", out i);//輸出值為12;True
bool isSucess=int.TryParse("ss", out i);//輸出值為0;False
bool isSucess=int.TryParse("", out i);//輸出值為0;False
           

(4)、通過Convert類進行轉換,Convert類中提供了很多轉換的方法。使用這些方法的前提是能将需要轉換的對象轉換成相應的類型,如果不能轉換則會報格式不對的錯誤(即前提為面上要過得去例如string類型的“666”可以轉換為整數型666,string類型的“666aaa”卻轉換不成整數型 )。

static void Main(string[] args)
{
     float num1=82.26f;
     int integer,num2;
     string str,strdate;
     DateTime mydate=DateTime.New;
     //Convert類的方法進行轉換
     integer=Convert.ToInt32(num1);
     str=Convert.ToString(num1);
     strdate=Convert.ToString(mydate);
     num2=Convert.ToInt32(mydate);
     Console.WriteLine("轉換為整型資料的值{0}",integer);
     Console.WriteLine("轉換為字元串{0},str");
     Console.WriteLine("日期型資料轉換為字元串值為{0}",strdate);
     Console.ReadKey();
}
           

附:Convert類常用的類型轉換方法

方法 說明
Convert.ToInt32() 轉換為整型(int)
Convert.ToChar() 轉換為字元型(char)
Convert.ToString() 轉換為字元串型(string)
Convert.ToDateTime() 轉換為日期型(datetime)
Convert.ToDouble() 轉換為雙精度浮點型(double)
Conert.ToSingle() 轉換為單精度浮點型(float)

(5)、 實作自己的轉換,通過繼承接口IConventible或者TypeConventer類,進而實作自己的轉換。

注意:以Int類型為例,int.Parse,Convert.ToInt和int.TryParse的比較

【1】.參數和适用對象不同

int.Parse的參數資料類型隻能是string類型,适用對象為string類型的資料

convert.toInt參數比較多,具體可以參見最下面的重載清單

int.TryParse的參數隻能是隻能是string類型,适用對象為string類型的資料

【2】.異常情況不同

異常主要是針對資料為null或者為""的情況

Convert.ToInt32 參數為 null 時,傳回 0;Convert.ToInt32 參數為 "" 時,抛出異常;int.Parse 參數為 null 時,抛出異常。; int.Parse 參數為 "" 時,抛出異常。int.TryParse()方法比int.Parse()方法多了一個異常處理,如果出現異常則傳回false,并且将輸出參數傳回0。

【3】.傳回值不同

int.TryParse與int.Parse和Convert.ToInt 在傳回值的不同是傳回bool類型。擷取轉換後的值是通過out result這個參數擷取的。

4、使用AS操作符轉換

使用AS操作符轉換,但是AS隻能用于引用類型和可為空的類型。使用as有很多好處,當無法進行類型轉換時,會将對象指派為NULL,避免類型轉換時報錯或是出異常。C#抛出異常在進行捕獲異常并進行處理是很消耗資源的,如果隻是将對象指派為NULL的話是幾乎不消耗資源的(消耗很小的資源)。

(未完待續)

5、裝箱和拆箱

裝箱和拆箱在值類型和引用類型之間架起了一座橋梁,使得任何 value-type 的值都可以轉換為 object 類型的值,反過來轉換也可以。

裝箱:裝箱是指将一個值類型的資料隐式地轉換成一個對象類型(object)的資料。執行裝箱操作時不可避免的要在堆上申請記憶體空間,并将堆棧上的值類型資料複制到申請的堆記憶體空間上,這肯定是要消耗記憶體和cpu資源的。注意:在執行裝箱轉換時,也可以使用顯式轉換。

int i = 0;
  object obj = i;   //裝箱:值類型轉換為引用類型
  int j = (int)obj;  //拆箱:引用類型轉換為值類型
           

拆箱:拆箱是指将一個對象類型的資料顯式地轉換成一個值類型資料。拆箱過程是裝箱的逆過程,是将存儲在堆上的引用類型值轉換為值類型并賦給值類型變量。拆箱操作分為兩步:一是檢查對象執行個體,確定它是給定值類型的一個裝箱值;而是将該值從執行個體複制到值類型變量中。

裝箱拆箱注意事項:

裝箱操作可以隐式進行,但拆箱操作必須顯示。

在裝箱的時候,并不需要顯示類型轉換。但在拆箱時需要類型轉換。

這是因為在拆箱時對象可以被轉換為任何類型。

裝什麼拆什麼

裝箱就是要在托管堆重開辟空間,不但要裝數值而且還要裝類型

是以說裝什麼拆什麼,也就是用什麼值類型裝箱,就要用什麼值類型拆箱。

C#中的資料類型轉換總結

裝箱和拆箱都是要消耗記憶體和cpu資源的,也就造成效率降低,是以要盡量避免使用。

裝箱拆箱應用——定義方法

static void add(object i)
        { 
              ……
        }
        static void Main(string[] args)
        {
            
 	short s = 10;
               int i = 100;
            	long l = 1000;

            	add(s);
            	add(i);
            	add(l);        
        }
           

注:可以了解為我定義一個object類型,好多小類型可以指派過來。