C# 委託

來源:互聯網
上載者:User

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將變動,可使用委託。
}

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.