var i = 0;
var flag = true;
var text = "Henllyee";
編譯器根據初始化表達式的靜態類型推斷變量類型,生成 IL 與顯式聲明無異。var 非動態類型,非 variant,純編譯期語法糖。
var list = new List { 1, 2, 4, 100 };
foreach (var item in list)
Console.Write(item + ", ");
var x = null; 報錯「無法從 null 推斷類型」類型編譯入程序集後定義固化。傳統擴展途徑:修改源碼重編譯、繼承(密封類不可繼承)、反射(性能差、非強類型)。C# 3.0 擴展方法提供靜態語法糖方案:編譯期將實例調用重寫為靜態調用,零運行開銷。
this T 指定擴展類型 T
public static class ObjectExtensions
{
public static string DisplayDefiningAssembly(this object obj)
{
var type = obj.GetType();
var asm = Assembly.GetAssembly(type);
return $"{type.Name} lives here:\n\t{asm}";
}
}
// 調用
var ds = new DataSet();
Console.WriteLine(ds.DisplayDefiningAssembly());
// 實例語法(推薦,流暢)
ds.DisplayDefiningAssembly();
// 靜態語法(等價,編譯器實際生成此形式)
ObjectExtensions.DisplayDefiningAssembly(ds);
using 命名空間擴展方法(越近越優先)
public class Sample { public void Func() => Console.WriteLine("實例"); }
public static class Ext { public static void Func(this Sample s) => Console.WriteLine("擴展"); }
new Sample().Func(); // 輸出:實例
// Ext.Func(new Sample()); // 顯式調用擴展方法
MyApp.Extensions)+ 項目級 global usingSystem 命名空間var 消除冗餘類型聲明,擴展方法打破類型封閉邊界。兩者皆為編譯期語法糖,零運行開銷,卻極大提升代碼表達力。掌握限制規則、優先級邏輯、命名空間策略,即可在項目中自信地應用這兩大 C# 3.0 基石特性。