zoukankan      html  css  js  c++  java
  • C#的匿名方法

    没有匿名方法的时候(C# 1.0)

    addButton.Click += new EventHandler(AddClick);

    void AddClick(object sender,EventArgs e)
    {
       listBox.Items.Add(textBox.Text);
    }

    有了匿名方法之后(C# 2.0)

    addButton.Click += delegate
    {
       listBox.Items.Add(textBox.Text);
    }

    C# 支持用于调用一个或多个方法的委托 (delegate)。委托提供运算符和方法来添加或删除目标方法,它也可以在整个 .NET 框架中广泛地用于事件、回调、异步调用、多线程等。

    常规委托:

    class SomeClass
    {
       delegate void SomeDelegate();
       public void InvokeMethod()
       {
          SomeDelegate del = new SomeDelegate(SomeMethod);     
          del();
       }
       void SomeMethod()  
       {     
          MessageBox.Show("Hello");
       }
    }

    可以用一个匿名方法来定义和实现这个方法:

    class SomeClass
    {
       delegate void SomeDelegate();
       public void InvokeMethod()
       {
          SomeDelegate del = delegate()
                             {
                                 MessageBox.Show("Hello");
                             };
          del();  
       }
    }

    匿名方法当做参数传入:
    class SomeClass
    {
       delegate void SomeDelegate();
       public void SomeMethod()  
       {     
          InvokeDelegate(delegate(){MessageBox.Show("Hello");});  
       }  
       void InvokeDelegate(SomeDelegate del)  
       {     
          del();  
       }
    }

    下面是一个将匿名方法作为参数传递的具体而实用的示例,它在没有显式定义 ThreadStart 委托或线程方法的情况下启动一个新的线程:

               public class MyClass

               {

                   public void LauchThread()

                   {

                       Thread workerThread = new Thread(delegate()

                                             {

                                                 MessageBox.Show("Hello");

                                             });

                       workerThread.Start();

                   }

               }


    带参数的匿名方法:

    class SomeClass
    {
       delegate void SomeDelegate(string str);
       public void InvokeMethod()
       {
          SomeDelegate del = delegate(string str)
                             {
                                 MessageBox.Show(str);
                             };
          del("Hello");  
       }
    }


    一般的匿名方法:
    class SomeClass<T>
    {  
       delegate void SomeDelegate(T t);  
       public void InvokeMethod(T t)  
       {     
          SomeDelegate del = delegate(T item){...}   
          del(t);  
       }
    }

    注意点:

    1.如果匿名方法没有参数,则可以在 delegate 关键字后面使用一对空括号:

    class SomeClass
    {
    delegate void SomeDelegate();
    public void InvokeMethod()
    {
    SomeDelegate del = delegate()
    {
    MessageBox.Show("Hello");
    };
    del();
    }
    }

    2.如果您将 delegate 关键字与后面的空括号一起忽略,则您将定义一种特殊的匿名方法,它可以指派给具有任何签名的任何委托:class SomeClass
    {
       delegate void SomeDelegate(string str);
       public void InvokeMethod()
       {
          SomeDelegate del = delegate                        
                             {
                                 MessageBox.Show("Hello");
                             };
          del("Parameter is ignored");  
       }
    }

  • 相关阅读:
    docker 入门(docker 镜像 、容器、仓库)
    windows 安装 docker
    关于go mod 的使用和goland 配置 go mod
    mac 安装docker
    vm 将宿主机文件夹 映射至 虚拟机
    centos 关于yum无法使用
    mac 安装 swoole 可能会出现的错误
    BZOJ3378:[USACO]MooFest 狂欢节(树状数组)
    BZOJ3110:[ZJOI2013]K大数查询(整体二分)
    BZOJ4170:极光(CDQ分治)
  • 原文地址:https://www.cnblogs.com/chencidi/p/1905389.html
Copyright © 2011-2022 走看看