C#中委托用法实例分析

本文实例讲述了C#中委托用法。分享给大家供大家参考。具体分析如下:

Delegate委托,在.NET中应用的非常广泛。会涉及到Lambda表达式,事件,匿名方法等。

那么何为委托?

通俗的来讲,委托除了必须指定delegate关键字和没有方法实体之外,和指定方法没有更多区别。你可以当它是一个占位符,比如你在写代码的时候并不知道你将要处理的是什么。你只需要知道你将要引入的参数类型和输出类型是什么并定义它即可。这就是书本上所传达的方法签名必须相同的意思。

下面我们来定义一个基本的委托:

public class Test
{
 //定义委托
 public delegate void D_Math(int a, int b);
 public void Add(int a, int b)
 {
  Console.WriteLine("Add方法结果:{0}", a + b);
 }
 public void Cut(int a, int b)
 {
  Console.WriteLine("Cut方法结果:{0}", a - b);
 }
}
[TestClass]
public class UnitTest1
{
 [TestMethod]
 public void TestMethod1()
 {
  Test t = new Test();
  Test.D_Math D = new Test.D_Math(t.Add);
  //委托实例化,也可Test.D_Math D =t.Add;
  D += t.Cut;
  //委托可以以队列方式执行多个方法,
  //以+=运算符或者-=来增加或者取消队列中的方法
  D(5, 6);
 }
}

以上看出来委托实用的地方了吗?即委托可以执行任何引入参数类型相同且返回类型相同的方法,甚至可以执行签名相同的方法队列。

那么我们的方法签名(即引入参数和输出参数)真的必须与委托完全一致吗?答:不是的,我们不能忽略协变与逆变。

我们这里简单介绍一下协变与逆变的知识。

“协变”是指能够使用与原始指定的派生类型相比,派生程度更大的类型。
“逆变”则是指能够使用派生程度更小的类型。
那么,我们的委托也是接受协变与逆变的。
意思是,如果定义一个delegate,那么不仅仅签名完全相同的方法可以赋值给delegate变量。
如果一个方法的参数表符合delegate声明,但返回的类型是(delegate声明返回类型)的派生类,那也可以将这个方法赋值给这个delegate变量。
如果一个方法的返回类型符合delegate的声明,但参数是(delegate声明参数类型)的祖先类,那也可以将这个方法赋值给这个delegate变量。
如果一个方法的参数和返回类型都符合上面两行的假设,那也可以将这个方法赋值给这个delegate变量。

以下以两个简单示例解释协变与逆变:

协变:

public class A { }
public class B:A { }//B继承自A
public class Test
{
  //定义委托
  public delegate A D_Math();
  public B Add()
  {
   return new B(); 

  }
  public A Add2()
  {
   return new A();
  }
}
[TestClass]
public class UnitTest1
{
  [TestMethod]
  public void TestMethod1()
  {
   Test.D_Math d = new Test.D_Math(new Test().Add);
   //委托返回A,而Add方法返回B,此为协变。
  }
}

逆变:

public class A { }
public class B:A { }//B继承自A
public class Test
{
  //定义委托
  public delegate void D_Math(B b);
  public void Add(B b)
  { 

  }
  public void Add2(A a)
  { 

  }
}
[TestClass]
public class UnitTest1
{
  [TestMethod]
  public void TestMethod1()
  {
   Test.D_Math d = new Test.D_Math(new Test().Add2);
   //委托引入参数B,而Add方法参数为A类型,此为协逆变。
  }
}

希望本文所述对大家的C#程序设计有所帮助。

时间: 2015-05-04

C#基于委托实现多线程之间操作的方法

本文实例讲述了C#基于委托实现多线程之间操作的方法.分享给大家供大家参考,具体如下: 有的时候我们要起多个线程,更多的时候可能会有某个线程会去操作其他线程里的属性. 但是线程是并发的,一般的调用是无法实现我们的要求的. 于是,我们在这里就可以用委托,代码如下 private delegate void DelegateInfo(); private delegate void DelegateIsEnd(); //这个是线程调用其他线程的方法 private void Dowork() { //

C#委托现实示例分析

本文实例讲述了C#委托现实的用法.分享给大家供大家参考.具体分析如下: using System; using System.Collections.Generic; using System.Text; namespace Delegate { // 热水器 public class Heater { private int temperature; public delegate void BoilHandler(int param); //声明委托 public event BoilHan

C#中委托用法实例详解

本文实例讲述了C#中委托用法.分享给大家供大家参考.具体分析如下: 这里演示了如何使用匿名委托来计算员工的薪水奖金.使用匿名委托简化了程序,因为无需再定义一个单独的方法. (-:The data for each employee is stored in an object containing personal details as well as a delegate that references the algorithm required to calculate the bonus

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

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

