public class Test1
{
public int Int1 { get; private set; }
public string String2 { get; set; }
}
<Int1>k__BackingField(名稱含特殊字元,避免與使用者代碼衝突)get_Int1()、set_Int1(int32) 兩個方法set 為 private,對應 set_Int1 為 private 方法get,則不會產生 set_XXX 方法IL 以方法實作屬性,使不支援屬性語法的語言(如早期 Managed C++)仍可透過 get_XXX/set_XXX 存取。但 C# 禁止直接呼叫這些方法(編譯錯誤:「cannot explicitly call Operator or Accessor」)。
若使用者代碼定義同名 get_Int1 方法,編譯器報錯:「Type already reserves a member called 'get_Int1'」
// 傳統
int[] a = new int[10];
// var 推斷
var a = new int[10]; // 編譯期確定為 int[]
a.GetType().ToString() // "System.Int32[]"
| 規則 | 說明 |
|---|---|
| 僅限區域變數 | 不可用於欄位、屬性、方法參數、回傳型別 |
| 宣告必須初始化 | var x; 編譯錯誤 |
| 型別不可變 | 初始化後型別固定,指派不同型別會編譯錯誤 |
| 非動態型別 | 非 JavaScript var,C# 仍為靜態強型別 |
自動屬性與 var 皆為編譯器語法糖,IL 層面無新機制。理解其生成細節,有助於除錯、反射操作與避免命名衝突。