C#中的委托Delegate

一、概述

委托为引用类型

二、使用

1、声明委托类型,定义委托

public delegate void HandlerDelegate(string message);

2、声明委托变量

HandlerDelegate myDelegate;//声明委托变量

3、实例化委托,带函数引用

传统方式

//myDelegate = new HandlerDelegate(Method1);//可以为静态方法或者实例方法。
//或者直接myDelegate = Method1;

方法定义:

public void Method1(string mgs)
{
    Console.WriteLine(mgs);
}

或匿名方法方式:

myDelegate = delegate (string message)//实例化委托(带函数引用)
{
    Console.WriteLine(message);
};

或lambda表达式方式:

myDelegate = (message) => { Console.WriteLine(message); };

4、调用委托

myDelegate("Hello World");//同步调用

三、高级用法

1、多播委托

public delegate void HandlerDelegate(string message);

void Main()
{
    HandlerDelegate myDelegate;//声明委托变量
    myDelegate = (message) => { Console.WriteLine("a " + message); };
    myDelegate += (message) => { Console.WriteLine("b " + message); };
    myDelegate += (message) => { Console.WriteLine("c " + message); };
    myDelegate("Hello World");//多个方法依次调用
    Console.WriteLine(myDelegate.GetInvocationList().GetLength(0));//3
}

2、作为方法的参数传递委托实例

public delegate void HandlerDelegate(string message);

//客户端
void Main()
{
    HandlerDelegate myDelegate;//声明委托变量
    myDelegate = (message) =>
    {
        Console.WriteLine("计算结果为:" + message);
    };

    MyClass myClass = new MyClass();
    myClass.MethodWithCallback(2, myDelegate);
}

//作为服务端,计算完成后,将结果返回给客户端
public class MyClass
{
    public void MethodWithCallback(int a, HandlerDelegate callback)
    {
        a = a + 1;
        callback("result:" + a.ToString());//执行委托
    }
}

四、同步、异步调用

1、委托的同步调用

委托的Invoke方法用来同步调用,它将阻塞当前线程,然后执行调用线程,调用完毕后再继续主线程向下执行。

public delegate int AddHandler(int a, int b);

void Main()
{
    AddHandler handler = (a, b) =>
    {
        return (a + b);
    };
    //int result = handler(2, 3);
    int result = handler.Invoke(2, 3);//此句调用的方法执行完毕后才执行往下的语句。
    Console.Write(result);//5
}

2、委托的异步调用

把调用放入线程池中,程序主体线程或UI线程可同时执行。

public delegate int AddHandler(int a, int b);

void Main()
{
    AddHandler handler = (a, b) =>
    {
        return (a + b);
    };

    IAsyncResult ar = handler.BeginInvoke(2, 3, null, null);

    //while (!ar.IsCompleted)
    //{
    //     Console.WriteLine("Do Sth.");//在委托的工作未完成之前,主线程可做其他事情。
    //}
    //或
    while (!ar.AsyncWaitHandle.WaitOne(0, false))
    {
        Console.WriteLine("Do Sth.");
    }

    int result = handler.EndInvoke(ar);
    Console.Write(result);//5
}

3、委托的异步回调

public delegate int AddHandler(int a, int b);

void Main()
{
    AddHandler handler = (a, b) =>
    {
        return (a + b);
    };

    IAsyncResult ar = handler.BeginInvoke(2, 3, new AsyncCallback(AddComplete), null);
    Console.WriteLine("Do Sth.");//异步调用完成时调用此方法。

}
public void AddComplete(IAsyncResult ar)
{
    AddHandler handler = ((AsyncResult)ar).AsyncDelegate as AddHandler;
    Console.WriteLine(handler.EndInvoke(ar));
}