C#中委托的进一步理解

前面一篇文章介绍了委托的基本知识,接下来就进一步研究一下委托. 委托类型 其实,刚开始觉得委托类型是一个比较难理解的概念,怎么也不觉得下面的"AssembleIphoneHandler"是一个类型. 复制代码 代码如下: public delegate void AssembleIphoneHandler(); 按照正常的情况,如果我们要创建一个委托类型应该是: 复制代码 代码如下: public class AssembleIphoneHandler : System.Multica

C#使用委托实现的快速排序算法实例

本文实例讲述了C#使用委托实现的快速排序算法.分享给大家供大家参考.具体如下: class QuickSort { private delegate int CmpOp(object Left, object Right); private void swap(object[] Array, int Left, int Right, CmpOp Cmp) { object tempObj = Array[Left]; Array[Left] = Array[Right]; Array[Right

C#中使用委托的3种方式代码示例

using System; namespace DelegateDemo { class Program { private delegate int Cacu(string str); static void Main(string[] args) { //1 Cacu cacu = new Cacu(CacuInstance); Console.WriteLine(cacu("Hello,Wrold")); //2 Cacu cacu1 = new Cacu(delegate(st

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

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

C#中委托用法

本文实例讲述了C#中委托用法.分享给大家供大家参考.具体分析如下: 对于用户要查找的条件的千变万化,我们在写条件去查找时,是不可能一下写死的,那样,如果你写好了一个类让别人用,别人需要的不是那种查询,得去找你改条件. 那么我们能否让使用这个类的人自己定义一个规则(条件),直接传条件给你,你帮我查询出结果来,C#就可以用委托来解决,相应的java可以用接口来实现 using System; using System.Collections.Generic; using System.Text; u

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

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

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

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

浅谈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

一篇文章彻底搞清楚c#中的委托与事件

一.什么是委托呢? 听着名字挺抽象,确实不好理解.面试官最喜欢考察这个,而且更喜欢问:"委托和事件有何异同?".如果对一些知识点没有想明白,那么很容易被绕进去.研究任何事物,我们不妨从它的定义开始,委托也不例外.那么先来看c#中的委托定义,先来个例子: public delegate void GetPacage(string code); 这个委托,看起来就是个方法签名,取包裹,需要验证码.与方法签名不同的地方,在于多了一个delegate.c#中不乏一些便利好用的语法,比如fore

C#中的委托介绍

什么是委托? 之前写了事件的介绍:http://www.jb51.net/article/59461.htm 这里也把委托相关知识也总结一下. 委托是c#中类型安全的,可以订阅一个或多个具有相同签名方法的函数指针 声明委托的方式:delegate 返回值类型 委托类型名(参数) 比如: 复制代码 代码如下: delegate void StringProcess(string s); 注意:这里的除了前面的delegate,剩下部分和声明一个函数一样,但是StringProcess不是函数名,而

浅谈C#中的委托、事件与异步

从刚接触c#编程到现在,差不多快有一年的时间了.在学习过程中,有很多地方始终似是而非,直到最近才弄明白. 本文将先介绍用法,后评断功能. 一.委托 基本用法: 1.声明一个委托类型.委托就像是'类'一样,声明了一种委托之后就可以创建多个具有此种特征的委托.(特征,指的是返回值.参数类型) public delegate void SomeKindOfDelegate(string result); 2.创建一个在1中创建的委托类型的委托. public SomeKindOfDelegate aD

详解C#中的委托

委托这个东西不是很好理解,可是工作中又经常用到,你随处可以看到它的身影,真让人有一种又爱又恨的感觉,我相信许多人被它所困扰过. 一提到委托,如果你学过C语言,你一定会马上联想到函数指针. 什么是委托?委托是C#中类型安全的,可以订阅一个或多个具有相同签名方法的函数指针.委托可以把函数做为参数传递,其实际意义便是让别人代理你的事情.委托可以看做是函数的指针,整数可以用整数变量指向它,对象可以用对象变量指向它, 函数也可以用委托变量指向它.我们可以选择将委托类型看做只定义了一个方法的接口,而委托的实

C#中的委托、事件学习笔记

1.委托delegate 委托delegate也是一种类型,在任何可以声明类的地方都可以声明委托,它将方法当做另一个方法的参数进行传递,这样就可以传递不同的方法,完成不同的功能,使程序具有很好的可扩展性. 举例: 假设这里有一台电脑,有人会用它写程序,有人会用它打游戏,有人会用它看电影,有人会用它边听音乐边玩游戏,有人会用它边听音乐边看文档,边上QQ. 这台电脑可以抽象成一个类Computer,里面有个方法DoWork,所有的人都要通过这个方法来做自己的事情. 不用委托的时候我们可以实现一些固定