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

C# 基礎入門:深入理解數據類型與記憶體模型

     編輯:關於C語言

在正式踏入 C# 數據類型的世界前,有個核心觀念必須釐清:C# 和 Java 一樣,都是強類型語言。這意味著兩個關鍵特性:第一,每個變數與運算式都擁有嚴格定義的類型;第二,所有數值傳遞——無論是直接賦值還是透過方法參數——都必須通過類型相容性檢查。這套機制從根本上杜絕了隱式類型轉換帶來的潛在錯誤。

值類型與引用類型:記憶體層面的本質差異

C# 的數據類型劃分為兩大陣營:值類型與引用類型。它們最本質的區別在於資料存儲位置與訪問方式:

  • 值類型:變數直接包含數據本身,存儲在堆疊上。存取速度快、生命週期隨作用域自動結束。
  • 引用類型:變數存儲的是指向數據的引用(位址),實際數據存放在堆積上。多個變數可引用同一物件,由垃圾回收器管理生命週期。

C# 內建 15 種預定義類型,其中 13 種為值類型,僅 string 與 object 為引用類型。

13 種基本值類型速覽

下表整理了所有基本值類型的關鍵資訊,涵蓋了整數、浮點數、十進位、布林與字元類型:

類別關鍵字.NET 類型大小/範圍預設值
整數sbyteSystem.SByte8 位元有號 (-128~127)0
byteSystem.Byte8 位元無號 (0~255)0
shortSystem.Int1616 位元有號0
ushortSystem.UInt1616 位元無號0
intSystem.Int3232 位元有號0
uintSystem.UInt3232 位元無號0
longSystem.Int6464 位元有號0L
ulongSystem.UInt6464 位元無號0L
浮點數floatSystem.Single32 位元 IEEE 7540.0F
doubleSystem.Double64 位元 IEEE 7540.0
高精度decimalSystem.Decimal128 位元,28-29 位有效數字0.0M
布林boolSystem.Booleantrue / falsefalse
字元charSystem.Char16 位元 Unicode (U+0000~U+FFFF)'\0'

新手必知的 5 大易錯細節

1. byte 與 char 的本質不同

byte 是 8 位元無號整數,char 是 16 位元 Unicode 字元。兩者不能隱式互轉,強制轉換時必須注意資料截斷或編碼問題。

2. bool 不等同於 0/1

C# 的 bool 僅能接受 true/false,絕不等價於整數 1/0。這與 C/C++ 截然不同,避免了 if (count) 這類隱性 Bug。

3. 字元與字串的字面量語法

  • 字元:單引號 'A'
  • 字串:雙引號 "A"

寫錯引號會導致類型推斷錯誤,編譯器會直接報錯。

4. char 轉義序列完整表

轉義序列字元說明
\''單引號
\""雙引號
\\\反斜線
\0null空字元
\aBEL警告音
\bBS退格
\fFF換頁
\nLF換行
\rCR歸位
\tHT水平定位
\vVT垂直定位
\uXXXXUnicode4 位十六進位 Unicode
\xXXXXUnicode十六進位 Unicode (變長)

5. char 的多種表示法

char c1 = 'A';           // 字面量
char c2 = '\u0041';      // Unicode 轉義
char c3 = '\x0041';      // 十六進位
char c4 = (char)65;      // 數值強轉

引用類型二雄:object 與 string

object:類型系統的「始祖」

object 是所有類型(內建與使用者自訂)的基底類別。任何類型的實例都可隱式轉型為 object 參考,這就是裝箱的由來:

object obj = 42;      // int 裝箱為 object
object str = "Hello"; // string 本身就是引用類型

string:不可變的字串首選

C# 內建 string 類型,底層為不可變字元陣列。看似修改字串,實則建立新實例:

string s1 = "A string";
string s2 = s1;           // 兩變數指向同一物件
s1 = "Another string";    // s1 指向新物件,s2 不變
Console.WriteLine(s2);    // 輸出 "A string"

此特性保證了執行緒安全,但頻繁拼接時建議使用 StringBuilder。

變數初始化鐵律

區域變數必須在使用前明確賦初值,否則編譯器報錯(CS0165)。類別欄位則有預設值(0、null、false 等),但良好習慣是顯式初始化。


小結:掌握值/引用類型的記憶體語義、基本類型範圍與轉換規則,是寫出高效、無 Bug C# 程式的基石。下一步建議深入探討泛型、可為 null 的值類型與記憶體管理進階主題。

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