C#基础:对委托的简单理解
在编程过程中,我们习惯把数据作为参数传递给方法(例:int a=int.Parse(“20”);)。是否能将一个方法传递给另一个方法呢?是不是听起来有点奇怪!!!
线程大家应该熟悉吧,在计算机中并行运行新的执行序列同时运行当前的任务,这个新的序列就是线程。在Thread()的一个实例上使用方法Start()就可以启动一个新的线程。如果要告诉计算机启动一个新的序列,就必须说明要在哪里启动一个新的序列。就必须为计算机提供开始启动的方法的细节,Thread构造函数必须带一个参数,该参数定义了线程需要调用的方法。
一、声明委托
当我们只用一个类时,首先我们需要定义一个类,然后实例化类的一个对象。委托也一样,也需要进行这两个步骤,首先需要定义要使用的委托,定义委托就是要告诉编译器此委托需要那种类型的方法,然后创建委托的一个或多个实例。下面我们定义一个委托
delegate void Method(int parm);
在上面定义的委托中,定义了一个Dmethod委托,该委托的每个实例都可以包含一个方法的使用,并该方法必须带有一个int类型的参数,并且返回void。委托的类型安全非常高,在定义委托时必须给出委托所表示的方法的签名(int parm)和返回类型等细节(void)。
如果我们要定义一个委托Medthod,该委托表示的方法有两个string参数,返回类型为bool,我们就可以编写如下代码
delegate bool Medthod(string x,string y);
委托可以在一个类的内部定义,也可以在一个类的外部定义,还可以在名称空间中把委托定义为一个顶层对象,故可以在在定义委托是定义访问修饰符:public private protected等,如下代码所示。
delegate string Method();
最后需要提出的一点就是:类有两个不同的术语,“类”表示较广义的定义,“对象“表示类的实例。委托只有一个术语,就是在创建委托的实例时,所创建的委托的实例也成为委托。所以需要从上下文中确定委托的确切函数。
二、使用委托
就直接上代码了

class Program
{
private delegate string Method(int x, int y);
static void Main(string[] args)
{
Program p = new Program();//因为plus方法不是静态方法,所以需要实例化一个实例的方法(lpus)来正确的初始化委托
Method doplus=new Method(p.plus);//只传递方法名称
//Method doplus = p.plus;//此实例委托和上面一句等价
Console.WriteLine("结果为:{0}", doplus(10, 20));
//Console.WriteLine("结果为:{0}",doplus.Invoke(10,20));//doplus(10, 20)和doplus.Invoke(10,20)等价
}
public string plus(int x, int y)
{
return (x + y).ToString();
}
}

这段代码中,实例化了一个类型doplus的委托,并进行了初始化,使它引用plus(int x,int y)的方法(注:委托在语法上总是接收一个参数的构造函数,这个参数就是委托引用的方法,这个方法必须匹配最初定义委托时的签名。另外注意,plus(int x, int y)不是静态方法,所以需要实例化一个Program来正确初始化委托)。委托的一个特征是它们是类型安全的,可以确保被调用的方法的签名是正确的,它们不关心在什么类型的对象上调用方法。甚至不考虑此方法是静态的还是实例方法(如上例所示方法plus和plus1)
三、简单的委托示例
在下面的示例中,我们定义一个Calculated类来实现数据类型为Double的值的加减乘除运算

using System;
namespace DelegateTest
{
class Program
{
public delegate double operation(double x, double y);
static void Main(string[] args)
{
operation Add = new operation(Calculate.addtion);
operation Sub = new operation(Calculate.subtraction);
Calculate cal = new Calculate();//引用非静态方法必须实例化对象
operation Mul = new operation(cal.multiplication);
operation Div = new operation(cal.division);
Console.WriteLine("加法操作(10+20)的结果为:{0}",Add(10,20));
Console.WriteLine("减法操作(50-25)的结果为:{0}",Sub(50,20));
Console.WriteLine("乘法操作(15*12)的结果为:{0}",Mul(15,20));
Console.WriteLine("除法操作(90/12)的结果为:{0}",Div(90,12));
}
}
public class Calculate
{
public static double addtion(double x, double y)
{
return x + y;
}
public static double subtraction(double x, double y)
{
return x - y;
}
public double multiplication(double x, double y)
{
return x * y;
}
public double division(double x, double y)
{
return x / y;
}
}
}

运行结果

