惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

N
Netflix TechBlog - Medium
J
Java Code Geeks
爱范儿
爱范儿
雷峰网
雷峰网
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
博客园 - 三生石上(FineUI控件)
H
Hackread – Cybersecurity News, Data Breaches, AI and More
B
Blog RSS Feed
Google DeepMind News
Google DeepMind News
Jina AI
Jina AI
The GitHub Blog
The GitHub Blog
I
InfoQ
月光博客
月光博客
博客园 - 聂微东
博客园 - Franky
The Cloudflare Blog
阮一峰的网络日志
阮一峰的网络日志
博客园_首页
G
Google Developers Blog
Blog — PlanetScale
Blog — PlanetScale
L
LangChain Blog
罗磊的独立博客
Apple Machine Learning Research
Apple Machine Learning Research

博客园 - Samson小天

My researches during my college life. 一些底层的简单东西。 IAT HOOK 实现进程保护 大年初一,总结一下去年的十大事件~ 解决多线程产生的“以前的函数求值超时,函数求值被禁用。必须继续执行才能重新启用函数求值” Guessing Game解题报告 (pku 2328) 分析一道08年10月12日的江苏省程序设计大赛正赛题 数学之美 C# 自定义实体类或集合的自动排序 UltraRun is released 简单的QQ游戏中大家来找茬外挂编写思路 最近写C++程序时关于GetLastError的感悟。 在Vista的UAC下检查程序是否具有Admin权限及应用程序的权限切换 从程序开发角度谈类的封装性。 教你如何解决“线程间操作无效: 从不是创建控件的线程访问它” C#中调用WIN32的API 一个计算简单数学表达式值的算法。 string类型的初值不是随便赋的,记一次奇怪的访问冲突事件 对C#中ADO.NET开发的理解
小记delegate,简单的委托介绍
Samson小天 · 2008-04-13 · via 博客园 - Samson小天

    委托(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();
        }

    }

}