首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C#.NET 類型轉換完全指南:從裝箱拆箱到進制轉換的實戰總結

     編輯:關於C語言

前言:為何需要系統性掌握類型轉換?

C# 作為強型別語言,類型轉換貫穿開發始終。從基本的數值轉換、字串解析,到進階的位元操作、日期序列化,理解背後機制能避免效能損耗、資料溢位與編碼錯誤。本文將官方文件與實戰經驗結合,整理出 10 大類型轉換場景的標準作法與陷阱提醒。

1. 別名與系統類型對照:裝箱/拆箱的本質

C# 關鍵字 (如 int) 實為對應 System 命名空間結構體的別名。編譯器會自動處理裝箱 (值型別 → object) 與拆箱 (object → 值型別),開發者無需手動干預,但必須熟記對應關係:

C# 關鍵字系統類型說明
boolSystem.Boolean布林值
byteSystem.Byte無號 8 位元 (0~255)
sbyteSystem.SByte有號 8 位元 (-128~127)
charSystem.CharUnicode 字元 (16 位元)
shortSystem.Int16有號 16 位元
ushortSystem.UInt16無號 16 位元
intSystem.Int32有號 32 位元
uintSystem.UInt32無號 32 位元
longSystem.Int64有號 64 位元
ulongSystem.UInt64無號 64 位元
floatSystem.Single單精度浮點數
doubleSystem.Double雙精度浮點數
decimalSystem.Decimal高精度十進位 (財務計算首選)

驗證技巧: 使用 variable.GetType().FullName 即可在執行期確認實際類型。

2. 數值類型隱性與顯性轉換

隱性轉換 (安全、無資料遺失)

依位元寬度由小到大:byte → short → int → long → float → double。編譯器自動處理。

byte a = 1;
short b = a;  // OK
int c = b;    // OK
long d = c;   // OK
float e = d;  // OK
double f = e; // OK

顯性轉換 (可能溢位/精度遺失)

反方向或有號/無號互轉需強制轉型 (TargetType)value。

int g = 265;
byte h = (byte)g; // 結果為 9 (265 % 256),高位元被截斷!
⚠ 陷阱: 強制轉型不會拋出例外 (除非在 checked 區塊),資料靜默截斷極難除錯。建議關鍵路徑使用 checked 或 Convert.ToByte() (會拋出 OverflowException)。

3. 字元與編碼互轉:ASCII / Unicode

C# char 為 UTF-16 字元,直接強制轉型即可取得代碼值:

char ch = 'A';
int ascii = (int)ch;        // 65
char ch2 = (char)65;        // 'A'

char cn = '中';
int unicode = (int)cn;      // 20013 (0x4E2D)
char cn2 = (char)20013;     // '中'

VB 程式設計師常尋找的 Asc()/Chr() 對應即為此強制轉型。

4. 數值與字串雙向轉換

數值 → 字串

int i = 123;
string s = i.ToString();           // "123"
string s2 = i.ToString("D5");      // "00123" (格式化)
string s3 = i.ToString("X");       // "7B" (十六進位大寫)

字串 → 數值

string numStr = "456.78";
double d = double.Parse(numStr);                    // 標準解析
double d2 = double.Parse(numStr, NumberStyles.Float, CultureInfo.InvariantCulture); // 指定文化特性
bool success = double.TryParse(numStr, out double result); // 安全模式,推薦使用
最佳實務: 永遠優先使用 TryParse 避免例外開銷;跨文化特性解析時明確傳入 CultureInfo.InvariantCulture。

5. 字串與字元陣列互轉

string str = "Hello";
char[] chars = str.ToCharArray();  // ['H','e','l','l','o']

// 反向
char[] arr = { 'W', 'o', 'r', 'l', 'd' };
string str2 = new string(arr);     // "World"
string str3 = new string(arr, 1, 3); // "orl" (指定起始索引與長度)

// 單字元存取:無需轉陣列
char third = str[2]; // 'l'

