C# 委托

C#委托

Firstly,let us look back on function pointer in c, the following is an example.

Function Pointer
#include "stdafx.h"
#include
"stdio.h"
#include
"stdlib.h"

int (*Test)(int l); //定义函数指针

int Add(int t)
{
return t+t;
}
int Mut(int t)
{
return t*t;
}

//把函数做参数
int test2(int t,int (*p)(int))
{
return p(t);
}

int _tmain(int argc, _TCHAR* argv[])
{
char input[8];
printf(
"Please Input a Number!\n");
scanf(
"%s",input);
int t=atoi(input);
int p;

if(t>10)
{
Test
=Add; //指针执行Add
}
else Test=Mut; //指针指向Mut
p=Test(t); //通过指针调用

printf(
"The Result is %d\n",p);
if(t>10)
{
p
=test2(t,Add);
}
else p=test2(t,Mut);
printf(
"The Result is %d\n",p);
system(
"pause");
return 0;
}

     一、委托
     委托类似于函数指针,但函数指针只能引用静态方法,而委托既能引用静态方法,也能引用实例方法。
     委托使用分三步:1、委托声明。2、委托实例化。3、委托调用。
     二、例子:
    delegate int NumOpe(int a,int b); //第一步,声明委托
    class Class1
    {
        static void Main(string[] args)
        {
            Class1 c1 = new Class1();
            NumOpe d1 = new NumOpe(c1.Add);//委托实例化,注意参数是要使用的方法名,且不带括号
            Console.WriteLine(d1(1, 2));//委托调用
            Console.Read();
        }
        private int Add(int num1, int num2)
        {
            return (num1 + num2);
        }
    } */
    /*例中,委托NumOpe引用了方法Add
 委托声明了以后,就可以像类一样进行实例化,委托本身就是处在类级别上的 。实例化时把要引用的方法作为参数,这样
 委托和方法就关联了起来,就可以用委托来引用方法了。
 委托和所引用的方法必须保持一致。
 1、参数个数、类型、顺序必须完全一致。
 2、返回值必须一致。
 **/
    /*
    下面再看一个委托的示例。
     * */
    public delegate void PrintHandler(string str);//声明委托类型
    public class PrintStr
    {
        public void CallPrint(string input)
        {
            Console.WriteLine(input);
        }
        public void CallPrint1(string input)
        {
            Console.WriteLine(input);
        }
    }
    class Program
    {
        static void Main1(string[] args)
        {
            PrintStr myPrinter = new PrintStr();
            PrintHandler myHandler = null;
            //将委托链接到方法,来实例化委托
            myHandler += new PrintHandler(myPrinter.CallPrint);
            myHandler += new PrintHandler(myPrinter.CallPrint1);
            //不使用“=”是因为这样会覆盖掉以前注册的方法
            if (myHandler != null)
            {
                myHandler("Hello World!");   //调用委托,相当于匿名调用委托所链接的方法
            }
            myHandler -= new PrintHandler(myPrinter.CallPrint);
            if (myHandler == null)
            {
                Console.WriteLine("myHandler==null");
            }
            else
            {
                myHandler("最后的一个方法");
                myHandler -= new PrintHandler(myPrinter.CallPrint1);
                Console.WriteLine("把最后的一个也去掉");
                if (myHandler == null)
                {
                    Console.WriteLine("myHandler==null");
                }
                else Console.WriteLine("还有一个");
            }
            Console.Read();
        }
    }//那什么时候该使用委托呢?一个经典回答:若A变动,一系列的B,C,D,E,F将变动,可使用委托。
}

原文地址:https://www.cnblogs.com/lhking/p/1372468.html