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

Visual C# 2.0 匿名方法深度解析(七):for 迴圈捕獲變數陷阱、區域變數複製解決方案、總結

     編輯:關於C語言

for 迴圈捕獲迴圈變數的危險行為


public class Program
{
    public delegate void MyDelegate();
    public static void Main(string[] args)
    {
        MyDelegate d = null;
        for (int i = 1; i <= 5; i++)
        {
            MyDelegate tempD = delegate { Console.WriteLine(i); };
            d += tempD;
        }
        d();
    }
}

預期輸出: 1 2 3 4 5
實際輸出: 6 6 6 6 6

原因分析

  • 編譯器建立巢狀類別封裝 i 為實例欄位
  • 迴圈結束時 i 遞增至 6(滿足終止條件)
  • 所有委派共用同一個巢狀類別實例,故皆印出最終值 6

解決方案:在迴圈內建立區域變數副本


public class Program
{
    public delegate void MyDelegate();
    public static void Main(string[] args)
    {
        MyDelegate d = null;
        for (int i = 1; i <= 5; i++)
        {
            int k = i; // 每次迭代建立新區域變數
            MyDelegate tempD = delegate { Console.WriteLine(k); };
            d += tempD;
        }
        d();
    }
}

正確輸出: 1 2 3 4 5

原理:編譯器為每次迭代建立獨立巢狀類別實例,各自捕獲對應的 k 值。

總結

匿名方法是 C# 2.0 強大功能,實現閉包捕獲區域變數,但需理解編譯器內部機制(巢狀類別、實例共用)才能避開陷阱。正確使用可大幅提升程式碼表達力。

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