• 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

  • 相关阅读:
    文件操作
    xadmin的使用
    Vue
    Redis
    Django
    python小结
    利用线程池和回调函数爬虫
    drf-基表、断关联表关系、级联删除、正方向查询、子序列化
    drf序列化
    drf初识
  • 原文地址:https://www.cnblogs.com/scottckt/p/929233.html
Copyright © 2020-2023  润新知