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

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

什么是委托

  在实际的开发过程中,有时某个方法执行的操作并不是针对数据进行的,而是针对另一个方法,但是这个方法在编译时又无法得知,只能在运行时才知道。如果是针对数据做操作,只需将数据作为方法的参数传入即可,那么针对方法做操作,很明显将方法作为参数传入即可,听起来的确很奇怪,但是需要先接受这个现实,然后从使用中去体会它的含义。下面举一个例子(请原谅我的英语 ,my english is poor!),这样一个场景:媒婆给菇凉或者小伙介绍对象,如果是对象是男的,菇凉就说出她的联系方式,如果是女的,小伙就说出他的联系方式(PS:我们这里都是正常的性取向)。

看一下代码图

在命名空间里,定义一个委托,和类是平级的

代码如下:

public delegate string GetTelphone();

  //用来得到联系方式的。

概述中提到,委托可以定义返回类型和参数类型,那么这个委托的返回类型就是string,无参的。

继续。。。。

媒婆类:

/// <summary>
/// 媒婆
/// </summary>
class MeiPo
{
  public string Sex { get; set; }
  public void GetTel(GetTelphone getTelphone)
  {
    Console.WriteLine(getTelphone.Invoke());
  }
}

可以看到,GetTel方法的参数是一个委托类型的,和一般的基本类型和常见引用类型引用方式一样使用。然后再方法体执行委托方法,输出结果。

菇凉类:

/// <summary>
/// 菇凉
/// </summary>
class Girl
{
  public string GetGirlTel()
  {
    return "得到菇凉的电话";
  }
}

小伙类:

 /// <summary>
  /// 男屌丝
  /// </summary>
  class DiaoSi
  {
    public string GetBoyTel()
    {
      return "得到男屌丝的电话";
    }
  }

最后上测试类

static void Main(string[] args)
    {
      var redMun = new MeiPo {Sex = "男"};
      var del= new GetTelphone(new Girl().GetGirlTel);
      if(redMun.Sex=="女")
        del = new GetTelphone(new DiaoSi().GetBoyTel);
      redMun.GetTel(del);

      Console.ReadKey();
    }

执行步骤:

1、创建媒婆对象,媒婆介绍一个sex="男",

2、创建委托对象,委托是一个类,所以用new来实例化。委托即指方法的引用,所在初始化时传入指向的方法引用new Girl().GetGrilTel

3、如果媒婆介绍的是sex="女",那么委托指向另一个方法

4、媒婆对象调用GetTel得到联系方式

以上内容就是对委托介绍的全部内容,希望大家喜欢。

(0)

相关推荐

  • C#中委托用法实例分析

    本文实例讲述了C#中委托用法.分享给大家供大家参考.具体分析如下: Delegate委托,在.NET中应用的非常广泛.会涉及到Lambda表达式,事件,匿名方法等. 那么何为委托? 通俗的来讲,委托除了必须指定delegate关键字和没有方法实体之外,和指定方法没有更多区别.你可以当它是一个占位符,比如你在写代码的时候并不知道你将要处理的是什么.你只需要知道你将要引入的参数类型和输出类型是什么并定义它即可.这就是书本上所传达的方法签名必须相同的意思. 下面我们来定义一个基本的委托: public

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

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

  • 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#中使用委托的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#中委托的进一步理解

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

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

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

  • 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#中委托用法

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

随机推荐