核心區別
| 特性 | 靜態字段 (static) | 實例字段 |
| 歸屬 | 類本身 | 具體對象實例 |
| 內存 | 應用程序域級,僅一份 | 每個實例獨立一份 |
| 訪問方式 | 類名.字段名 | 實例.字段名 |
| 生命周期 | 程序運行全程 | 隨實例創建/銷毀 |
代碼示例
public class Program
{
private static int staticField = 0; // 靜態字段
private int instanceField = 0; // 實例字段
static void Main()
{
Program p = new Program();
Console.WriteLine(p.instanceField); // 0 - 通過實例訪問實例字段
Console.WriteLine(Program.staticField); // 0 - 通過類名訪問靜態字段
}
}
readonly 關鍵字詳解
- 用於聲明只讀字段,僅能在聲明時或構造函數中賦值。
- 區別於
const:const 編譯期常量,隱含 static;readonly 運行時常量,可為實例字段,構造函數可賦值不同值。
readonly 示例
public class Demo
{
private readonly int initOnly = 0; // 聲明時賦值
private readonly int ctorOnly; // 僅構造函數賦值
public Demo(int value)
{
ctorOnly = value; // 合法:構造函數中賦值
}
public void TryModify()
{
// initOnly = 10; // 編譯錯誤 CS0191
// ctorOnly = 20; // 編譯錯誤
}
}
進階:靜態構造函數與 readonly
public class Config
{
public static readonly string ConnectionString;
static Config()
{
// 運行時一次性初始化,可讀取配置文件、環境變量等
ConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings["Default"].ConnectionString;
}
}
最佳實踐
- 優先使用
readonly 替代 const,除非值絕對不變(如 Math.PI)。
- 靜態字段慎用可變引用類型(如
List),多線程環境下需鎖定或使用 Concurrent 集合。
- 實例字段封裝為屬性,控制訪問邏輯與驗證。