zoukankan      html  css  js  c++  java
  • 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将变动,可使用委托。
    }

  • 相关阅读:
    build、host和target选项
    第一篇博客
    C++中的new和delete
    新分类:C++复习笔记
    泛读英文小说推荐
    借助查询分析器对遗留项目进行分析
    程序员等级(非本人观点)
    线程并发时的四种数据同步方法
    单元测试之什么是优秀的单元测试
    多线程之进度条
  • 原文地址:https://www.cnblogs.com/lhking/p/1372468.html
Copyright © 2011-2022 走看看