C# 作為強類型語言,擁有豐富的預定義類型,直接對應 .NET 運行時類型系統。不同於 C/C++ 的基本類型大小隨實現變化,C# 預定義類型具有固定大小、固定範圍、固定行為,跨平台一致。本文系統整理所有預定義類型、字面量語法、類型轉換規則、以及 bool 與整數的嚴格區分(避免經典 C/C++ Bug)。
| 類型 | .NET 類型 | 說明 | 範圍/精度 | 字面量後綴 |
|---|---|---|---|---|
object | System.Object | 所有類型終極基類 | — | — |
string | System.String | Unicode 字符序列(不可變) | — | "text", @"verbatim" |
sbyte | System.SByte | 8 位有符號整數 | -128 ~ 127 | — |
short | System.Int16 | 16 位有符號整數 | -32,768 ~ 32,767 | — |
int | System.Int32 | 32 位有符號整數 | -2,147,483,648 ~ 2,147,483,647 | — |
long | System.Int64 | 64 位有符號整數 | -9.22e18 ~ 9.22e18 | L/l |
byte | System.Byte | 8 位無符號整數 | 0 ~ 255 | — |
ushort | System.UInt16 | 16 位無符號整數 | 0 ~ 65,535 | — |
uint | System.UInt32 | 32 位無符號整數 | 0 ~ 4,294,967,295 | U/u |
ulong | System.UInt64 | 64 位無符號整數 | 0 ~ 1.84e19 | UL/ul/LU/lu |
float | System.Single | 單精度浮點數 | ±1.5e-45 ~ ±3.4e38, 7 位精度 | F/f |
double | System.Double | 雙精度浮點數 | ±5.0e-324 ~ ±1.7e308, 15-16 位精度 | D/d (預設) |
bool | System.Boolean | 布林邏輯值 | true / false | — |
char | System.Char | 單一 Unicode 字符 (UTF-16) | U+0000 ~ U+FFFF | 'c' |
decimal | System.Decimal | 高精度十進制浮點數 | ±1.0e-28 ~ ±7.9e28, 28-29 位有效數字 | M/m |
C/C++ 中 int i = 0; if (i = 0) ... 編譯通過但邏輯錯誤(賦值而非比較)。C# 嚴格禁止整數隱式轉換為 bool:
int i = 0;
if (i = 0) { } // 編譯錯誤 CS0029: Cannot implicitly convert type 'int' to 'bool'
正確寫法:
if (i == 0) { } // 比較
if ((str = Console.ReadLine()) == "") { } // 賦值後比較
設計哲學:條件判斷必須是明確的布林表達式,消除賦值/比較混淆、非零即真等隱性規則。
int、uint、long、ulong(首個能容納者)。0x...)無後綴 → int、uint、long、ulong。double。1.23F → float,1.23D/1.23 → double,1.23M → decimal。char 字面量:'a', '\n', '\u0041'。string 字面量:"line\nbreak" (轉義)、@"C:\path\file" (逐字字串,雙引號用 "" 轉義)。System.ValueType):所有數值類型、bool、char、decimal、結構體、枚舉。存儲於棧/內聯,賦值複製內容。object、string、類別、介面、委托、陣列。存儲於堆,變量存引用。decimal 雖為值類型,但非基元類型(CLR 無專用指令),運算由 BCL 方法實現。
C# 允許結構體重載運算子,實現類基本類型語義:
using System;
struct Digit { /* 內部 int 值 + 運算子重載 */ }
class Test {
static void TestInt() {
int a = 1, b = 2, c = a + b; Console.WriteLine(c); // 3
}
static void TestDigit() {
Digit a = (Digit)1, b = (Digit)2, c = a + b; Console.WriteLine(c); // 3
}
static void Main() { TestInt(); TestDigit(); }
}
這展示了 C# 類型系統的可擴展性:使用者定義類型可擁有與基本類型一致的語法體驗。
int a = 5 / 2; // 2。需浮點運算請用 5.0 / 2 或轉型。a == b,用 Math.Abs(a-b) < epsilon。float/double 為二進制浮點,0.1 無法精確表示;decimal 為十進制浮點,適合貨幣。int.MaxValue + 1 → int.MinValue)。用 checked 區塊/編譯選項啟用檢查拋 OverflowException。int → long);顯式轉換可能截斷/溢出((int)longVal),需謹慎。C# 預定義類型是類型系統的基石,固定大小、嚴格語義、豐富字面量支援。理解 bool 非整數、值/參考類型分工、decimal 精度優勢、溢出檢查機制,能避免 90% 初學者類型相關 Bug。下一篇將講解運算式、運算子與流程控制語句。