1.委托声明

2.委托入门实例

  1. namespace ConsoleApplication1
  2. {
  3.  
  4. public delegate void methodDelegate(string str);
  5. class Program
  6. {
  7. static void Main(string[] args)
  8. {
  9. Student student = new Student();
  10. Teacher teacher = new Teacher("王老师");
  11. methodDelegate methodDelegate1 = new methodDelegate(student.getStudentName);
  12. methodDelegate1 += teacher.getTeacherName; //可以指向不同类中的方法!
  13. //methodDelegate1 += teacher.getClassName; 指向签名不符的方法时提示错误!
  14. methodDelegate1.Invoke("张三");
  15. Console.ReadLine();
  16. }
  17. }
  18.  
  19. class Student
  20. {
  21. private String name = "";
  22. public Student (String _name)
  23. {
  24. this.name = _name ;
  25. }
  26. public Student() {}
  27. public void getStudentName(String _name)
  28. {
  29. if (this.name != "" )
  30. Console.WriteLine("Student's name is {0}", this.name);
  31. else
  32. Console.WriteLine("Student's name is {0}", _name);
  33. }
  34. }
  35.  
  36. class Teacher
  37. {
  38. private String name;
  39. public Teacher(String _name)
  40. {
  41. this.name = _name;
  42. }
  43. public void getTeacherName(String _name)
  44. {
  45. if (this.name != "")
  46. Console.WriteLine("Teacher's name is {0}", this.name);
  47. else
  48. Console.WriteLine("Teacher's name is {0}", _name);
  49. }
  50. public string getClassName()
  51. {
  52. return "Eanlish";
  53. }
  54. }
  55. }

上面代码中实现对委托的调用

最后将被调用的委托输出

3.委托的实现方式

第一种:常规实现

  1. private delegate String getAString( string parament);
  2. static void Main(String []args)
  3. {
  4. int temp = 40;
  5. getAString stringMethod = new getAString(temp.ToString); //传递temp.ToString调用委托
  6. Console.WriteLine("String is {0}", stringMethod()); //stringMethod()调用已经接受参数的委托
  7. Console.ReadLine();
  8. }

第二种:多播委托

  1. getAString stringMethod = new getAString(temp.ToString);
  2. stringMethod += temp.ToString;
  3. stringMethod -= temp.ToString;

  这种调用之后,按照接受参数的次数, 委托会生成一个列表,每用+=调用一次,会增加一个列表项,-=调用一次,会移除一个列表项。

第三种:委托数组

当我们定义委托 让委托形成一个数组的时候,我们可以通过遍历数组的方式来调用它

  1. delegate double Operations(double x);
  2.  
  3. class Program
  4. {
  5. static void Main()
  6. {
  7. Operations[] operations =
  8. {
  9. MathOperations.MultiplyByTwo,
  10. MathOperations.Square
  11. };
  12.  
  13. for (int i = ; i < operations.Length; i++)
  14. {
  15. Console.WriteLine("Using operations[{0}]:", i);
  16. DisplayNumber(operations[i], 2.0);
  17. DisplayNumber(operations[i], 7.94);
  18. Console.ReadLine();
  19. }
  20. }
  21.  
  22. static void DisplayNumber(Operations action, double value)
  23. {
  24. double result = action(value);
  25. Console.WriteLine(
  26. "Input Value is {0}, result of operation is {1}", value, result);
  27. }
  28. }
  29.  
  30. struct MathOperations
  31. {
  32. public static double MultiplyByTwo(double value)
  33. {
  34. return value * ;
  35. }
  36.  
  37. public static double Square(double value)
  38. {
  39. return value * value;
  40. }
  41. }

上面实例中

将委托定义好

之后就可以遍历它

第四种:Action<T>和Func<T>委托

利用微软预先定义的两个泛型类型来给我们调用

先看语法知识

Action<T>

Func<T>

二者都可以接受最大参数个数为16个,二者的区别在于一个有返回值,另外一个返回值为void

实例

  1. using System;
  2. namespace DelegateFuncAction
  3. {
  4. class Program
  5. {
  6. static void Main(string[] args)
  7. {
  8. Func<double, double,double> DoAddtion = calculate.addtion;
  9. double result = DoAddtion(, );
  10. Console.WriteLine("Func带返回参数委托做加法结果为:{0}",DoAddtion(,));
  11. calculate c=new calculate();
  12. Action<double, double> DoSubstraction = c.substraction;
  13. DoSubstraction(, );
  14. }
  15. }
  16. class calculate
  17. {
  18. public static double addtion(double x, double y)
  19. {
  20. return x + y;
  21. }
  22. public void substraction(double x, double y)
  23. {
  24. Console.WriteLine("Action不带返回参数委托做减法结果为:{0}",x-y);
  25. }
  26. }
  27. }

二者定义的方法名都可以把函数赋予它 如下

第五种:匿名方法

匿名方法基本上和上面没有区别,只是实例化时候不同而已

  1. class Program
  2. {
  3. static void Main()
  4. {
  5. double width = ;
  6.  
  7. Func<double, double> square = delegate(double length)
  8. {
  9. length *= width;
  10. return length;
  11. };
  12. Console.WriteLine(square());
  13. }
  14. }

这样减少了代码的编写  将一个函数直接在定义的时候赋予Func<T>或者Action<T>定义的函数

第六种:Lambda表达式

先看Lambda表达式的语法知识

