首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 7 入門筆記:foreach、checked/unchecked 與 lock 陳述式詳解

     編輯:關於C語言

前言

C# 繼承 C/C++ 大多數陳述式,但有幾項獨特或改良的語法值得注意。本文聚焦 foreach、checked/unchecked 溢位控制與 lock 同步鎖定。

1. foreach 陳述式

列舉實作 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 不影響集合元素
}
  • 唯讀遍歷:無法在 foreach 區塊中修改集合元素 (會編譯錯誤)。
  • 適用於陣列、List<T>、ArrayList 等所有 IEnumerable。

2. checked / unchecked 溢位檢查

2.1 陳述式區塊

int x = 1000000, y = 1000000;

checked { int z = x * y; } // 拋 OverflowException
unchecked { int z = x * y; } // 回傳 -727379968 (截斷)
int z = x * y; // 預設行為取決於編譯器選項 /checked

2.2 運算子形式 (用於常數運算式)

const int x = 1000000, y = 1000000;
int a = checked(x * y);   // 編譯期警告:溢位
int b = unchecked(x * y); // 無警告,結果 -727379968

2.3 常見用途:十六進位常數轉 int

public const int AllBits = unchecked((int)0xFFFFFFFF); // -1
public const int HighBit = unchecked((int)0x80000000); // Int32.MinValue

C# 十六進位字面值預設為 uint,超過 int 範圍需 unchecked 強制轉型。

2.4 重要限制

checked/unchecked 不影響方法呼叫內部運算:

static int Mul(int a, int b) => a * b;
checked { int r = Mul(1000000, 1000000); } // 不會檢查 Mul 內部溢位

3. lock 陳述式

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# 程式碼。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved