本文将对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. Python-zip压缩-解压

    #打包成zip文件 import zipfile f = zipfile.ZipFile('archive.zip','w',zipfile.ZIP_DEFLATED) f.write('file_t ...

  2. Week11(11月19日):补课

    Part I:提问 =========================== 1.如何增加一条记录到数据库? Part II:案例学习 =========================== Music ...

  3. x64栈结构

    A function's prolog is responsible for allocating stack space for local variables, saved registers, ...

  4. Python函数式编程:Lambda表达式

    首先我们要明白在编程语言中,表达式和语句的区别. 表达式是一个由变量.常量.有返回值的函数加运算符组成的一个式子,该式子是有返回值的 ,如  a + 1 就是个表达式, 单独的一个常量.变量 或函数调 ...

  5. zzuli Camellia的难题(暴力)

    1784: Camellia的难题 Time Limit: 2 Sec  Memory Limit: 128 MB Submit: 67  Solved: 14SubmitStatusWeb Boar ...

  6. 删除: warning C4996: &#39;sprintf&#39;: This function or variable may be unsafe. Consider 方法

    可以使用的最简单的方法: 选项Project   |   Configuration   Properties   |   C/C++   |   Preprocessor   |   Preproc ...

  7. QTP的基本功能介绍

    • QTP的基本功能介绍 HP QuickTest Professional 支持功能測试和回归測试自己主动化,用于每一个主要软件应用程序和环境.此解决方式使用keyword驱动的測试概念,简化了測试 ...

  8. 在android解析json

    1.采用一般方式解释json为对象 package com.heimazyh.testjson; import org.json.JSONException; import org.json.JSON ...

  9. 富文本编辑器 - wangEditor 插入代码

    效果: 项目结构: 注意事项: highlightJS 代码高亮插件,wangEditor 本身就是集成的highlightJS代码高亮插件. 在wangEditor-1.3.12.js里找到var ...

  10. Robot Framework与Web界面自动化测试学习笔记:利用xpath定位元素

    在rf中,利用selinum2的关键字进行用例编写时,很多关键字的参数是html元素的定位标识. 最简单的方式,是通过id 或name来描述元素定位信息,如 click  button    id=l ...