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

C# 類型轉換完全指南:從裝箱拆箱到進制轉換的深度解析

     編輯:關於C語言

引言

C# 作為強類型語言,類型轉換貫穿開發始終。本文系統梳理 C# 類型轉換的十大核心場景,涵蓋基礎類型別名、數值轉換、字符編碼、字符串處理、字節數組操作、日期時間轉換等實戰知識點,並附帶可直接運行的驗證代碼。

一、類型別名與裝箱/拆箱本質

1.1 別名映射表

C# 關鍵字實為 .NET 基礎類型的別名,理解這層映射關係是掌握類型系統的基石:

關鍵字.NET 類型說明
boolSystem.Boolean布爾值
byteSystem.Byte8 位無符號整數 (0-255)
sbyteSystem.SByte8 位有符號整數 (-128~127)
charSystem.Char16 位 Unicode 字符
shortSystem.Int1616 位有符號整數
ushortSystem.UInt1616 位無符號整數
intSystem.Int3232 位有符號整數
uintSystem.UInt3232 位無符號整數
longSystem.Int6464 位有符號整數
ulongSystem.UInt6464 位無符號整數
floatSystem.Single單精度浮點數
doubleSystem.Double雙精度浮點數

1.2 驗證代碼

private void TestAlias() {
    byte a = 1; char b = 'a'; short c = 1;
    int d = 2; long e = 3; uint f = 4; bool g = true;
    
    Console.WriteLine($"byte -> {a.GetType().FullName}");
    Console.WriteLine($"char -> {b.GetType().FullName}");
    Console.WriteLine($"short -> {c.GetType().FullName}");
    Console.WriteLine($"int -> {d.GetType().FullName}");
    Console.WriteLine($"long -> {e.GetType().FullName}");
    Console.WriteLine($"uint -> {f.GetType().FullName}");
    Console.WriteLine($"bool -> {g.GetType().FullName}");
}
// 輸出均為對應的 System.* 類型全名

二、數值類型隱式/顯式轉換規則

2.1 隱式轉換鏈

按精度遞增方向自動轉換:byte → short → int → long → float → double

byte a = 1;
short b = a;  // 隱式轉換
int c = b;
long d = c;
float e = d;
double f = e; // 所有值均為 1

2.2 顯式轉換與溢出風險

逆向轉換需強制轉型,且可能導致數據截斷:

short g = 265;
byte h = (byte)g; // 結果為 9 (265 % 256)
Console.WriteLine(h); // 輸出 9
⚠️ 警告:強制轉換不拋出異常,靜默截斷高位數據,生產環境務必添加範圍檢查。

三、字符編碼轉換:ASCII 與 Unicode

C# 採用 UTF-16 存儲字符,轉換遵循 C 風格強制轉型:

char ch = 'a';
short ascii = (short)ch;        // 97
char fromAscii = (char)65;      // 'A'

char cn = '中';
short unicode = (short)cn;      // 20013
char fromUnicode = (char)22478; // '城'

四、字符串與數值互轉

4.1 數值 → 字符串

float f = 54.321F;
string str = f.ToString(); // "54.321"

4.2 字符串 → 數值

string str = "123";
int val = int.Parse(str); // 123
// 建議生產環境使用 TryParse 避免異常
if (int.TryParse(str, out int result)) { /* 成功 */ }

五、字符串與字符/字節數組轉換

5.1 字符數組互轉

string str = "mytest";
char[] chars = str.ToCharArray(); // 長度 6
string fromChars = new string(chars); // "mytest"
// 單字符訪問更高效:char c = str[2]; // 't'

5.2 字節數組編碼轉換

string s = "C#語言";
// ANSI 編碼(英文1字節,中文2字節)
byte[] ansiBytes = Encoding.Default.GetBytes(s); // 長度 6
// Unicode 編碼(統一2字節)
byte[] unicodeBytes = Encoding.Unicode.GetBytes(s); // 長度 8

// 解碼
string decoded = Encoding.ASCII.GetString(new byte[]{97,98,99}); // "abc"

六、數值與字節數組互轉

使用 BitConverter 類進行底層內存操作:

int value = 12345;
byte[] bytes = BitConverter.GetBytes(value); // 4 字節
int restored = BitConverter.ToInt32(bytes, 0); // 12345

七、十六進制格式化與解析

int a = 188;
Console.WriteLine(a.ToString("X"));   // "BC" (大寫)
Console.WriteLine(a.ToString("x"));   // "bc" (小寫)
Console.WriteLine(a.ToString("X4"));  // "00BC" (補零)

// 解析十六進制字符串
int b = int.Parse("AB", NumberStyles.HexNumber); // 171

八、日期時間與長整型互轉

8.1 Ticks 屬性(100 納秒間隔)

long ticks = DateTime.Now.Ticks;
DateTime dt = new DateTime(ticks);

8.2 OLE Automation 日期格式(兼容 VB6/COM)

double oaDate = DateTime.Now.ToOADate(); // 如 37494.6615
DateTime fromOA = DateTime.FromOADate(oaDate);

九、日期時間格式化輸出

格式符含義示例
yyyy四位年份2024
MM兩位月份01-12
dd兩位日期01-31
HH24制小時00-23
mm分鐘00-59
ss秒00-59
DateTime now = DateTime.Now;
Console.WriteLine(now.ToString("yyyy-MM-dd HH:mm:ss")); // 2024-01-15 14:30:00

// 包含字面量文本需用引號轉義
Console.WriteLine(now.ToString("'Year:' yyyy 'Month:' MM")); // Year: 2024 Month: 01

十、最佳實踐總結

  1. 優先使用 TryParse 避免異常開銷
  2. 字節序列化優先選擇 BitConverter 或 BinaryPrimitives (.NET Core 2.1+)
  3. 跨平台編碼統一使用 UTF-8 (Encoding.UTF8)
  4. 日期存儲推薦 UTC Ticks 或 ISO 8601 字符串
  5. 十六進制顯示統一大寫並固定長度

掌握這十大類型轉換場景,可覆蓋 95% 的業務開發需求。建議收藏備查,遇到具體問題查閱對應章節即可快速解決。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved