一、委托

当我们需要把方法做为参数传递给其他方法的时候,就需要使用委托。

因为有时候,我们要操作的对象,不是针对数据进行的,而是针对某个方法进行的操作。

我们还是来以代码入手

Code
using System;
namespace gosoa.com.cn
{
    public class test
    {
        public delegate string GetAString();
        public static void Main()
        {
            int x=10;
            GetAString firstString=new GetAString(x.ToString);
            Console.WriteLine(firstString());
            //上句和下面这句类似。
            //Console.WriteLine(x.ToString()); 
        }
    }
}

在上例中,public delegate string GetAString(); 就是声明了一个委托(delegate),其语法和方法的定义类似,只是没有方法体,前面要加上关键字 delegate 。定义一个委托,基本上是定义一个新类,所以,可以在任何定义类的地方,定义委托。

注意,在C#中,委托总是自带一个有参数的构造函数,这就是为什么在上例中,GetAString firstString=new GetAString(x.ToString); 通过这句初始化一个新的delegate的时候,给传递了一个x.ToString 方法。但,在定义delegate的时候,却没有定义参数。

在看另一个例子之前,我们先来了解下匿名方法。

匿名方法的使用,我们看个例子

Code
using System;
namespace gosoa.com.cn
{
    public class test
    {
        delegate string GetUrl(string val);
        static void Main(string [] args)
        {
            string domin="www.gosoa.com.cn";
            GetUrl url=delegate(string  param)
            {
                 param="http://"+param;
                 return param;
            };
            Console.WriteLine(url(domin)); 
        }
    }
}

在本例中,GetUrl url=delegate(string  param) 在这里实例化一个delegate的时候,采用了匿名的方法。本例输出的结果是 http://www.gosoa.com.cn

接下来我们再看一个委托的例子。

Code
using System;
namespace gosoa.com.cn
{
    class NumberOpthion
    {
        public static double numOne(double x)
        {
            return x*2;
        }
        public static double numTwo(double x)
        {
            return x*x;
        }
    }

public class delegateTest
    {
        
        delegate double DoubleOpration(double x);
        static void printNumber(DoubleOpration dp,double x)
        {
            double result=dp(x);
            Console.WriteLine(
                "value is {0}, result of DoubleOpration is {1}:",x,result    
            );
        }

static void Main()
        {
             DoubleOpration doption =new DoubleOpration(NumberOpthion.numOne);    
             printNumber(doption,1.5);
             doption =new DoubleOpration(NumberOpthion. numTwo);    
             printNumber(doption,3.2);

}
    }
}

首先我们定义了一个NumberOpthion类。用来对数字进行*2和2次方运算。接着,我们定义了一个委托delegate double DoubleOpration(double x)。下面,我们定义了printNumber(DoubleOpration dp,double x) 这样一个方法,其中一个参数就是委托。最后我们DoubleOpration doption =new DoubleOpration(NumberOpthion.numOne);实例化了一个委托,并调用了 printNumber 方法。最后的输出结果是

Value is 0.5  result of DoubleOpration is 3;

Value is 3.2  result of DoubleOpration is 10.24;

在上例中,我们如果采用匿名方法,代码就会如下:

Code
using System;
namespace gosoa.com.cn
{
    public class delegateTest
    {
        delegate double DoubleOpration(double x);
        static void printNumber(DoubleOpration dp,double x)
        {
            double result=dp(x);
            Console.WriteLine(
                "value is {0}, result of DoubleOpration is {1}:",x,result    
            );
        }
        static void Main()
        {
             DoubleOpration doptionOne =delegate(double x){return x*2;};
             DoubleOpration doptionTwo =delegate(double x){return x*x;};
             printNumber(doptionOne,1.5);
             printNumber(doptionTwo,3.2);
        }
    }
}

委托,还有一种情况,是多播委托。这个在以后我们应用到的时候,会学习到。

转载于:https://www.cnblogs.com/Alexander_2009/archive/2009/10/24/1588940.html

