C# 型別轉換
在 C# 中,型別轉換是將一個資料型別的值轉換為另一個資料型別的過程。
C# 中的型別轉換可以分為兩種:隱式型別轉換和顯式型別轉換(也稱為強制型別轉換)。
隱式型別轉換
隱式轉換是不需要編寫程式碼來指定的轉換,編譯器會自動進行。
隱式轉換是指將一個較小範圍的資料型別轉換為較大範圍的資料型別時,編譯器會自動完成型別轉換,這些轉換是 C# 預設的以安全方式進行的轉換, 不會導致資料丟失。
例如,從 int 到 long,從 float 到 double 等。
從小的整數型別轉換為大的整數型別,從派生類轉換為基類。將一個 byte 型別的變數賦值給 int 型別的變數,編譯器會自動將 byte 型別轉換為 int 型別,不需要顯示轉換。
例項
int i = b; // 隱式轉換,不需要顯式轉換
將一個整數賦值給一個長整數,或者將一個浮點數賦值給一個雙精度浮點數,這種轉換不會導致資料丟失:
例項
long longValue = intValue; // 隱式轉換,從 int 到 long
顯式轉換
顯式型別轉換,即強制型別轉換,需要程式設計師在程式碼中明確指定。
顯式轉換是指將一個較大範圍的資料型別轉換為較小範圍的資料型別時,或者將一個物件型別轉換為另一個物件型別時,需要使用強制型別轉換符號進行顯示轉換,強制轉換會造成資料丟失。
例如,將一個 int 型別的變數賦值給 byte 型別的變數,需要顯示轉換。
例項
byte b = (byte)i; // 顯式轉換,需要使用強制型別轉換符號
強制轉換為整數型別:
例項
int intValue = (int)doubleValue; // 強制從 double 到 int,資料可能損失小數部分
強制轉換為浮點數型別:
例項
float floatValue = (float)intValue; // 強制從 int 到 float,資料可能損失精度
強制轉換為字串型別:
例項
string stringValue = intValue.ToString(); // 將 int 轉換為字串
下面的例項顯示了一個顯式的型別轉換:
例項
namespace TypeConversionApplication
{
class ExplicitConversion
{
static void Main(string[] args)
{
double d = 5673.74;
int i;
// 強制轉換 double 為 int
i = (int)d;
Console.WriteLine(i);
Console.ReadKey();
}
}
}
當上面的程式碼被編譯和執行時,它會產生下列結果:
5673
C# 型別轉換方法
C# 提供了下列內建的型別轉換方法:
序號 | 方法 & 描述 |
---|---|
1 | ToBoolean 如果可能的話,把型別轉換為布林型。 |
2 | ToByte 把型別轉換為位元組型別。 |
3 | ToChar 如果可能的話,把型別轉換為單個 Unicode 字元型別。 |
4 | ToDateTime 把型別(整數或字串型別)轉換為 日期-時間 結構。 |
5 | ToDecimal 把浮點型或整數型別轉換為十進位制型別。 |
6 | ToDouble 把型別轉換為雙精度浮點型。 |
7 | ToInt16 把型別轉換為 16 位整數型別。 |
8 | ToInt32 把型別轉換為 32 位整數型別。 |
9 | ToInt64 把型別轉換為 64 位整數型別。 |
10 | ToSbyte 把型別轉換為有符號位元組型別。 |
11 | ToSingle 把型別轉換為小浮點數型別。 |
12 | ToString 把型別轉換為字串型別。 |
13 | ToType 把型別轉換為指定型別。 |
14 | ToUInt16 把型別轉換為 16 位無符號整數型別。 |
15 | ToUInt32 把型別轉換為 32 位無符號整數型別。 |
16 | ToUInt64 把型別轉換為 64 位無符號整數型別。 |
這些方法都定義在 System.Convert 類中,使用時需要包含 System 名稱空間。它們提供了一種安全的方式來執行型別轉換,因為它們可以處理 null值,並且會丟擲異常,如果轉換不可能進行。
例如,使用 Convert.ToInt32 方法將字串轉換為整數:
string str = "123";
int number = Convert.ToInt32(str); // 轉換成功,number為123
如果字串不是有效的整數表示,Convert.ToInt32 將丟擲 FormatException。
下面的例項把不同值的型別轉換為字串型別:
例項
namespace TypeConversionApplication
{
class StringConversion
{
static void Main(string[] args)
{
// 定義一個整型變數
int i = 75;
// 定義一個浮點型變數
float f = 53.005f;
// 定義一個雙精度浮點型變數
double d = 2345.7652;
// 定義一個布林型變數
bool b = true;
// 將整型變數轉換為字串並輸出
Console.WriteLine(i.ToString());
// 將浮點型變數轉換為字串並輸出
Console.WriteLine(f.ToString());
// 將雙精度浮點型變數轉換為字串並輸出
Console.WriteLine(d.ToString());
// 將布林型變數轉換為字串並輸出
Console.WriteLine(b.ToString());
// 等待使用者按鍵後關閉控制檯視窗
Console.ReadKey();
}
}
}
當上面的程式碼被編譯和執行時,它會產生下列結果:
75
53.005
2345.7652
True
在進行型別轉換時需要注意以下幾點:
- 隱式轉換隻能將較小範圍的資料型別轉換為較大範圍的資料型別,不能將較大範圍的資料型別轉換為較小範圍的資料型別;
- 顯式轉換可能會導致資料丟失或精度降低,需要進行資料型別的相容性檢查;
- 對於物件型別的轉換,需要進行型別轉換的相容性檢查和型別轉換的安全性檢查。
型別轉換方法
C# 提供了多種型別轉換方法,例如使用 Convert 類、Parse 方法和 TryParse 方法,這些方法可以幫助處理不同的資料型別之間的轉換。
使用 Convert 類
Convert 類提供了一組靜態方法,可以在各種基本資料型別之間進行轉換。
例項
int num = Convert.ToInt32(str);
使用 Parse 方法
Parse 方法用於將字串轉換為對應的數值型別,如果轉換失敗會丟擲異常。
例項
double d = double.Parse(str);
使用 TryParse 方法
TryParse 方法類似於 Parse,但它不會丟擲異常,而是返回一個布林值指示轉換是否成功。
例項
double d;
bool success = double.TryParse(str, out d);
if (success) {
Console.WriteLine("轉換成功: " + d);
} else {
Console.WriteLine("轉換失敗");
}
自定義型別轉換
C# 還允許你定義自定義型別轉換操作,透過在型別中定義 implicit 或 explicit 關鍵字。
例項
public class Fahrenheit
{
public double Degrees { get; set; }
public Fahrenheit(double degrees)
{
Degrees = degrees;
}
// 隱式轉換從Fahrenheit到double
public static implicit operator double(Fahrenheit f)
{
return f.Degrees;
}
// 顯式轉換從double到Fahrenheit
public static explicit operator Fahrenheit(double d)
{
return new Fahrenheit(d);
}
}
public class Program
{
public static void Main()
{
Fahrenheit f = new Fahrenheit(98.6);
Console.WriteLine("Fahrenheit object: " + f.Degrees + " degrees");
double temp = f; // 隱式轉換
Console.WriteLine("After implicit conversion to double: " + temp + " degrees");
Fahrenheit newF = (Fahrenheit)temp; // 顯式轉換
Console.WriteLine("After explicit conversion back to Fahrenheit: " + newF.Degrees + " degrees");
}
}
以上例子中,我們定義了一個 Fahrenheit 類,並實現了從 Fahrenheit 到 double 的隱式轉換和從 double 到 Fahrenheit 的顯式轉換。
輸出結果將顯示如下:
Fahrenheit object: 98.6 degrees
After implicit conversion to double: 98.6 degrees
After explicit conversion back to Fahrenheit: 98.6 degrees
總結
在 C# 中,內建的型別轉換方法主要透過以下幾種方式實現:隱式轉換、顯式轉換(強制轉換)、使用 Convert 類的方法、Parse 方法和 TryParse 方法,這些方法廣泛應用於不同資料型別之間的轉換。
以下是 C# 內建型別轉換方法的表格:
方法類別 | 方法 | 描述 |
---|---|---|
隱式轉換 | 自動進行的轉換 | 無需顯式指定,通常用於安全的型別轉換,如從較小型別到較大型別 |
顯式轉換(強制轉換) | (type)value |
需要顯式指定,通常用於可能導致資料丟失或轉換失敗的情況 |
Convert 類方法 |
Convert.ToBoolean(value) |
將指定型別轉換為 Boolean |
Convert.ToByte(value) |
將指定型別轉換為 Byte |
|
Convert.ToChar(value) |
將指定型別轉換為 Char |
|
Convert.ToDateTime(value) |
將指定型別轉換為 DateTime |
|
Convert.ToDecimal(value) |
將指定型別轉換為 Decimal |
|
Convert.ToDouble(value) |
將指定型別轉換為 Double |
|
Convert.ToInt16(value) |
將指定型別轉換為 Int16 (短整型) |
|
Convert.ToInt32(value) |
將指定型別轉換為 Int32 (整型) |
|
Convert.ToInt64(value) |
將指定型別轉換為 Int64 (長整型) |
|
Convert.ToSByte(value) |
將指定型別轉換為 SByte |
|
Convert.ToSingle(value) |
將指定型別轉換為 Single (單精度浮點型) |
|
Convert.ToString(value) |
將指定型別轉換為 String |
|
Convert.ToUInt16(value) |
將指定型別轉換為 UInt16 (無符號短整型) |
|
Convert.ToUInt32(value) |
將指定型別轉換為 UInt32 (無符號整型) |
|
Convert.ToUInt64(value) |
將指定型別轉換為 UInt64 (無符號長整型) |
|
Parse 方法 |
Boolean.Parse(string) |
將字串解析為 Boolean |
Byte.Parse(string) |
將字串解析為 Byte |
|
Char.Parse(string) |
將字串解析為 Char |
|
DateTime.Parse(string) |
將字串解析為 DateTime |
|
Decimal.Parse(string) |
將字串解析為 Decimal |
|
Double.Parse(string) |
將字串解析為 Double |
|
Int16.Parse(string) |
將字串解析為 Int16 |
|
Int32.Parse(string) |
將字串解析為 Int32 |
|
Int64.Parse(string) |
將字串解析為 Int64 |
|
SByte.Parse(string) |
將字串解析為 SByte |
|
Single.Parse(string) |
將字串解析為 Single |
|
UInt16.Parse(string) |
將字串解析為 UInt16 |
|
UInt32.Parse(string) |
將字串解析為 UInt32 |
|
UInt64.Parse(string) |
將字串解析為 UInt64 |
|
TryParse 方法 |
Boolean.TryParse(string, out bool) |
嘗試將字串解析為 Boolean ,返回布林值表示是否成功 |
Byte.TryParse(string, out byte) |
嘗試將字串解析為 Byte ,返回布林值表示是否成功 |
|
Char.TryParse(string, out char) |
嘗試將字串解析為 Char ,返回布林值表示是否成功 |
|
DateTime.TryParse(string, out DateTime) |
嘗試將字串解析為 DateTime ,返回布林值表示是否成功 |
|
Decimal.TryParse(string, out decimal) |
嘗試將字串解析為 Decimal ,返回布林值表示是否成功 |
|
Double.TryParse(string, out double) |
嘗試將字串解析為 Double ,返回布林值表示是否成功 |
|
Int16.TryParse(string, out short) |
嘗試將字串解析為 Int16 ,返回布林值表示是否成功 |
|
Int32.TryParse(string, out int) |
嘗試將字串解析為 Int32 ,返回布林值表示是否成功 |
|
Int64.TryParse(string, out long) |
嘗試將字串解析為 Int64 ,返回布林值表示是否成功 |
|
SByte.TryParse(string, out sbyte) |
嘗試將字串解析為 SByte ,返回布林值表示是否成功 |
|
Single.TryParse(string, out float) |
嘗試將字串解析為 Single ,返回布林值表示是否成功 |
|
UInt16.TryParse(string, out ushort) |
嘗試將字串解析為 UInt16 ,返回布林值表示是否成功 |
|
UInt32.TryParse(string, out uint) |
嘗試將字串解析為 UInt32 ,返回布林值表示是否成功 |
|
UInt64.TryParse(string, out ulong) |
嘗試將字串解析為 UInt64 ,返回布林值表示是否成功 |