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系统都是以长 ...
随机推荐
- 事件总线EventBus
什么是事件总线管理? 将事件放到队列里,用于管理和分发: 保证应用的各个部分之间高效的通信及数据,事件分发: 模块间解耦: 什么是EventBus? EventBus是发布/订阅的事件总线.Event ...
- lua 定义类 就是这么简单
在网上看到这样一段代码,真是误人子弟呀,具体就是: lua类的定义 代码如下: local clsNames = {} local __setmetatable = setmetatable loca ...
- innodb的锁和高并发
1 innodb的锁 1.1 s锁,即读锁,即share锁 1.2 x锁,即写锁,排他锁 1.3 s锁和x锁之间的关系 多个读锁可以共存,但是读锁不可以和写锁共存.写锁和写锁不可以共存. 1.4 间隙 ...
- Maximum likelihood from incomplete data via the EM algorithm (1977)
Maximum likelihood from incomplete data via the EM algorithm (1977)
- npm ERR! Unexpected end of JSON input while parsing near '...inimist":"^1.2.0"}
简介 在项目中执行npm install安装依赖包的时候.出现npm ERR! Unexpected end of JSON input while parsing near '...inimist& ...
- mongodb学习之:mongo安装以及远程访问
在linux下通过apt-get install mongo的方式一键式安装mongo 安装后mongo的配置文件位于/etc/mongodb.conf. 里面有mongo的各项配置,文件内容如下:重 ...
- ZFIND_ENHANCEMENT(找增强点-新)
REPORT ZFIND_ENHANCEMENT. *&-------------------------------------------------------------------- ...
- 解决Android Studio Fetching Android SDK component information失败问题【转】
本文转载自:http://blog.csdn.net/isesar/article/details/41908089 Android Studio 安装完成后,如果直接启动,Android Studi ...
- HDU3065 病毒侵袭持续中 —— AC自动机
题目链接:https://vjudge.net/problem/HDU-3065 病毒侵袭持续中 Time Limit: 2000/1000 MS (Java/Others) Memory Li ...
- Emscripten实现把C/C++文件转成wasm,wast(wasm的可读形式),llvm字节码(bc格式),ll格式(llvm字节码的可读形式)并执行wasm
<一>˙转换 Emscripten实现把C/C++文件转成wasm,wast(wasm的可读形式),llvm字节码(bc格式),ll格式(llvm字节码的可读形式)的步骤: 最新版本的Em ...