1. 程式人生 > >C# 資料型別轉換 顯式轉型、隱式轉型、強制轉型

C# 資料型別轉換 顯式轉型、隱式轉型、強制轉型

C# 的型別轉換有 顯式轉型隱式轉型 兩種方式。

顯式轉型:有可能引發異常、精確度丟失及其他問題的轉換方式。需要使用手段進行轉換操作。

隱式轉型:不會改變原有資料精確度、引發異常,不會發生任何問題的轉換方式。由系統自動轉換。

 不同型別的資料進行操作(加減乘除賦值等等),是需要進行 型別轉換 後,才能繼續操作。所以需要“型別轉換”。

 

隱式轉型

隱式轉型容易理解,當兩種或多種資料型別進行某種操作時,不需要干預,系統會自動進行隱式轉換。

        int i = 66666;
        long b = i;    //轉為 long 型別後為 b 賦值

 通常情況下,多種 值型別 進行計算時,系統會自動進行隱式轉型,並且總是轉為範圍更大的資料型別,並且不會發生精確度變化、數字大小變化等等。

顯式轉型

問題是,但你需要把一個 long 型別的資料轉成 int 時,又或者讓 string 與 int 互轉,當資料小數點太多時,這時候就必須使用 顯式轉型。

 

一,使用 ([type])  轉型操作符

此方法適用與值型別轉換( string屬於引用型別)

在需要轉換的變數前加上( [型別] )即可

請仔細觀察下面兩圖的差異

第二張圖中的程式碼中,第二行,為 int b = (int)i;  

在需要轉換的變數前使用 ([type]) 這種格式進行轉換,如(int)、(float)、(long)

注意,

此種方法只能對 值型別 資料進行轉換。

 不能將範圍大的型別 往 小 轉換 ,例如 float 轉為 int

 

第二,[Type].Parse()

 ([type]) 方法是無法在值型別、引用型別( string 型別)間轉換的。

但每種資料型別都提供一個Parse()方法,它允許把 字串 轉成對應的 數值型別。

int.Parse()

float.Parse()

... ...

請看例子

        string str = "666";
        long i = int.Parse(str);
        Console.WriteLine($"{i},{i.GetType()}");
        Console.ReadKey();

(圖如)

 

注意,

Parse() 是專為 string 型別轉成 值型別 提供功能的!

Parse() 是為符合數字格式的 string 型別進行轉換!

 

下面的例子都是錯誤用法 !

 Parse() 是將符合數字格式的字串轉為數字,也就是說,

  • ( )括號內的必須為字串 !
  • 字串的內容必須為數字 !

例子 1     ( )  括號內的內容不是字串

例子 2   變數 str 的內容不是 有效數字格式

 

第三,[Type].TryParse()

格式如下

int.TryParse()

float.TryParse()

... ...

 .TryParse() 與 .Parse()  相似,但是使用形式不太一樣,

[型別].TryParse(要更改的字串,out 儲存到哪個變數); 

最重要的不同點在於, .TryParse()  在轉換失敗時,不會引發異常,而是返回 flase

例子

        string str = "666";
        int i;
        bool b = int.TryParse(str,out i);    //接收轉換結果
或者

        string str = "666";
        int i;
        int.TryParse(str,out i);    //不接收轉換結果

  如果你不知道 out 的使用,請查閱 C#中的out引數/ref引數/params可變引數

第四,System.Convert

方法例子

System.Convert.ToSingle();
System.Convert.ToInt32();
System.Convert.ToDouble();

... ...

System.Convert  允許將一種型別轉為另一種型別。

常見 型別列表: char、sbyte、short、int、long、uint、ulong、float、double、decimal、string、bool ... ...

但是,同樣需要格式支援!

        string str = "666";
        int a= System.Convert.ToInt32(str);        //正確

        string str = "666.66";
        int a= System.Convert.ToInt32(str);        //報錯

        int a = 66666;
        bool c = System.Convert.ToBoolean(a);        //正確

        string str = "666.66";
        bool c = System.Convert.ToBoolean(str);        //報錯

   

  System.Convert 在轉換是也需要注意 格式 才能轉換成功。

       同樣,此方式也會發生精確度、數字大小改變

 

 第五,System.Convert

.Tostring()

每種資料型別都提供了轉為字串型別的方法 ToString()

無論是值型別還是DateTime 等各種引用型別。

ToString()使用方法最為簡單,請留意下列例子的紅色背景部分

using System;
using System.IO;

public class Test
{

    static void Main()
    {
        int a = 666;
        string aa = a.ToString();
        Console.WriteLine($"{aa}");

        float b = 666.666F;
        string bb = b.ToString();
        Console.WriteLine($"{bb}");

        DateTime c = DateTime.Now;
        string cc = c.ToString();
        Console.WriteLine($"{cc}");

        FileInfo d = new FileInfo("E:\\test.txt");
        string dd = d.ToString();
        Console.WriteLine($"{dd}");

        string ee;
        try
        {
            int x = 1;
            int y = 0;
            int e = x / y;
        }
        catch (Exception ex)
        {
            ee = ex.ToString();
            Console.WriteLine($"{ee}");
        }


        Console.ReadKey();
    }

}

看到了吧?無論什麼型別,只需在後面加上 ToString() , 都能 輸出 string 型別的內容。(不是轉為 string 型別!)

當然,ToString() 是一個方法,並提供了 一下傳入引數,每種型別都有幾個過載的 TOString() 方法,例如DateTime的

public string ToString(string format, IFormatProvider provider);
public string ToString(string format);
public string ToString(IFormatProvider provider);
public override string ToString();

 

其它方面不再贅述。

 

複製下列程式碼到控制檯,看看輸出了什麼

using System;
using System.IO;

public class Test
{

    static void Main()
    {
        int a = 666;
        string aa = a.ToString();
        Console.WriteLine($"{aa}");

        float b = 666.666F;
        string bb = b.ToString();
        Console.WriteLine($"{bb}");

        DateTime c = DateTime.Now;
        string cc = c.ToString();
        Console.WriteLine($"{cc}");

        FileInfo d = new FileInfo("E:\\test.txt");
        string dd = d.ToString();
        Console.WriteLine($"{dd}");

        string ee;
        try
        {
            int x = 1;
            int y = 0;
            int e = x / y;
        }
        catch (Exception ex)
        {
            ee = ex.ToString();
            Console.WriteLine($"{ee}");
        }


        Console.ReadKey();
    }

}