當前位置: 妍妍網 > 碼農

C# 數據型別與型別轉換:包含教程與範例

2024-03-05碼農

在C#編程中,數據型別是用於聲明變量、函式返回值以及物件內容的基礎。每種數據型別都定義了變量可以儲存的數據種類和範圍。此外,型別轉換允許開發者在必要時更改數據型別的表示。

一、C# 中的數據型別

C# 提供了多種內建的數據型別,它們可以分為以下幾類:

  1. 值型別(Value Types)

  • 整數型別 byte sbyte short (或 int16 )、 ushort (或 uint16 )、 int (或 int32 )、 uint (或 uint32 )、 long (或 int64 )、 ulong (或 uint64 )。

  • 浮點型別 float (或 single )、 double decimal

  • 字元型別 char

  • 布爾型別 bool

  • 結構體型別 struct

  • 參照型別(Reference Types)

  • 類型別 class

  • 介面型別 interface

  • 陣列型別 :例如 int[] 表示整數陣列。

  • 委托型別 delegate

  • 字串型別 string

  • 物件型別 object

  • 二、型別轉換

    型別轉換在C#中主要有兩種:隱式轉換(Implicit Conversion)和顯式轉換(Explicit Conversion)。

    1. 隱式轉換 :編譯器能夠自動執行的轉換,通常是從範圍較大的型別到範圍較小的型別(不遺失資訊的情況下)。

      double d = 3.14;
      int i = d; // 隱式轉換,d的值被截斷為整數3

    2. 顯式轉換 :需要程式設計師明確指出的轉換,通常涉及到範圍較小的型別到範圍較大的型別,或者可能遺失資訊的轉換。

      int i = 123;
      double d = (double)i; // 顯式轉換,將int型別的i轉換為double型別的d

    三、型別轉換方法

    C# 還提供了幾種方法來進行型別轉換:

  • Convert類 :提供了一系列靜態方法,用於在不同型別之間進行轉換。

    int i = Convert.ToInt32("123");
    string s = Convert.ToString(456);

  • Parse方法 :用於將字串表示的數位轉換為對應的數值型別。

    int i = int.Parse("123");
    double d = double.Parse("3.14");

  • TryParse方法 :嘗試進行轉換,如果轉換失敗則返回一個布爾值,而不是丟擲異常。

    string s = "123";
    int result;
    bool success = int.TryParse(s, out result);
    if (success)
    {
    // result現在是123
    }

  • ChangeType方法 :使用 Convert 類中的 ChangeType 方法可以將一個物件轉換為指定的型別。

    object obj = "123";
    int i = (int)Convert.ChangeType(obj, typeof(int));

  • 四、裝箱與拆箱

    對於值型別與參照型別之間的轉換,C# 提供了裝箱(Boxing)和拆箱(Unboxing)的概念。裝箱是將值型別轉換為 object 型別或由此值型別實作的任何介面型別的過程。拆箱則是將 object 型別轉換為值型別的過程。

    intvalue = 123;
    object obj = value// 裝箱:將int型別的value轉換為object型別
    int unboxedValue = (int)obj; // 拆箱:將object型別的obj轉換回int型別

    五、使用者定義的型別轉換

    開發者可以透過在類別定義中添加轉換運算子來定義自己的型別轉換規則。

    public classCelsius
    {
    publicdouble Temperature { getset; }
    publicstaticimplicitoperatorFahrenheit(Celsius c)
    {
    returnnew Fahrenheit { Temperature = (c.Temperature * 9 / 5) + 32 };
    }
    }
    public classFahrenheit
    {
    publicdouble Temperature { getset; }
    publicstaticimplicitoperatorCelsius(Fahrenheit f)
    {