c#委托语法

眉间皱痕 提交于 2020-04-03 21:46:56

在c#中可以使用委托来实现一些接口的功能,委托也是可以实例化的,实例化委托的参数就是委托对应的方法,然后将该实例赋值给委托变量,执行该委托变量来调用委托中的方法,请看如下代码:

static class Program
   {

       delegate void TestDelegate(string msg);
       [STAThread]
       static void Main()
       {
           TestDelegate td = new TestDelegate(TestDelegateMthod);
           td("hello");      

}
private static void TestDelegateMthod(string msg)
{ Console.WriteLine(msg + "!"); }

   }

需要注意的是,委托相关的操作符有三个:=,+=,-+,=的含义是将=右边的委托实例赋值给=左边的委托变量,如果该变量已经包含了委托实例,则以前的委托实例将被新的实例所取代,+=的含义是将+=右边的委托实例添加到+=左边的委托变量中,委托变量可以保存多个委托实例,如果该变量已经保存有委托实例了,则会把新的委托实例添加到委托变量中,-+的含义是从-+左边的委托变量中移除右边的委托实例

在实例化委托时可以不使用new关键字,请看如下代码:

TestDelegate td = TestDelegateMthod;

当编译的时候编译器会自动添加new关键字,将TestDelegateMthod替换为new TestDelegate(TestDelegateMthod)。

在2.0以后的版本中可以使用匿名方法,所以我们在实例化委托时可以不定义对应方法,而直接指定执行代码块,请看代码:

TestDelegate td = delegate(string msg)
            {
                Console.WriteLine(msg);
            };

在2.0以后的版本中可以使用泛型,在委托中我们同样可以使用泛型,请看代码:

static class Program
    {

        delegate void TestDelegate<t>(t msg);
        [STAThread]
        static void Main()
        {
            TestDelegate<string> td1 = TestDelegateMthod;
            td1("hi");
        }
        private static void TestDelegateMthod(string msg)
        { Console.WriteLine(msg + "!"); }

   }

在以上代码中使用泛型来定义了要传入的参数类型,这样我们就可以在申明委托时再指定参数类型。由于在申明委托时已经指定具体的参数类型,所以我们在实例化委托时就可以使用具体的参数类型了,上面代码中的TestDelegateMthod方法使用的就是具体的参数类型,还可以如下写:

TestDelegate<string> td1 =TestDelegateMthod<string>;

private static void TestDelegateMthod<t>(t msg)
        {
            Console.WriteLine(msg.ToString());
        }

在这里实例化委托时指定了一个泛型方法。

理解了以上内容,再来看3.5中的Func<T, TResult>这类委托就容易理解了。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!