本文将对c#1的委托进行详细探索

委托(delegate)   注 delegate:vt.委派代表; 授权给; [法律]债务转移; 

委托作用:在恰当的时间执行一系列操作

1.简单委托的构成

  • 声明委托类型
  • 必须有一个方法包含了要执行的代码
  • 必须创建一个委托实例
  • 必须调用委托实例

依次讨论各个步骤:

①声明委托类型

委托类型实际上只是参数类型的一个列表以及一个返回类型。它规定了类型的实例能表示的操作。

例子:delegate void StringProcessor(string input)

例子表明:要创建StringProcssor的一个实例需要一个返回值为void,有一个参数的函数。StringProcessor是一个类型。它有方法,可以创建他的实例。

②为委托实例的操作找到一个恰当的方法

void printString(string x)

③创建委托实例

StringProcessor proc1,proc2;

proc1=new StringProcessor(StaticMethods.PrintString);//静态方法

InstantMethods instance=new InstantMethods();//实例方法

proc2=new StringProcessor(instance.PrintString);

注:如果在同一个类中,直接将方法名作为参数

当委托实例被调用时,就会为这个对象调用方法。单纯创建一个委托实例却不在某一时刻调用它是没有什么意义的。

④调用委托实例

proc1.Invoke("hello");

⑤一个完整的例子

using System

delegate void StringProcessor(string input);//声明委托类型

class Person

{

string name;

public Person(string name){this.name=name}

public void say(string message) //声明兼容的实例方法

{

Console.WriteLine("{0} says:{1}",name,message);

}

}

class Background

{

public static void Note(string note)

{

Console.WriteLine("({0})",note);

}

}

class SimpleDelegateUse

{

static void Main()

{

Person jon=new Person("Jon");

Person tom =new Persono("tom");

StringProcessor jonsVoice,tomVoice,background;

jonsVoice=new StringProcessor(jon.Say);

tomVoice=new StringProcessor(tom.say);

baceground =new StringProcessor(Background.Note);

jonsVoice("Hello,son.");

tomsVoices.Invoke("Hello,Daddy!");

background("An airplane flies past");

}

}

合并和删除委托

委托实例实际有一个操作列表与之关联。这称为委托实例的调用列表。

System.Delegate类型的静态方法Combine和Remove负责创建新的委托实例。其中Combine负责将两个委托实例的调用列表连接到一起,而Remove负责从一个委托实例中删除另一个调用列表。很少在c#代码中看到对Delegate.Combine的显式调用,一般都是使用+和+=完成的

具体例子

using System;

// Define a custom delegate that has a string parameter and returns void.
delegate void CustomDel(string s);

class TestClass
{
    // Define two methods that have the same signature as CustomDel.
    static void Hello(string s)
    {
        System.Console.WriteLine("  Hello, {0}!", s);
    }

static void Goodbye(string s)
    {
        System.Console.WriteLine("  Goodbye, {0}!", s);
    }

static void Main()
    {
        // Declare instances of the custom delegate.
        CustomDel hiDel, byeDel, multiDel, multiMinusHiDel;

// In this example, you can omit the custom delegate if you
        // want to and use Action<string> instead.
        //Action<string> hiDel, byeDel, multiDel, multiMinusHiDel;

// Create the delegate object hiDel that references the
        // method Hello.
        hiDel = Hello;

// Create the delegate object byeDel that references the
        // method Goodbye.
        byeDel = Goodbye;

// The two delegates, hiDel and byeDel, are combined to
        // form multiDel.
        multiDel = hiDel + byeDel;

// Remove hiDel from the multicast delegate, leaving byeDel,
        // which calls only the method Goodbye.
        multiMinusHiDel = multiDel - hiDel;

Console.WriteLine("Invoking delegate hiDel:");
        hiDel("A");
        Console.WriteLine("Invoking delegate byeDel:");
        byeDel("B");
        Console.WriteLine("Invoking delegate multiDel:");
        multiDel("C");
        Console.WriteLine("Invoking delegate multiMinusHiDel:");
        multiMinusHiDel("D");
    }
}

整理自:《深入理解c#》第二版(c# in Depth)