例如

  1. delegate int del(int i);
  2. static void Main(string[] args)
  3. {
  4. del myDelegate = x => x * x;
  5. int j = myDelegate(); //j = 25
  6. }

实例中

  1. x => x * x就是一个参数为x 执行x*xlambda的表达式 赋予一个委托

4.总结

在声明委托时候可以用三种方式来声明

1.用 delegate关键词来声明(需要声明返回值,接受参数)

2.Action<T>来声明一个返回值为void类型的委托

3.Func<T>来声明有返回类型的委托

委托的实现

无论委托是如何实现的,我们都是赋予它函数时候体现的

  1.  
  1.  

c# 委托详解的更多相关文章

  1. C#委托详解(3):委托的实现方式大全(续)

    接上篇(C#委托详解(2):实现方式大全),本篇继续介绍委托的实现方式. 4.Action<T>和Func<T>委托 使用委托时,除了为每个参数和返回类型定义一个新委托类型之外 ...

  2. C#委托详解(2):实现方式大全

    本系列文章将详细探讨C#中的委托,列举其主要的实现方式,并分析其在设计层面和编码层面带来的好处,最后会讨论其安全性和执行效率等. 接上篇(C#委托详解(1):什么是委托)介绍完什么是委托之后,来看看C ...

  3. C#事件与委托详解

    from https://www.cnblogs.com/sjqq/p/6917497.html C#事件与委托详解[精华 多看看] Delegatedelegate是C#中的一种类型,它实际上是一个 ...

  4. JavaScript 事件委托详解

    基本概念 事件委托,通俗地来讲,就是把一个元素响应事件(click.keydown......)的函数委托到另一个元素: 一般来讲,会把一个或者一组元素的事件委托到它的父层或者更外层元素上,真正绑定事 ...

  5. C#委托详解(1):什么是委托

    本系列文章将详细探讨C#中的委托,列举其主要的实现方式,并分析其在设计层面和编码层面带来的好处,最后会讨论其安全性和执行效率等. 什么是委托? 委托是寻址方法的.NET版本,使用委托可以将方法作为参数 ...

  6. js中的事件委托详解

    概述: 那什么叫事件委托呢?它还有一个名字叫事件代理,JavaScript高级程序设计上讲:事件委托就是利用事件冒泡,只指定一个事件处理程序,就可以管理某一类型的所有事件.那这是什么意思呢?网上的各位 ...

  7. C# 委托详解(一)

    1.委托简单例子 class eeProgram { // 声明delegate对象 public delegate string CompareDelegate(int a, int b); // ...

  8. C#事件与委托详解【精华 多看看】

    Delegate delegate是C#中的一种类型,它实际上是一个能够持有对某个方法的引用的类.与其它的类不同,delegate类能够拥有一个签名(signature),并且它"只能持有与 ...

  9. c#之委托详解(Delegate)

    一.委托的概念 在我们学习委托之前,我们来了解下,什么是委托呢? 官方概念:委托是一种安全地封装方法的类型,它与 C 和 C++ 中的函数指针类似.与 C 中的函数指针不同,委托是面向对象的.类型安全 ...

随机推荐

  1. atcoder它A Mountaineer

    Time limit : 2sec / Stack limit : 256MB / Memory limit : 256MB Problem Dave is a mountaineer. He is ...

  2. 中国的手写输入法iOS8.1在崩溃

    当中国的手写输入法.会导致app收起.于debug时刻.报错: 2014-10-22 14:45:10.269 App[524:170755] -[UIKBBlurredKeyView candida ...

  3. hdu1796 How many integers can you find

    //设置m,Q小于n可以设置如何几号m随机多项整除 //利用已知的容斥原理 //ans = 数是由数的数目整除 - 数为整除的两个数的数的最小公倍数 + 由三个数字... #include<cs ...

  4. Windows下Jekyll安装

    一直用Mac,换了新公司使用的电脑是windows,网上粗略的看了一下Jekyll的安装.简略的实现了一遍 首先安装Ruby Ruby安装文件下载地址 下载对应版本,我的电脑是64位的下载64位的版本 ...

  5. VS路宏 vc++于OutDir、ProjectDir、SolutionDir不同的路径

    说明 $(RemoteMachine) 设置为"调试"属性页上"远程计算机"属性的值.有关很多其它信息,请參见更改用于 C/C++ 调试配置的项目设置. $(R ...

  6. C# 获得Excel工作簿Sheet页面(工作表)集合的名称

    #region 获取Excel工作薄中Sheet页(工作表)名集合 /// <summary> /// 获取Excel工作薄中Sheet页(工作表)名集合 /// </summary ...

  7. swiper实现触摸滑动

    引入文件的必要性 <link href="css/swiper.min.css" rel="stylesheet" type="text/css ...

  8. NYNU_省赛选拔题(3)

    题目描述 二叉树,若其与自己的镜像完全相同,就称其为镜像树. 是一棵镜像树:而 不是镜像树.现给你一棵二叉树,请你判断其是不是镜像树. 输入 第一行是一个整数数T,表示测试数据有多少组每组数据第一行是 ...

  9. NET动态调用WebService

    NET动态调用WebService 这不是一篇教你了解WebService的博文,也不是对WebService的深入理解, 这是一篇教你在开发过程中,如果动态的调用WebService一个方法. 在比 ...

  10. Select与SelectMany的区别

    Select() 和 SelectMany() 的工作都是依据源值生成一个或多个结果值. Select() 为每个源值生成一个结果值.因此,总体结果是一个与源集合具有相同元素数目的集合.与之相反,Se ...