c# 委托详解
1.委托声明
2.委托入门实例
- namespace ConsoleApplication1
- {
- public delegate void methodDelegate(string str);
- class Program
- {
- static void Main(string[] args)
- {
- Student student = new Student();
- Teacher teacher = new Teacher("王老师");
- methodDelegate methodDelegate1 = new methodDelegate(student.getStudentName);
- methodDelegate1 += teacher.getTeacherName; //可以指向不同类中的方法!
- //methodDelegate1 += teacher.getClassName; 指向签名不符的方法时提示错误!
- methodDelegate1.Invoke("张三");
- Console.ReadLine();
- }
- }
- class Student
- {
- private String name = "";
- public Student (String _name)
- {
- this.name = _name ;
- }
- public Student() {}
- public void getStudentName(String _name)
- {
- if (this.name != "" )
- Console.WriteLine("Student's name is {0}", this.name);
- else
- Console.WriteLine("Student's name is {0}", _name);
- }
- }
- class Teacher
- {
- private String name;
- public Teacher(String _name)
- {
- this.name = _name;
- }
- public void getTeacherName(String _name)
- {
- if (this.name != "")
- Console.WriteLine("Teacher's name is {0}", this.name);
- else
- Console.WriteLine("Teacher's name is {0}", _name);
- }
- public string getClassName()
- {
- return "Eanlish";
- }
- }
- }
上面代码中实现对委托的调用
最后将被调用的委托输出
3.委托的实现方式
第一种:常规实现
- private delegate String getAString( string parament);
- static void Main(String []args)
- {
- int temp = 40;
- getAString stringMethod = new getAString(temp.ToString); //传递temp.ToString调用委托
- Console.WriteLine("String is {0}", stringMethod()); //stringMethod()调用已经接受参数的委托
- Console.ReadLine();
- }
第二种:多播委托
- getAString stringMethod = new getAString(temp.ToString);
- stringMethod += temp.ToString;
- stringMethod -= temp.ToString;
这种调用之后,按照接受参数的次数, 委托会生成一个列表,每用+=调用一次,会增加一个列表项,-=调用一次,会移除一个列表项。
第三种:委托数组
当我们定义委托 让委托形成一个数组的时候,我们可以通过遍历数组的方式来调用它
- delegate double Operations(double x);
- class Program
- {
- static void Main()
- {
- Operations[] operations =
- {
- MathOperations.MultiplyByTwo,
- MathOperations.Square
- };
- for (int i = ; i < operations.Length; i++)
- {
- Console.WriteLine("Using operations[{0}]:", i);
- DisplayNumber(operations[i], 2.0);
- DisplayNumber(operations[i], 7.94);
- Console.ReadLine();
- }
- }
- static void DisplayNumber(Operations action, double value)
- {
- double result = action(value);
- Console.WriteLine(
- "Input Value is {0}, result of operation is {1}", value, result);
- }
- }
- struct MathOperations
- {
- public static double MultiplyByTwo(double value)
- {
- return value * ;
- }
- public static double Square(double value)
- {
- return value * value;
- }
- }
上面实例中
将委托定义好
之后就可以遍历它
第四种:Action<T>和Func<T>委托
利用微软预先定义的两个泛型类型来给我们调用
先看语法知识
Action<T>
Func<T>
二者都可以接受最大参数个数为16个,二者的区别在于一个有返回值,另外一个返回值为void
实例
- using System;
- namespace DelegateFuncAction
- {
- class Program
- {
- static void Main(string[] args)
- {
- Func<double, double,double> DoAddtion = calculate.addtion;
- double result = DoAddtion(, );
- Console.WriteLine("Func带返回参数委托做加法结果为:{0}",DoAddtion(,));
- calculate c=new calculate();
- Action<double, double> DoSubstraction = c.substraction;
- DoSubstraction(, );
- }
- }
- class calculate
- {
- public static double addtion(double x, double y)
- {
- return x + y;
- }
- public void substraction(double x, double y)
- {
- Console.WriteLine("Action不带返回参数委托做减法结果为:{0}",x-y);
- }
- }
- }
二者定义的方法名都可以把函数赋予它 如下
第五种:匿名方法
匿名方法基本上和上面没有区别,只是实例化时候不同而已
- class Program
- {
- static void Main()
- {
- double width = ;
- Func<double, double> square = delegate(double length)
- {
- length *= width;
- return length;
- };
- Console.WriteLine(square());
- }
- }
这样减少了代码的编写 将一个函数直接在定义的时候赋予Func<T>或者Action<T>定义的函数
第六种:Lambda表达式
先看Lambda表达式的语法知识
例如
- delegate int del(int i);
- static void Main(string[] args)
- {
- del myDelegate = x => x * x;
- int j = myDelegate(); //j = 25
- }
实例中
- x => x * x就是一个参数为x 执行x*x的lambda的表达式 赋予一个委托
4.总结
在声明委托时候可以用三种方式来声明
1.用 delegate关键词来声明(需要声明返回值,接受参数)
2.Action<T>来声明一个返回值为void类型的委托
3.Func<T>来声明有返回类型的委托
委托的实现
无论委托是如何实现的,我们都是赋予它函数时候体现的
c# 委托详解的更多相关文章
- C#委托详解(3):委托的实现方式大全(续)
接上篇(C#委托详解(2):实现方式大全),本篇继续介绍委托的实现方式. 4.Action<T>和Func<T>委托 使用委托时,除了为每个参数和返回类型定义一个新委托类型之外 ...
- C#委托详解(2):实现方式大全
本系列文章将详细探讨C#中的委托,列举其主要的实现方式,并分析其在设计层面和编码层面带来的好处,最后会讨论其安全性和执行效率等. 接上篇(C#委托详解(1):什么是委托)介绍完什么是委托之后,来看看C ...
- C#事件与委托详解
from https://www.cnblogs.com/sjqq/p/6917497.html C#事件与委托详解[精华 多看看] Delegatedelegate是C#中的一种类型,它实际上是一个 ...
- JavaScript 事件委托详解
基本概念 事件委托,通俗地来讲,就是把一个元素响应事件(click.keydown......)的函数委托到另一个元素: 一般来讲,会把一个或者一组元素的事件委托到它的父层或者更外层元素上,真正绑定事 ...
- C#委托详解(1):什么是委托
本系列文章将详细探讨C#中的委托,列举其主要的实现方式,并分析其在设计层面和编码层面带来的好处,最后会讨论其安全性和执行效率等. 什么是委托? 委托是寻址方法的.NET版本,使用委托可以将方法作为参数 ...
- js中的事件委托详解
概述: 那什么叫事件委托呢?它还有一个名字叫事件代理,JavaScript高级程序设计上讲:事件委托就是利用事件冒泡,只指定一个事件处理程序,就可以管理某一类型的所有事件.那这是什么意思呢?网上的各位 ...
- C# 委托详解(一)
1.委托简单例子 class eeProgram { // 声明delegate对象 public delegate string CompareDelegate(int a, int b); // ...
- C#事件与委托详解【精华 多看看】
Delegate delegate是C#中的一种类型,它实际上是一个能够持有对某个方法的引用的类.与其它的类不同,delegate类能够拥有一个签名(signature),并且它"只能持有与 ...
- c#之委托详解(Delegate)
一.委托的概念 在我们学习委托之前,我们来了解下,什么是委托呢? 官方概念:委托是一种安全地封装方法的类型,它与 C 和 C++ 中的函数指针类似.与 C 中的函数指针不同,委托是面向对象的.类型安全 ...
随机推荐
- atcoder它A Mountaineer
Time limit : 2sec / Stack limit : 256MB / Memory limit : 256MB Problem Dave is a mountaineer. He is ...
- 中国的手写输入法iOS8.1在崩溃
当中国的手写输入法.会导致app收起.于debug时刻.报错: 2014-10-22 14:45:10.269 App[524:170755] -[UIKBBlurredKeyView candida ...
- hdu1796 How many integers can you find
//设置m,Q小于n可以设置如何几号m随机多项整除 //利用已知的容斥原理 //ans = 数是由数的数目整除 - 数为整除的两个数的数的最小公倍数 + 由三个数字... #include<cs ...
- Windows下Jekyll安装
一直用Mac,换了新公司使用的电脑是windows,网上粗略的看了一下Jekyll的安装.简略的实现了一遍 首先安装Ruby Ruby安装文件下载地址 下载对应版本,我的电脑是64位的下载64位的版本 ...
- VS路宏 vc++于OutDir、ProjectDir、SolutionDir不同的路径
说明 $(RemoteMachine) 设置为"调试"属性页上"远程计算机"属性的值.有关很多其它信息,请參见更改用于 C/C++ 调试配置的项目设置. $(R ...
- C# 获得Excel工作簿Sheet页面(工作表)集合的名称
#region 获取Excel工作薄中Sheet页(工作表)名集合 /// <summary> /// 获取Excel工作薄中Sheet页(工作表)名集合 /// </summary ...
- swiper实现触摸滑动
引入文件的必要性 <link href="css/swiper.min.css" rel="stylesheet" type="text/css ...
- NYNU_省赛选拔题(3)
题目描述 二叉树,若其与自己的镜像完全相同,就称其为镜像树. 是一棵镜像树:而 不是镜像树.现给你一棵二叉树,请你判断其是不是镜像树. 输入 第一行是一个整数数T,表示测试数据有多少组每组数据第一行是 ...
- NET动态调用WebService
NET动态调用WebService 这不是一篇教你了解WebService的博文,也不是对WebService的深入理解, 这是一篇教你在开发过程中,如果动态的调用WebService一个方法. 在比 ...
- Select与SelectMany的区别
Select() 和 SelectMany() 的工作都是依据源值生成一个或多个结果值. Select() 为每个源值生成一个结果值.因此,总体结果是一个与源集合具有相同元素数目的集合.与之相反,Se ...