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#程序设计有所帮助。

(0)

相关推荐

  • C#中委托用法

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

  • 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委托类型基本学习教程

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

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

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

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

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

  • 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#基于委托实现多线程之间操作的方法

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

  • C#中委托的进一步理解

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

  • 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

随机推荐