首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> C# 入門

C# 變數完整指南:宣告、初始化、型別推斷、作用域、實值/參考型別、Lvalue/Rvalue

     編輯:C# 入門

C# 變數完整指南:宣告、初始化、型別推斷、作用域、實值/參考型別、Lvalue/Rvalue

變數 是程式操作資料的具名儲存位置。C# 是強型別語言,每個變數有固定型別,決定記憶體大小、配置位置、允許操作。掌握變數宣告、初始化、作用域、型別分類,是寫出正確程式的基石。

變數宣告與初始化

// 基本宣告:型別 變數名;
int score;
string name;
double price;

// 宣告並初始化
int count = 0;
string title = "C# Guide";
var pi = 3.14159; // 型別推斷 (C# 3+)

// 多變數宣告 (同型別)
int x = 1, y = 2, z = 3;
var (a, b) = (10, 20); // 元組解構 (C# 7+)

// 預設值運算子
int defaultInt = default; // 0
string defaultString = default; // null
var defaultStruct = default(MyStruct); // 結構體預設值

隱含型別區域變數

var 讓編譯器從初始化運算式推斷型別:

var i = 42;        // int
var s = "hello";   // string
var list = new List(); // List
var anon = new { Name = "Alice", Age = 30 }; // 匿名型別

// 限制:
// - 必須初始化
// - 不能為 null (無法推斷)
// - 不能用於欄位/屬性/參數/回傳型別
// - 不能在宣告前使用

型別分類:實值型別 vs 參考型別

分類型別範例記憶體配置指派行為預設值
實值型別int, double, bool, char, struct, enum, DateTime堆疊 / 內嵌複製值全 0 / false / '\0'
參考型別class, string, array, delegate, interface, object堆積複製參考null
可為 Null 實值型別int?, bool?, DateTime?堆疊 (包裝)複製值null (HasValue=false)

實值型別分類

  • 簡單型別:sbyte, byte, short, ushort, int, uint, long, ulong, char, float, double, decimal, bool
  • 結構型別:struct (含 DateTime, TimeSpan, Guid 等)
  • 列舉型別:enum (底層為整數)
  • Tuple 型別:(int, string) (C# 7+)

參考型別分類

  • 類別型別:class、record、object、string
  • 介面型別:interface
  • 陣列型別:int[], string[,]
  • 委派型別:Action, Func<T>, 自訂委派
  • 動態型別:dynamic (延遲繫結)

變數作用域與生命週期

區域變數

方法/建構子/屬性/索引子/事件存取子/區域函數內宣告:

void Method() {
    int x = 1; // 進入方法配置,離開方法釋放 (實值型別)
    if (true) {
        int y = 2; // 區塊作用域,僅在 {} 內可見
    }
    // y 不可見
    for (int i = 0; i < 10; i++) { // i 作用域限於 for
        var z = i * 2;
    }
}

欄位

類別/結構體直接宣告:

  • 實例欄位:隨物件生命週期,堆積配置
  • 靜態欄位:static,應用程式域生命週期,靜態建構子前初始化
  • 常數:const,編譯期常數,隱含 static
  • 唯讀:readonly,建構子/宣告初始化

參數

  • 值參數:預設,建立副本
  • 參考參數:ref,共用儲存位置
  • 輸出參數:out,必須指派
  • 唯讀參考:in,禁止修改
  • 參數陣列:params,可變參數

Lvalue 與 Rvalue

C# 運算式分為兩類:

類型定義範例可指派
Lvalue參考儲存位置的運算式,可出現在指派左邊變數、屬性、索引子、陣列元素、ref 回傳是
Rvalue代表值的運算式,只能出現在指派右邊字面值、方法呼叫、運算子運算式、常數否
int a = 10;     // a 是 Lvalue, 10 是 Rvalue
a = 20;         // OK
// 10 = a;      // 錯誤:Rvalue 不能在左邊
a + b = 30;     // 錯誤:a+b 是 Rvalue
arr[0] = 5;     // OK:索引子是 Lvalue
DateTime.Now = DateTime.MinValue; // 錯誤:屬性唯讀 (無 setter)

變數命名規則與慣例

類型慣例範例
區域變數/參數camelCasefirstName, itemCount
私有欄位_camelCase 或 camelCase_firstName, firstName
公開欄位/屬性PascalCaseFirstName, ItemCount
常數PascalCaseMaxRetries
類型參數T 或 TDescriptorT, TKey

規則:字母/底線開頭、可含數字/底線、不可為關鍵字 (除非加 @ 前綴)、區分大小寫。

進階:解構與模式比對宣告

// 元組解構
var (name, age) = GetPerson(); // 宣告多變數

// 物件解構 (需 Deconstruct 方法)
var (x, y) = point; // Point.Deconstruct(out x, out y)

// 模式比對宣告 (C# 7+)
if (obj is int i) { /* i 為區域變數 */ }
if (input is string { Length: > 0 } s) { /* s 為區域變數 */ }

// switch 運算式宣告
var result = input switch {
    int i => i * 2,
    string s => s.Length,
    _ => 0
};

最佳實踐

  • 就近宣告:在首次使用前宣告,縮小作用域。
  • 初始化即宣告:避免未初始化變數 Bug。
  • 善用 var:型別明顯時 (new List、字面值);型別不明顯時寫明型別。
  • 不可變優先:區域變數預設不重新指派,需要時再改。
  • 避免隱藏外層變數:內層區塊宣告同名變數會產生警告 (CS0108)。
  • 正確選擇實值/參考型別:小型資料結構用 struct,大型/共享狀態用 class。

常見問題 FAQ

Q: var 是動態型別嗎?

A: 不是。var 是靜態型別推斷,編譯期決定型別,執行期不可變。dynamic 才是動態型別。

Q: 結構體變數預設值如何產生?

A: 所有欄位遞歸設為 0/null/false。無參數建構子不存在 (C# 10 前),default(T) 產生全零實例。

Q: 參考型別變數佔多少記憶體?

A: 32 位元程序 4 bytes,64 位元程序 8 bytes (指標大小)。物件本身在堆積另行配置。

Q: 什麼時候用 ref 區域變數?

A: 需要修改陣列元素、ref 回傳值、或避免大型結構體複製時。

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