C# delegate相关推荐

  1. 理解委托(delegate)及为什么要使用委托

    委托:是一种定义方法签名的类型. 当实例化委托时,您可以将其实例与任何具有兼容签名的方法相关联. 您可以通过委托实例调用方法. 上述为官方说法,理解起来比较难,举个生活中的例子: 某人有三子,让他们各 ...

  2. swift中delegate与block的反向传值

    swift.jpg 入门级 此处只简单举例并不深究,深究我也深究不来.对于初学者来说delegate或block都不是一下子能理解的,所以我的建议和体会就是,理不理解咱先不说,我先把这个格式记住,对就 ...

  3. 在请求完成后回调delegate的方法。然而回调时经常遇到这种情况:delegate已经被释放...

    最近的项目遇到了网络请求,需要在请求完成后回调delegate的方法.然而回调时经常遇到这种情况:delegate已经被释放,这时调用其方法则会引起crash. objc的runtime中有两种判断类 ...

  4. 异步使用委托delegate --- BeginInvoke和EndInvoke方法

    当我们定义一个委托的时候,一般语言运行时会自动帮委托定义BeginInvoke 和 EndInvoke两个方法,这两个方法的作用是可以异步调用委托. 方法BeginInvoke有两个参数: Async ...

  5. 对delegate进行扩展 打造通用的计时完成方法

    连接数据库是程序员经常要做的事情, 通常情况下, 需要连接SQL Server中哪个数据库是已知的, 用户在输入SQL Server的服务器IP.用户名.密码和数据库名字后, 如果所有信息输入正确, ...

  6. Swift - 委托(delegate)的介绍,及使用样例

    1,委托的说明 委托(delegate)是Cocoa的一个术语,表示将一个对象的部分功能转交给另一个对象. 比如对象A希望对象B知道将要发生或已经发生某件事情,对象A可以把对象B的引用存为一个实例变量 ...

  7. C#中Action与delegate、EventHandler的差异

    Action是一个泛型的委托,其内部即使用delegate去实现,当普通的delegate定义的参数与Action个数.类型一致时,两者实现的功能是一样的.只是Action的方式更加简洁.规范.如下: ...

  8. 【转】iOS开发-Protocol协议及委托代理(Delegate)传值

    原文网址:http://www.cnblogs.com/GarveyCalvin/p/4210828.html 前言:因为Object-C是不支持多继承的,所以很多时候都是用Protocol(协议)来 ...

  9. c# 带返回值的action_C#知识点讲解之C#delegate、event、Action、EventHandler的使用和区别...

    今天来讲一讲<C#delegate.event.Action.EventHandler的使用和区别> 目录 所以,event应运而生 所以,EventHandler应运而生 所以,Acti ...

  10. iOS视图控制器之间delegate传值

    2019独角兽企业重金招聘Python工程师标准>>> // ** *为了从ViewControllerB往回传值到ViewControllerA,我们需要使用协议(Protocol ...

最新文章

  1. opencv中ArUco模块实践(1)
  2. yum-fastestmirror模块的使用 提升yum速度的!
  3. 通过 SHGetSpecialFolderLocation、SHGetPathFromIDList 函数获取常用路径
  4. SAP UI5 应用开发教程之二十七 - SAP UI5 应用的单元测试工具 QUnit 介绍
  5. 世界 Web 2.0 网站评奖揭晓
  6. mysql定时增量备份_Mysql日常自动备份和增量备份脚本
  7. linux下的node.js下载和安装
  8. 反距离权重加权插值的理解及Python实现
  9. ETCD v3 restful api 使用详解
  10. win10安装tomcat9
  11. Lucene 概念,定义应用场景
  12. 乐玩自动化测试模块_深圳大数据测试培训推荐班
  13. linux新建 txt文件,通过Linux终端快速创建文本文件的3种方法
  14. 久邦数码Android开发工程师(3GGO桌面)2014年3月份笔试-初面
  15. linux硬盘的两个分区合并_linux新加硬盘合并
  16. 堆米微信H5页面怎么制作?易企秀微信H5页面制作,微信简历制作,
  17. 数字金融企业绿色专利匹配数据(2011-2019)
  18. Cookie有什么用?
  19. 【田园原木风格装修案例】清新自然的原木风
  20. Role,Rolebinding与serviceAccount

热门文章

  1. 使用Myeclipse实现快速调试
  2. tcp/ip详解--分层
  3. 函数调用栈 剖析+图解
  4. tmpfs 内存文件系统
  5. 前端一HTML:十一:其他选择器
  6. SpringCloud微服务云架构构建B2B2C电子商务平台之-(八)消息总线(Spring Cloud Bus)...
  7. Linux知识点记录
  8. 如何面对你—LNMP高并发时502
  9. CentOS5.5支持ntfs文件系统
  10. 安卓 listView 组件的使用