C# 繼承 C/C++ 大多數陳述式,但有幾項獨特或改良的語法值得注意。本文聚焦 foreach、checked/unchecked 溢位控制與 lock 同步鎖定。
列舉實作 IEnumerable 的集合,自動處理型別轉換:
ArrayList list = new ArrayList();
for (int i = 0; i < 10; i++) list.Add(i);
foreach (object o in list)
{
int i = (int)o; // 若用 for 迴圈需手動轉型,foreach 同樣需轉型但語法更簡潔
Console.WriteLine(i);
Console.WriteLine(++i); // 注意:修改區域變數 i 不影響集合元素
}
List<T>、ArrayList 等所有 IEnumerable。int x = 1000000, y = 1000000;
checked { int z = x * y; } // 拋 OverflowException
unchecked { int z = x * y; } // 回傳 -727379968 (截斷)
int z = x * y; // 預設行為取決於編譯器選項 /checked
const int x = 1000000, y = 1000000;
int a = checked(x * y); // 編譯期警告:溢位
int b = unchecked(x * y); // 無警告,結果 -727379968
public const int AllBits = unchecked((int)0xFFFFFFFF); // -1
public const int HighBit = unchecked((int)0x80000000); // Int32.MinValue
C# 十六進位字面值預設為 uint,超過 int 範圍需 unchecked 強制轉型。
checked/unchecked 不影響方法呼叫內部運算:
static int Mul(int a, int b) => a * b;
checked { int r = Mul(1000000, 1000000); } // 不會檢查 Mul 內部溢位
private readonly object _lock = new object();
public void ThreadSafeMethod()
{
lock (_lock)
{
// 臨界區:同一時間僅一執行緒進入
}
}
lock 編譯為 Monitor.Enter/Exit,確保互斥。private readonly 參考型別,避免公開鎖導致死結。lock(this)、lock(typeof(Type)) 等公開物件。foreach 簡化集合遍歷,checked/unchecked 給予溢位控制靈活性,lock 提供基礎執行緒同步。掌握這三項,能寫出更安全、可維護的 C# 程式碼。