6. 字串與位元組陣列:編碼核心

必須透過 System.Text.Encoding 指定編碼方式:

string s = "C#語言";

// 系統預設 ANSI (繁中為 Big5)
byte[] b1 = Encoding.Default.GetBytes(s); // 長度 6: C # 語 言

// UTF-16 Little Endian
byte[] b2 = Encoding.Unicode.GetBytes(s); // 長度 8: 每字元 2 位元組

// UTF-8 (跨平台首選)
byte[] b3 = Encoding.UTF8.GetBytes(s);    // 長度 8: ASCII 1 字節,中文 3 字節

// 還原
string restored = Encoding.UTF8.GetString(b3);
關鍵差異: Encoding.Default 視字元寬度輸出 1 或 2 位元組;Encoding.Unicode 固定 2 位元組;Encoding.UTF8 為變長編碼 (1~4 位元組)。序列化/網路傳輸強制指定 UTF-8 以確保跨平台一致性。

7. 基礎型別與位元組陣列:BitConverter

int val = 0x01020304;
byte[] bytes = BitConverter.GetBytes(val); // 位元組順序視 CPU 端序而定 (Little-Endian: 04 03 02 01)

// 還原
int restored = BitConverter.ToInt32(bytes, 0);

// 其他常用
BitConverter.GetBytes((short)123);
BitConverter.GetBytes(123.45);
BitConverter.GetBytes(true);
BitConverter.ToInt16(bytes, 0);
BitConverter.ToDouble(bytes, 0);
注意: BitConverter 依賴執行平台端序。跨平台序列化請改用 BinaryPrimitives (.NET Core 2.1+) 或手動控制位元組順序。

8. 十六進位字串格式化與解析

int num = 188;
string hexLower = num.ToString("x");   // "bc"
string hexUpper = num.ToString("X");   // "BC"
string hexPad4  = num.ToString("X4");  // "00BC" (補零至 4 位)

// 解析十六進位字串
int parsed = int.Parse("BC", NumberStyles.HexNumber); // 188
int parsed2 = int.Parse("00BC", NumberStyles.HexNumber); // 188

9. DateTime 與長整數 / OLE Automation Date 互轉

Ticks (100 奈秒單位,自 0001/1/1 起)

long ticks = DateTime.Now.Ticks;        // 取得
DateTime dt = new DateTime(ticks);      // 還原

OADate (雙精度浮點,自 1899/12/30 起,整數部=日期、小數部=時間)

double oa = DateTime.Now.ToOADate();    // 轉為 Double
DateTime dt2 = DateTime.FromOADate(oa); // 還原
// 與 VB6 / Excel / COM 互通專用

10. DateTime 格式化輸出完整對照表

格式字串意義範例輸出
yyyy-MM-dd HH:mm:ss標準完整日期時間2024-12-25 14:30:05
yyyy/MM/dd日期斜線分隔2024/12/25
HH:mm24 小時制時分14:30
hh:mm tt12 小時制含 AM/PM02:30 PM
yyyy年M月d日中文式日期2024年12月25日
ddd星期縮寫Wed
dddd星期全名Wednesday

字面文字逸出技巧

格式字串中若需輸出字面字元 (如 "year:"),用單引號包裹:

string fmt = "'year:' yyyy 'month:' MM 'day:' dd";
// 輸出: year: 2024 month: 12 day: 25

總結與建議

  1. 優先使用 TryParse 進行字串解析,避免例外流控制。
  2. 跨系統/網路傳輸 統一採用 UTF-8 編碼與 ISO 8601 日期格式 (yyyy-MM-ddTHH:mm:ss.fffZ)。
  3. 財務計算 必須使用 decimal 而非 float/double。
  4. 效能敏感路徑 可考慮 Span<byte> + BinaryPrimitives 避免陣列配置。
  5. 單元測試 覆蓋邊界值 (MinValue, MaxValue, 0, 負數、不同文化特性)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved