zoukankan      html  css  js  c++  java
  • c# 匿名方法學習

    1. 匿名方法简介
        匿名方法允许我们以一种“内联”的方式来编写方法代码,将代码直接与委托实例相关联,从而使得委托实例化的工作更加直观和方便。


    2.匿名方法的几个相关问题:

    2.1 参数列表
        匿名方法可以在delegate关键字后跟一个参数列表(可以不指定),后面的代码块则可以访问这些参数:
    addButton.Click += delegate(object sender, EventArgs e) {MessageBox.Show(((Button)sender).Text);};

    注意“不指定参数列表”与“参数列表为空”的区别

    addButton.Click += delegate {…} // 正确!
    addButton.Click += delegate() {…} // 错误!


    2.2 返回值
        如果委托类型的返回值类型为void,匿名方法里便不能返回任何值;如果委托类型的返回值类型不为void,匿名方法里返回的值必须和委托类型的返回值兼容:

    delegate int MyDelegate();
    MyDelegate d 
    = delegate{
        ……
        
    return 100;
    };

    delegate void MyDelegate();
    MyDelegate d 
    = delegate{
        ……
        
    return;
    };

    2.3 外部变量
        一些局部变量和参数有可能被匿名方法所使用,它们被称为“匿名方法的外部变量”。外部变量的生存期会由于“匿名方法的捕获效益”而延长——一直延长到委托实例不被引用为止。

    static void Foo(double factor)
    {
        Function f
    =delegate(int x)
       {
            factor 
    +=02// factor为外部变量
            return x * factor;
        };
        Invoke(f); 
    // factor的生存期被延长
    }


    3.委托类型的推断
        C#2.0 允许我们在进行委托实例化时,省略掉委托类型,而直接采用方法名,C#编译器会做合理的推断。
    • C# 1.0中的做法:

    addButton.Click += new EventHandler(AddClick);
    Apply(a, 
    new Function(Math.Sin));


    • C# 2.0中的做法:

    addButton.Click += AddClick;
    Apply(a, Math.Sin);


    4 匿名方法机制
        C# 2.0中的匿名方法仅仅是通过编译器的一层额外处理,来简化委托实例化的工作。它与C# 1.0的代码不存在根本性的差别。

    4.1 静态方法中的匿名方法

    public delegate void D();
    static void F()
    {
        D d 
    = delegate { Console.WriteLine("test"); }
    }

    上面的代码被编译器转换为:

    static void F()
     {
        D d 
    = new D(<F>b__0);
    }

    static void <F>b__0()
     {

        //
    函数名和类名可能不同
        Console.WriteLine("test");
    }


    4.2 实例方法中的匿名方法

    class Test
     {
        
    int x;
        
    void F()
        {
            D d 
    = delegate { Console.WriteLine(this.x); };
        }
    }


    上面的代码被编译器转换为:

    void F()
     {
        D d 
    = new D(<F>b__0);
    }
    void <F>b__0()
     {
        Console.WriteLine(
    this.x);
    }


    4.3 匿名方法中的外部变量

    void F()
     {
        
    int y = 123;
        D d 
    = delegate { Console.WriteLine(y); };
    }


    轉自:http://blog.csdn.net/happyhippy/archive/2007/03/20/1534812.aspx

  • 相关阅读:
    一些业内有名的网站收集
    WCF重载
    FCKEditor fckconfig.js配置,添加字体和大小 附:中文字体乱码问题解决
    查询第几条到第几条的数据的SQL语句
    SPOJ 9939 Eliminate the Conflict
    UVA 10534 Wavio Sequence
    HDU 3474 Necklace
    POJ 2823 Sliding Window
    UVA 437 The Tower of Babylon
    UVA 825 Walking on the Safe Side
  • 原文地址:https://www.cnblogs.com/scottckt/p/929233.html
Copyright © 2011-2022 走看看