到此这篇关于C#委托的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • C#中的委托delegate用法的示例详解

    C#中的委托 委托和事件在 .NET Framework 中的应用非常广泛,然而,较好地理解委托和事件对很多接触 C# 时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去的人每次见到委托和事件就觉得心里堵得慌,浑身不自在.本章中,我将由浅入深地讲述什么是委托.为什么要使用委托.事件的由来..NET Framework 中的委托和事件.委托中方法异常和超时的处理.委托与异步编程.委托和事件对Observer 设计模式的意义,对它们的编译代码也做了讨论. 1.

  • C#中委托(Delegates)的使用方法详解

    1. 委托是什么? 其实,我一直思考如何讲解委托,才能把委托说得更透彻.说实话,每个人都委托都有不同的见解,因为看问题的角度不同.个人认为,可以从以下2点来理解: (1) 从数据结构来讲,委托是和类一样是一种用户自定义类型. (2) 从设计模式来讲,委托(类)提供了方法(对象)的抽象. 既然委托是一种类型,那么它存储的是什么数据? 我们知道,委托是方法的抽象,它存储的就是一系列具有相同签名和返回回类型的方法的地址.调用委托的时候,委托包含的所有方法将被执行. 2. 委托类型的定义 委托是类型,就

  • C#使用委托(delegate)实现在两个form之间传递数据的方法

    本文实例讲述了C#使用委托(delegate)实现在两个form之间传递数据的方法.分享给大家供大家参考.具体分析如下: 关于Delegate[代理.委托]是C#中一个非常重要的概念,向前可以推演到C++的指针,向后可以延续到匿名方法.lambda表达式. 现在我就从一个最简单最实用的一个小例子出发分析一下Delegate的使用. 现在有两个窗体Form1和Form2. 两个按钮Button1(Form)和Button2(Form2). Form1的代码: private void button

  • C# 委托(delegate) 的小例子

    代码如下: 复制代码 代码如下: static void Main(string[] args)        {           Console.WriteLine(Exec(GetSet));           Console.ReadKey();        }        //定义委托,用于将方法做为参数传给Exec.        public delegate string GetResultDelegate();        public static string G

  • C#委托delegate实例解析

    所谓c#的委托就是说把函数当参数来传递. 这个在js完全就用不着搞什么委托东西,直接转就是了.而对于C#来说则不是这样! 一个函数,如果它的参数是函数,那么是这样子写的 : public void method(Action<string, Int32> voidMethod, Func<string, Int32> returnMethod) Action<string, Int32> voidMethod 意思是说这个将被传进来的函数是一个没有return的函数,就

  • C#事件处理和委托event delegate实例简述

    本文实例讲述了C#事件处理和委托event delegate,分享给大家供大家参考.具体方法如下: 以下仅仅是用最简单的方式表示事件,实际应用可能是不同窗体之间相互通知某些操作,达到触发. 首先声明一个degate的 EventHandler 参数可以没有 一个或多个 但是触发和使用一定要匹配. 创建一个该EvenHandler的实例a 在程序建立或你需要的时候产生一个事件触发申明: a += new EventHandler(d); public delegate void EventHand

  • 浅析C# 委托(Delegate)

    C# 中的委托(Delegate)类似于 C 或 C++ 中函数的指针.委托(Delegate) 是存有对某个方法的引用的一种引用类型变量.引用可在运行时被改变. 委托(Delegate)特别用于实现事件和回调方法.所有的委托(Delegate)都派生自 System.Delegate 类. 声明委托(Delegate) 委托声明决定了可由该委托引用的方法.委托可指向一个与其具有相同标签的方法. 例如,假设有一个委托: public delegate int MyDelegate (string

  • C#中的delegate委托类型基本学习教程

    委托 delegate 是表示对具有特定参数列表和返回类型的方法的引用的类型.在实例化委托时,你可以将其实例与任何具有兼容签名和返回类型的方法相关联.你可以通过委托实例调用方法. 委托用于将方法作为参数传递给其他方法.事件处理程序就是通过委托调用的方法.你可以创建一个自定义方法,当发生特定事件时,某个类(如 Windows 控件)就可以调用你的方法.下面的示例演示了一个委托声明: public delegate int PerformCalculation(int x, int y); 可将任何

  • C#中的委托Delegate

    一.概述 委托为引用类型 二.使用 1.声明委托类型,定义委托 public delegate void HandlerDelegate(string message); 2.声明委托变量 HandlerDelegate myDelegate;//声明委托变量 3.实例化委托,带函数引用 传统方式 //myDelegate = new HandlerDelegate(Method1);//可以为静态方法或者实例方法. //或者直接myDelegate = Method1; 方法定义: publi

  • 解析.Net 4.0 中委托delegate的使用详解

    .Net中的委托从功能上讲和c语言或者c++中的方法指针类似,可以像调用方法一样调用委托完成某个功能,或返回某类结果.但是.Net毕竟是更高级的语言,委托Delegate也更高级了,委托是一种数据接口,它包含调用目标和调用方法的指针:而在.Net中定义的委托都继承自MulticastDelegate即多播委托,所谓的多播委托是指可以包含多个调用方法的委托.一. 先来看下委托的定义:如下C#代码定义委托public delegate void DoSomething(int times);委托的定

  • C#中的委托和事件学习(续)

    引言 如果你看过了 C#中的委托和事件 一文,我想你对委托和事件已经有了一个基本的认识.但那些远不是委托和事件的全部内容,还有很多的地方没有涉及.本文将讨论委托和事件一些更为细节的问题,包括一些大家常问到的问题,以及事件访问器.异常处理.超时处理和异步方法调用等内容. 为什么要使用事件而不是委托变量? 在 C#中的委托和事件 中,我提出了两个为什么在类型中使用事件向外部提供方法注册,而不是直接使用委托变量的原因.主要是从封装性和易用性上去考虑,但是还漏掉了一点,事件应该由事件发布者触发,而不应该

  • 深入理解C#中的Delegate

    在c#中,event与delegate是两个非常重要的概念.因为在Windows应用程序中,对事件的使用非常频繁,而事件的实现依赖于delegate. 下面是对网上一些比较好的关于delegage的资料的整理,以及自己的一些想法. Delegate是什么? Delegate中文翻译为"委托".Msdn中对Delegate的解释如下: C#中的委托类似于C或C++中的函数指针.使用委托使程序员可以将方法引用封装在委托对象内.然后可以将该委托对象传递给可调用所引用方法的代码,而不必在编译时

  • .Net常见问题之C#中的委托

    有朋友说委托和C++中的函数指针很像,但是两者真的有差别.在C++中,函数指针不是类型安全的,它所指向的是内存中的某一个位置,但是我们没有办法判断这个指针实际指向的是什么,对于参数和返回类型更难以判断了.但是.NET中的委托则完全不同,它是类型比较安全的类,我们很明白的知道委托定义的返回类型和参数类型.它不仅包含了方法的引用,而且包含了方法的引用.下面通过一段代码给大家分享下对委托的理解: 什么是委托 在实际的开发过程中,有时某个方法执行的操作并不是针对数据进行的,而是针对另一个方法,但是这个方

  • 浅谈C# 中的委托和事件

    引言 委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去的人每次见到委托和事件就觉得心里别(biè)得慌,混身不自在.本文中,我将通过两个范例由浅入深地讲述什么是委托.为什么要使用委托.事件的由来..Net Framework中的委托和事件.委托和事件对Observer设计模式的意义,对它们的中间代码也做了讨论. 将方法作为方法的参数 我们先不管这个标题

  • C#中的委托数据类型简介

    什么是委托? 委托是一个类型安全的对象,它指向程序中另一个以后会被调用的方法(或多个方法).通俗的说,委托是一个可以引用方法的对象,当创建一个委托,也就创建一个引用方法的对象,进而就可以调用那个方法,即委托可以调用它所指的方法. 来看下面的例子,类deleMthod定义了3个方法,add.minus和multi,他们都具有相同的输入参数列表(int x,int y)和输出参数类型int,那么我们就说这三个方法具有相同的方法签名.开发者可以抽象地用 int 某名称(int x,int y) 的一种

  • C#中的委托使用

    从今天开始写关于C#的系列文章,本篇文章主要讲解C#中的委托使用. 委托其实就是一种数据类型,和int,string是一样的概念. 如果要把一个字符串赋值给一个变量,用string声明一个变量即可.如果要把一个方法赋值给一个变量,那么用什么关键字呢?当然就是用委托了,所以用委托声明的变量就可以接受一个方法了,之后那个变量就可以像方法一样执行. 下面开始详细介绍: 先看一段代码: static void Main(string[] args) { int i; //可以接受一个整数的变量 stri

随机推荐