C# 2.0 (Whidbey) 不僅帶來「四大特性」(泛型、匿名方法、迭代器、部分類型),更在語法細節上實施了六項極具實用價值的增強,大幅提升程式碼的邏輯嚴謹性、可讀性與互操作能力。本文逐項深度解析並附實戰代碼。
static class,只能自律將所有成員標 staticnew StaticClass() 建立無意義實例
public static class MathUtils
{
public static double PI = 3.14159;
public static double Sqrt(double x) => Math.Sqrt(x);
// int _field; // CS0708: 無法在靜態類別宣告實例成員
}
// MathUtils m = new MathUtils(); // CS0712: 無法建立靜態類別實例
// MathUtils m; // CS0723: 無法宣告靜態類別型別變數
get/set 必須共享相同存取修飾符,導致「公開讀、內部寫」只能繞道私有欄位 + 內部方法,碎片化邏輯。
public class Account
{
private decimal _balance;
public decimal Balance
{
get => _balance; // 公開讀
internal set // 同組件/衍生類別寫
{
if (value < 0) throw new ArgumentException("餘額不可為負");
_balance = value;
}
}
// 內部方法直接用屬性,自動享有驗證
internal void Deposit(decimal amount) => Balance += amount;
}
public → set 可 internal/private/protected).NET 三大 Timer:System.Timers.Timer、System.Threading.Timer、System.Windows.Forms.Timer。using 導入後同名衝突,仍需完整限定名。
using SysTimers = System.Timers;
using Threading = System.Threading;
using WinForms = System.Windows.Forms;
public class Scheduler
{
private SysTimers.Timer _backgroundTimer; // 後台輪詢
private WinForms.Timer _uiTimer; // UI 動畫
}
using IntMap = System.Collections.Generic.Dictionary<int, string>;
using JsonNode = Newtonsoft.Json.Linq.JToken;
IntMap map = new IntMap();
namespace MyLib
{
namespace System { public class Console { } } // 遮蔽全域 System
}
在 MyLib.System 內寫 System.Console.WriteLine 會解析到自己定義的 Console,導致編譯錯誤。
namespace MyLib.System
{
public class Wrapper
{
public void Write(string s) => global::System.Console.WriteLine(s);
}
}
global:: 永遠指向全域根命名空間,不受任何嵌套影響。
調試時臨時變數未使用 → CS0168 警告淹沒真正錯誤。專案層級 /nowarn 過於粗暴。
public void DebugMethod()
{
#pragma warning disable 0168 // 禁用「變數宣告未使用」
int tempStatus = GetStatus(); // 僅調試用
#pragma warning restore 0168 // 恢復
}
#pragma warning disable 0168, 0219#pragma warning disable / restoreC 風格結構體 char buffer[128],用於 P/Invoke、二進位協議、高效能序列化。C# 1.x 無法在 struct 內宣告固定長度陣列。
using System.Runtime.CompilerServices;
[StructLayout(LayoutKind.Sequential)]
public struct PacketHeader
{
public int MessageId;
public long Timestamp;
[FixedBuffer(typeof(byte), 128)]
public byte Payload; // 實際為 byte[128],不可單獨存取元素
}
// 使用 unsafe 存取
unsafe
{
var header = new PacketHeader();
fixed (byte* p = header.Payload)
{
for (int i = 0; i < 128; i++) p[i] = 0xFF;
}
}
unsafe 上下文 + fixed 陳述式取得指標| 特性 | 關鍵字/屬性 | 核心價值 | 適用版本 |
|---|---|---|---|
| 靜態類別 | static class | 編譯器強制純靜態契約 | C# 2.0+ |
| 屬性存取差異 | get/set 獨立修飾符 | 封裝驗證邏輯、API 設計靈活 | C# 2.0+ |
| 命名空間別名 | using Alias = NS | 解決同名衝突、簡化長名稱 | C# 2.0+ |
| global 限定符 | global:: | 穿透嵌套命名空間遮蔽 | C# 2.0+ |
| pragma warning | #pragma warning | 區塊級精準控制警告 | C# 2.0+ |
| 固定緩衝區 | FixedBufferAttribute | 結構體內嵌固定陣列、P/Invoke | C# 2.0+ (unsafe) |
結語:這六項語法增強看似微小,卻精準解決了 C# 1.x 時代的實際痛點:靜態類別修正設計意圖洩漏、屬性差異化存取重塑封裝邊界、命名空間別名/global化解大型專案命名衝突、pragma warning提升調試信噪比、固定緩衝區打通非託管互操作最後一公里。升級 C# 2.0 時,請務必將這些「隱藏寶石」納入團隊編碼規範。