小记delegate,简单的委托介绍

Posted on 2008-04-13 09:46  Samson小天  阅读(355)  评论(0编辑  收藏  举报
    委托(Delegate)和事件(Event)以前在多窗体的传值和事件的传递中都已经接触过了,但是都是照着网上依样画葫,没有仔细研究过。最近终于对委托有了点系统简单的了解。发上来分享,以后会补足事件的分析。
    delegate就相当于c++中指向方法的指针。他可以实例化。
    定义了一个public delegate void Add1(ref int i);我们就可以实例化Add1这个委托去指向任何一个与他返回值和传入参数相同的函数。
    代码中我分别用d1和d2去指向了Add1Method和AnotherAddOne,因为这两个方法的返回值和参数都是一样的,所以Add1委托都可以指向。
    委托的实例化也有两种:
            Add1 a1 = new Add1(Add1Method);
            Add1 a2 = Add1Method;
    一个是用new,标准的 类名 实例名=new 类名(构造参数),
    还有一个直接将函数赋给他形如 int i=0;
    其实这两种方法是完全一样的,就看你看哪个顺眼了,根据Wrox的《Professional C# & .net 3.0》叙述,两者最后生成的中间代码是一样的。
    知道了这些接下来告诉大家怎么调用,调用方法也有两种:
            a1.Invoke(ref i);
            a2(ref i);
    前一种是调用这个delegate类的方法,后一种就像标准的函数调用一样。这两种最后的结果也是一样的。
    这里不题BeginInvoke方法,这个是异步的,真要说的话应该放到线程里去讲。
    最后一种是多播委托。什么是多播委托呢?很简单(本来偶也不知道的),其实就是几个委托拼在一起就变成了多播委托……=_=||
    Add1 MultiAdd1 = a1 + a2;这样就把a1这个委托和a2组合其他给MultiAdd1委托,MultiAdd1就成了多播委托。其执行方式是先执行a1然后执行a2。如果你什么时候觉得a2不要了,可以用MultiAdd1 -= a2;把a2从里面去掉。够简单吧.....以下是测试代码,希望对大家有帮助。
using System;
using System.Collections.Generic;
using System.Text;

namespace FormalDelegateTest
{
    
public delegate void Add1(ref int i);
    
class Program
    
{
        
static void Add1Method(ref int i)
        
{
            i
++;
        }

        
static void AnotherAddOne(ref int i)
        
{
            i
++;
        }

        
static void Main(string[] args)
        
{
            
int i=0;

            
委托的两种实例方式

            
委托的三种调用方式

            
多播委托
            Console.ReadKey();
        }

    }

}

Copyright © 2024 Samson小天
Powered by .NET 8.0 on Kubernetes