c#1所搭建的核心基础之委托的更多相关文章

  1. C#复习笔记(2)--C#1所搭建的核心基础

    通过对C#1所搭建的核心基础的深入了解,可以知道之后的C#版本在C#1的基础上做了很多扩展,而这些扩展都是基于C#搭建的核心基础而来的. 委托 一.编写委托的过程 委托经常和C语言的“函数指针”挂钩. ...

  2. c#1所搭建的核心基础之值类型和引用类型

    这个主题很重要,在.NET中做的一切其实都是在和一个值类型或者引用类型打交道. 现实世界中的值和引用 假定你在读一份非常棒的东西,希望一个朋友也去读他.于是你到复印室里复印了一份.这个时候他获得了属于 ...

  3. c#1所搭建的核心基础之类型系统的特征

    类型系统的特征简介 几乎每种编程语言都有某种形式的一个类型系统.类型系统大致被分为:强/弱,安全/不安全,静态/动态,显式/隐式等类型. c#在类型系统世界中的位置 c#1的类型系统是静态的.显式的和 ...

  4. C#1所搭建的核心基础

    一,委托 委托封装了包含特殊返回类型和一组参数的行为,类似包含单一方法接口. 委托类型声明中所描述的类型签名决定了哪个方法可以用于创建委托实例,同时决定了调用的签名:委托类型实际上只是参数类型的一个列 ...

  5. Androd核心基础01

    Androd核心基础01包含的主要内容如下 Android版本简介 Android体系结构 JVM和DVM的区别 常见adb命令操作 Android工程目录结构 点击事件的四种形式 电话拨号器Demo ...

  6. css核心基础总结篇

    今日这篇是整合前面的css补充知识的. 我觉得前面的关于css的知识补充进去有点乱,今日整理整理一下. 层叠样式表 层叠是什么意思?为什么这个词如此重要,以至于要出现在它的名称里. 层叠可以简单地理解 ...

  7. Android应用的核心基础

    Android4开发入门经典 之 第二部分:Android应用的核心基础 Android应用中的组件 Application Components Android应用中最主要的组件是: 1:Activ ...

  8. C#核心基础--类(2)

    C#核心基础--类的声明 类是使用关键字 class 声明的,如下面的示例所示: 访问修饰符 class 类名 { //类成员: // Methods, properties, fields, eve ...

  9. (1) css的核心基础

     css的核心基础 1.css的基本语法在具体使用css之前,请各位兄弟姐妹先思考一个生活中的问题,一般情况下我们是如何描述一个人的呢? 小明{ 民族:汉族: 性格:温柔: 性别:男: 体重:68kg ...

随机推荐

  1. ZOJ 1450 Minimal Circle 最小圆覆盖

    套了个模板直接上,貌似没有随机化序列 QAQ //#pragma comment(linker, "/STACK:16777216") //for c++ Compiler #in ...

  2. 带OpenSSL和MySQL的静态编译版本~

    http://www.npcglib.org/~stathis/blog/precompiled-qt4-qt5/ http://www.npcglib.org/~stathis/blog/preco ...

  3. 基于visual Studio2013解决C语言竞赛题之0506选择排序

     题目

  4. (未解决)在JSTL中,session 和 sessionScope 有什么区别 ??

    在JSP页面中,使用JSTL标签获取Session中的值并显示 为何当使用 ${session.user} 时,页面跳转后,第一次能够成功显示, 但是单击按钮重定向的时候,就获取不到了? 而使用 ${ ...

  5. 项目总结SpringMVC+hibernate框架 web.xml 分析(2)

    紧接 项目总结SpringMVC+hibernate框架 原理(MVC) applicationContext.xml 文件(3) 这一步讲解项目模块化的配置,项目中每个模块配置一个文件,命名规则为 ...

  6. 数论F - Strange Way to Express Integers(不互素的的中国剩余定理)

    F - Strange Way to Express Integers Time Limit:1000MS     Memory Limit:131072KB     64bit IO Format: ...

  7. (Relax njuptoj)1009 数的计算(DP)

    其实DP 的关键在于找到子问题的结构.  我们规定arr[i][j]为在j左边填写i时的数的个数,很明显:  arr[i][j]=a[0][i]+a[1][i]+...+arr[i/2][i](i&l ...

  8. 【Java Web】使用URLRewrite实现网站伪静态

    大部分搜索引擎都会优先考虑收录静态的HTML页面,而不是动态的*.jsp.*.php页面.但实际上绝大部分网站都是动态的,不可能全部是静态的HTML页面,因此互联网上大部分网站都会考虑伪静态——就是将 ...

  9. django-template-loader

    当在settings.py中设置了如下 TEMPLATE_LOADERS=( 'django.template.loaders.filesystem.Loader', 'django.template ...

  10. 黑龙江省第七届大学生程序设计竞赛-Mysterious Organization

    描述 GFW had intercepted billions of illegal links successfully. It has much more effect. Today, GFW i ...