在 C# 開發中,類型安全是核心特性之一。不同於 Visual Basic 的寬鬆類型系統,C# 要求嚴格的類型匹配。當從文字方塊等 UI 控件獲取輸入並參與運算時,必須將字串轉換為對應的數值類型。本文系統整理 C# 中三種最常用的類型轉換方法,並附上實戰程式碼範例。
適用於相容類型之間的轉換(如數值類型擴大/縮小、繼承關係的物件轉換)。語法為 (目標類型)運算式。
private void TestCast()
{
string input = "1.4532";
double result;
// 錯誤示範:字串無法直接強制轉為 double
// result = (double)input; // 編譯錯誤
// 正確做法:需先透過 Parse 或 Convert 轉換
result = Math.Cos(double.Parse(input));
}
注意:強制轉換僅限於編譯器能確認的相容類型,字串與數值類型不相容,不可直接使用。
所有基本數值類型(int、double、decimal 等)與 DateTime、Guid 等結構都提供靜態 Parse 方法,將字串解析為該類型實例。建議搭配 TryParse 避免例外拋出。
private void CalculateAzimuth()
{
// 從 UI 取得輸入
string alpha = txtAzimuth.Text; // 格式如 "120.3045" 代表 120度30分45秒
string[] parts = alpha.Split('.');
double degrees = double.Parse(parts[0]);
double minutes = double.Parse(parts[1].Substring(0, 2));
double seconds = double.Parse(parts[1].Substring(2, 2));
// 轉換為弧度
double radian = (degrees + minutes / 60.0 + seconds / 3600.0) * Math.PI / 180.0;
// 後續計算...
double distance = double.Parse(txtDistance.Text);
double startX = double.Parse(txtStartX.Text);
double startY = double.Parse(txtStartY.Text);
double endX = Math.Cos(radian) * distance + startX;
double endY = Math.Sin(radian) * distance + startY;
txtEndX.Text = endX.ToString();
txtEndY.Text = endY.ToString();
}
最佳實務:實際專案請改用 double.TryParse 並處理失敗情況,避免格式錯誤導致程式中斷。
System.Convert 提供靜態方法支援更廣泛的類型轉換,包括處理 null(回傳預設值 0)與進制轉換。內部實際仍呼叫對應類型的 Parse 或 ToString。
private void ConvertExample()
{
string[] parts = txtAzimuth.Text.Split('.');
// Convert.ToDouble 可直接處理 null,回傳 0.0
double degrees = Convert.ToDouble(parts[0]);
double minutes = Convert.ToDouble(parts[1].Substring(0, 2));
double seconds = Convert.ToDouble(parts[1].Substring(2, 2));
// 其他數值類型同理
int count = Convert.ToInt32(txtCount.Text);
decimal price = Convert.ToDecimal(txtPrice.Text);
DateTime dt = Convert.ToDateTime(txtDate.Text);
}
| 特性 | 強制轉換 | Parse / TryParse | Convert 類別 |
|---|---|---|---|
| 適用場景 | 相容數值類型、繼承關係物件 | 字串 → 數值/日期/結構 | 任意類型 → 基本類型、進制轉換 |
| null 處理 | 拋出 NullReferenceException | 拋出 ArgumentNullException | 回傳目標類型預設值(如 0) |
| 失敗行為 | 編譯期/執行期錯誤 | Parse 擲例外;TryParse 回傳 false | 擲 FormatException 或 OverflowException |
| 效能 | 最快(直接指令) | 快 | 略慢(內部多層呼叫) |
| 建議用法 | 已知型別相容時 | 解析使用者輸入(優先 TryParse) | 資料庫欄位、物件屬性等可能為 null 的來源 |
TryParse 驗證並轉換。Convert 安全處理潛在 null。int → double、子類別 → 父類別)。掌握這三種轉換方式的差異與適用時機,能讓 C# 程式碼更健壯、可維護性更高。