C#基础之------委托
一、委托的基本介绍 |
可以认为委托是持有一个或多个方法的对象。当然,正常情况下你不会去执行一个对象,但是委托与对象不同。可以执行委托,但是委托就会执行他所"持有"的方法。
举个栗子就如同 你媳妇让你去买两个包子, 你就是那个 委托 ,买包子是你所持有的方法,当然这样举得栗子稍有不妥,但是这能帮助理解一些委托的基本概念。
委托的概述:
声明类型 | 声明类 | 声明委托(类型) |
声明类型的变量 | 声明类类型的变量 | 声明委托类型的变量 |
填充变量 |
创建累的实例并且把 它的引用赋值给变量 |
创建委托的实例并且把 它的实例赋值给变量并且 添加一个方法 |
使用变量 | 使用类对象 | 调用委托 |
二、委托的基本使用 |
1.委托的声明:
委托就好像类一样,必须要在创建变量及类型前声明。
delegate void Demo(int x)
delegate :委托的关键字
void:返回类型
Demo:委托类型名
(int x):签名
2.创建委托对象:
创建委托变量
Demo Mydemo;
创建委托对象
Mydemo=new Demo(实例名.方法)
Mydemo=new Demo(类名.方法)
创建委托对象要有委托名,括号内的是添加到委托内的方法,可以是实例方法也可以是静态方法。
我们还可以使用快捷语法类进行委托的创建,它只有 方法说明符构成。
Mydemo=实例名.方法
Mydemo=类名.方法
可以这样做的原因是 方法名称和其相应的委托类型之间存在隐式转换。
3.给委托赋值:
因为委托是引用类型,我们可以给委托赋值来改变包含在委托变量内的引用,改变之后,原有的委托对象会被垃圾回收器回收。
Mydemo=InsertObj.other1
4.组合委托:
委托是可以使用额外的运算符来“组合”。这个运算会创建一个新的委托,其调用列表连接了作为操作数的两个委托的调用列表副本。
Mydemo demo1=Mathod.Mym1;
Mydemo demo2=Sclass.Mym2;
Mydemo demo3=demo1+demo2;
组合委托总觉得好像操作数被改变一样。事实上委托是恒定的,委托对象被创建后不能再被改变。
(图示中的方法与代码不同,意义一样。)
5.向委托添加方法:
运算符: +=
Mydemo demo=inst.Mym1;
demo+=scl.m3;
demo+=x.act;
当为委托添加方法的时候,其实委托是不可变的,当向委托中添加方法的时候是其实是生成一个新的委托。
所以向委托中添加了三个方法后的结果其实是变量指向一个全新的委托。
6.移除方法:
运算符: -=
移除方法与添加方法一样,本质上都是创建了一个新的委托,新的委托是旧的委托的副本----值是没有了已经被移除方法的引用。
7.调用委托:
Mydemo demo=inst.Mym1;
demo+=scl.m3;
demo+=x.act;
demo(123);//调用委托
如果一个方法在委托中出现多次那么,每次在执行列表中遇到方法的时候都会被执行一次。
8.完整委托实例:
delegate void Mydele(string str);
public class Myclass
{
public void PritStr1(string str)
{
Console.WriteLine(str);
}
public static void PritStr2(string str)
{
Console.WriteLine(str);
}
}
class Program
{
static void Main(string[] args)
{
Myclass cla = new Myclass();
Mydele dele = cla.PritStr1;//实例化委托 //给委托添加方法
dele += Myclass.PritStr2;
//调用委托
dele("测试一下");
Console.ReadKey();
}
}
9.带返回值的委托:
delegate int Mydele();
public class Myclass
{
int str = ;
public int PritStr1()
{ return str+=;
}
public int PritStr2()
{ return str+=;
}
}
class Program
{
static void Main(string[] args)
{
Myclass cla = new Myclass();
Mydele dele = cla.PritStr1;//实例化委托 //给委托添加方法
dele += cla.PritStr2;
//调用委托
Console.WriteLine("返回值是:{0}",dele());
Console.ReadKey();
}
}
10.调用使用引用参数的委托:
对于委托中的引用参数与 在方法中是一样的。参数传递的值地址,所以在每一个方法内对数值的操作都会体现出来。
delegate void Mydele(ref int x);
public class Myclass
{
public void PritStr1(ref int x)
{
x += ;
}
public void PritStr2(ref int x)
{
x += ;
}
}
class Program
{
static void Main(string[] args)
{
Myclass cla = new Myclass();
Mydele dele = cla.PritStr1;//实例化委托 //给委托添加方法
dele += cla.PritStr2;
//调用委托
int x = ;
dele(ref x);
Console.WriteLine("X的值是{0}",x);
Console.ReadKey();
}
}
三、关于委托的一些延伸 |
匿名方法:
匿名方法的产生是因为在程序中有的方法只需要执行一次,本着最大限度节省时间、节省人力的奋斗方针,程序猿大牛们发明了---匿名方法。一种不需要声明、创建实例、配合委托直接使用的方法。
——>普通具名方法(low到爆啊)
delegate int Mydele(int x);
public class Myclass
{
public int PritStr1( int x)
{
x += ;
return x;
}
}
class Program
{
static void Main(string[] args)
{
Myclass cla = new Myclass();
Mydele dele = cla.PritStr1;//实例化委托 Console.WriteLine("X的值是{0}",dele());
Console.WriteLine("X的值是{0}", dele());
Console.ReadKey();
}
}
——>匿名方法(高富帅)
class Program
{
delegate int Mydele2(int x);
static void Main(string[] args)
{ Mydele2 dele = delegate(int x)
{
return x + ;
};
Console.WriteLine("X的值是{0}", dele());
Console.ReadKey();
}
}
匿名方法的语法:
匿名方法的主要语法包括:
1.delegate, 关键字。
2.参数列表,如果语句块没有任何参数则可以省略。
3.语句块,包含匿名方法的代码。
1.返回类型
匿名方法不会显示声明返回值,实现匿名方法的时候必须返回一个类型与委托返回类型相同的值。如果委托声明的是Void,那么匿名方法就不能有返回值。
这一点是遵从于委托的基本概念, 参数 与返回类型都需要与委托声明的时候相符合才可以。
2.参数
方法签名必须与委托相符合。
签名包括: 1.参数数量 2.参数类型及位置 3.修饰符
省略参数列表的前提是: 1.委托参数不包含任何out修饰符。 2.匿名方法不适用任何参数。
3.Params参数
委托类型声明的时候最后一个参数必须是Params
匿名参数的列表是可以忽略Params关键字的
delegate void Mydele(int x,params int[] y);
Mydele dele=delegate(int x,int[] y)
{
//具体代码
};
4.匿名方法变量的作用域
- 外围作用域的变量叫做外部变量。
- 用在匿名方法实现代码中的外部变量成为方法捕获。
delegate void Mydele(int x,params int[] y);
int xx=;
Mydele dele=delegate(int x,int[] y)
{
//具体代码
console.writeline("捕获:{0}",xx);//使用了外部变量 };
console.writeline("{0}",x);//编译错误,超出作用域
Lambda表达式:
拉姆达表达式其实就是 委托和匿名方法的 2.0 变得更加简洁方便。
Mydele dele= delegate(int x) {return x+;};//匿名方法
Mydele dele= (int x) => {return x+;};//省略delegate 使用=>(goes to)
Mydele dele= (x) => {return x+;};//省略类型
Mydele dele= x => {return x+;};//省略圆括号
Mydele dele= x => x+; //省略return
----->>>>任重而道远,这艰辛路上怎能没有你的支持和鼓励。 |
C#基础之------委托的更多相关文章
- C#基础系列——委托和设计模式(二)
前言:前篇 C#基础系列——委托实现简单设计模式 简单介绍了下委托的定义及简单用法.这篇打算从设计模式的角度去解析下委托的使用.我们知道使用委托可以实现对象行为(方法)的动态绑定,从而提高设计的灵活性 ...
- [.net 面向对象编程基础] (21) 委托
[.net 面向对象编程基础] (20) 委托 上节在讲到LINQ的匿名方法中说到了委托,不过比较简单,没了解清楚没关系,这节中会详细说明委托. 1. 什么是委托? 学习委托,我想说,学会了就感觉简 ...
- 转载 【.NET基础】--委托、事件、线程(2) https://www.cnblogs.com/chengzish/p/4569912.html
[.NET基础]--委托.事件.线程(2) 本文介绍event的使用以及原理,本文接上一篇文章的Demo继续[下载上一篇Demo] 上一篇我们在类(dg_SayHi.cs)里面定义代理了4个Del ...
- 转载 【.NET基础】--委托、事件、线程(1) https://www.cnblogs.com/chengzish/p/4559268.html
[.NET基础]--委托.事件.线程(1) 1,委托 是存放方法的指针的清单,也就是装方法的容器 A, 新建winform项目[01委托],项目中添加dg_SayHi.cs 委托类 用于存储方法 ...
- C#基础系列——委托实现简单设计模式
前言:上一篇介绍了下多线程的相关知识:C#基础系列——多线程的常见用法详解,里面就提到了委托变量.这篇简单介绍下委托的使用.当然啦,园子里面很多介绍委托的文章都会说道:委托和事件的概念就像一道坎,过了 ...
- [C#基础]说说委托+=和-=的那些事
写在前面 为什么会突然想说说委托?原因吗,起于一个同事的想法,昨天下班的路上一直在想这个问题,如果给委托注册多个方法,会不会都执行呢?为了一探究性,就弄了个demo研究下. += 大家都知道委托都继承 ...
- 【.NET基础】--委托、事件、线程(3)
之前的两篇文章我们了解了委托和事件,本文我们看一下线程. 1,一个窗体程序,默认拥有一个线程(相当于一个商店里面,只有一个店员),这个默认的线程叫做 UI线程/主线程. 2,进程和线程的关系: A,进 ...
- 转载 【.NET基础】--委托、事件、线程(3)
之前的两篇文章我们了解了委托和事件,本文我们看一下线程. 1,一个窗体程序,默认拥有一个线程(相当于一个商店里面,只有一个店员),这个默认的线程叫做 UI线程/主线程. 2,进程和线程的关系: A ...
- C#基础之委托
委托常常和事件在一起使用,可以理解委托是方法的容器,事件则是委托的另一种表现形式.委托和事件虽然写得还比较多,不过也只是用的熟练而已,趁周末没课好好巩固下基础,一点一点积累吧. 1.一个简单的小例子 ...
- C#基础篇——委托
前言 在本章中,主要是借机这个C#基础篇的系列整理过去的学习笔记.归纳总结并更加理解透彻. 在.Net开发中,我们经常会遇到并使用过委托,如果能灵活的掌握并加以使用会使你在编程中游刃有余,然后对于很多 ...
随机推荐
- Spark结构式流编程指南
Spark结构式流编程指南 概览 Structured Streaming 是一个可拓展,容错的,基于Spark SQL执行引擎的流处理引擎.使用小量的静态数据模拟流处理.伴随流数据的到来,Spark ...
- javascript-引用类型--Object类型
引用类型是一种数据结构,本质是数据和功能的集合.引用类型有时也被称为对象定义,因为它们描述的是一类对象所具有的属性和方法.引用类型相当于java里面的类,javascript虽然是一门面向对象语言,但 ...
- [项目记录] 用c语言完成的一个学生成绩管理系统
一.要求: 学生成绩管理系统 某班有最多不超过30人(具体人数由键盘输入)参加期末考试,最多不超过6门(具体门数由键盘输入).使用链表编程实现如下菜单驱动的学生成绩管理系统. 从文件读入每个学生个人信 ...
- django出现__init__() got an unexpected keyword argument 'mimetype‘ 问题解决
这种问题好多新手按照djangobook学习的时候应该都遇到过,是因为这是老的django的写法,新的django已经升级改变了很多东西. 处理方法如下: I think you are not us ...
- ASP.NET Core:CMD命令行+记事本 创建Console程序和Web Application
今天看了Scott关于ASP.NET Core的介绍视频,发现用命令行一步一步新建项目.添加Package.Restore.Build.Run 执行的实现方式,更让容易让我们了解.NET Core的运 ...
- python服务器环境搭建(3)——参数配置
前面我们已安装好了python服务器运行所需要的相关软件,而最重要最繁琐的就是参数配置,写这篇就踩了好多坑,花了好多时间,遇到了各种各样的问题.好了费话少说,直接进入本篇话题. PS:本人不是专业的运 ...
- 一种类似Retrofit声明接口即可实现调用的WebApi客户端框架
为.Net出力 java有okhttp,还在okhttp这上搞了一个retrofit,.net有HttpClient,但目前我没有发现有类似的retrofit框架.最近在搞mqtt的webApi封装, ...
- 开源一个vue2的tree组件
一直打算偷懒使用个现成的树组件,但是在github上找了一大圈没有找到真正满足应用开发的树组件,所以没办法只能自己写了一个,开源出来希望可以帮助到需要的人,同时如果大家觉得好用,我可以顺带骗骗★(希望 ...
- 转:java实例化对象的过程
学习JAVA这门面向对象的语言,实质就是不断地创建类,并把类实例化为对象并调用方法.对于初学JAVA的人总搞清楚对象是如何实例化的,假如类之间存在继承关系,那就更糊涂了.下面我们通过两个例题来说明对象 ...
- JavaScript对象的深浅复制
前言 从层次上来看,对象的复制可以简单地分为浅复制和深复制,顾名思义,浅复制是指只复制一层对象的属性,不会复制对象中的对象的属性,对象的深复制会复制对象中层层嵌套的对象的属性. 在复制对象时,除了要复 ...