C#基础:对委托的简单理解的更多相关文章
- C#基础系列——委托实现简单设计模式
前言:上一篇介绍了下多线程的相关知识:C#基础系列——多线程的常见用法详解,里面就提到了委托变量.这篇简单介绍下委托的使用.当然啦,园子里面很多介绍委托的文章都会说道:委托和事件的概念就像一道坎,过了 ...
- springmvc基础学习3---注解简单理解
1:@Controller 用来注解这个bean是MVC模型中的一个C 会被spring的auto-scan扫到纳入管理.Spring mvc框架中的action层注入,也就是控制层.控制器Contr ...
- C#基础系列——委托和设计模式(二)
前言:前篇 C#基础系列——委托实现简单设计模式 简单介绍了下委托的定义及简单用法.这篇打算从设计模式的角度去解析下委托的使用.我们知道使用委托可以实现对象行为(方法)的动态绑定,从而提高设计的灵活性 ...
- git的简单理解及基础操作命令
前端小白一枚,最近开始使用git,于是花了2天看了廖雪峰的git教程(偏实践,对于学习git的基础操作很有帮助哦),也在看<git版本控制管理>这本书(偏理论,内容完善,很不错),针对所学 ...
- [.net 面向对象编程基础] (21) 委托
[.net 面向对象编程基础] (20) 委托 上节在讲到LINQ的匿名方法中说到了委托,不过比较简单,没了解清楚没关系,这节中会详细说明委托. 1. 什么是委托? 学习委托,我想说,学会了就感觉简 ...
- C#基础篇——委托
前言 在本章中,主要是借机这个C#基础篇的系列整理过去的学习笔记.归纳总结并更加理解透彻. 在.Net开发中,我们经常会遇到并使用过委托,如果能灵活的掌握并加以使用会使你在编程中游刃有余,然后对于很多 ...
- Deep learning:四十二(Denoise Autoencoder简单理解)
前言: 当采用无监督的方法分层预训练深度网络的权值时,为了学习到较鲁棒的特征,可以在网络的可视层(即数据的输入层)引入随机噪声,这种方法称为Denoise Autoencoder(简称dAE),由Be ...
- 我们为之奋斗过的C#-----C#的一个简单理解
我们首先来简单叙述一下什么是.NET,以及C#的一个简单理解和他们俩的一个区别. 1 .NET概述 .NET是Microsoft.NET的简称,是基于Windows平台的一种技术.它包含了能在.NET ...
- IM开发基础知识补课:正确理解前置HTTP SSO单点登陆接口的原理
1.前言 一个安全的信息系统,合法身份检查是必须环节.尤其IM这种以“人”为中心的社交体系,身份认证更是必不可少. 一些PC时代小型IM系统中,身份认证可能直接做到长连接中(也就是整个IM系统都是以长 ...
随机推荐
- 调用Camera返回为空的分析及处理方法
前言 大家可能遇到了这种情况.调用Camera,然后指定自己定义的保存路径,结果返回的Intent为空.我们来分析一下原因. 分析 首先看Camera的部分逻辑,在源代码中的Camera.java的d ...
- 基于TCP的通信程序设计
套接字(Socket)是一种跨主机进程之间的双向通信接口,每个打开的套接字都可以通过一个套接字描述符来描述,因此可以使用低级文件编程库操作套接字. TCP是一中面向连接的网络传输控制协议.它每发送一个 ...
- Qt 5.5.0 Windows环境搭建
1)訪问官方站点:http://www.qt.io/download-open-source/ 2)选择离线安装包 3)选择 Windows 离线安装包(32 位或 64 位都可用,Windows 6 ...
- csslint
http://csslint.net/ line column title description browserwarning 1 1 Disallow @import @import preven ...
- 从模版生成 uri Golang 的 html/template 包不太适合于这种情况
模板 - Go/Golang 框架 Echo 文档 http://go-echo.org/guide/templates/ Templates | Echo - High performance, m ...
- CoreGraphics(转)
2.CoreGraphics 上面我们讲过,UIBezierPath是CoreGraphics的封装,使用它可以完成大部分的绘图操作,不过更底层的CoreGraphics更加强大. CoreGraph ...
- cygwin使用笔记
1.在cygwin里访问Windows盘 cd /cygdrive/c cd c: 2.整合cygwin命令到Windows中 假设cygwin安装在d:/develop/cygwin,则将d:/de ...
- 在ubuntu16.04上编译android源码【转】
本文转载自:http://blog.csdn.net/fuchaosz/article/details/51487585 1 前言 经过3天奋战,终于在Ubuntu 16.04上把Android 6. ...
- 查询oracle数据库中的for update 中锁住的table表sql语句
SELECT object_name, machine, s.sid, s.serial# FROM gv$locked_object l, dba_objects o, gv$session s W ...
- Java8初体验(1):lambda表达式语法
原文出处: 一冰_天锦 本文主要记录自己学习Java8的历程,方便大家一起探讨和自己的备忘.因为本人也是刚刚开始学习Java8,所以文中肯定有错误和理解偏差的地方,希望大家帮忙指出,我会持续修改和优化 ...