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# 委托详解的更多相关文章

  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. UVA 10529 Dumb Bones 可能性dp 需求预期

    主题链接:点击打开链接 题意: 要在一条直线上摆多米诺骨牌. 输入n, l, r 要摆n张排,每次摆下去向左倒的概率是l, 向右倒的概率是r 能够採取最优策略.即能够中间放一段.然后左右两边放一段等, ...

  2. 【C++基金会 04】vector详细解释

    根据写博客开始总有一些事情的习惯,加鸡汤文,今天请原谅我记得. ============================================= 今天要写的内容是顺序型容器.首先,标准库定义 ...

  3. boostrap-非常好用但是容易让人忽略的地方------clearfix

    代码 显示结果 代码 结果

  4. Oracle cloud control 12c 的启动与关闭

    Oracle cloud control 12c整个安装比較复杂,光是安装路径的选择,登录password,端口号等众多个配置不免让人眼花缭乱,目不暇接.本文描写叙述的是安装完成后怎样获取安装时设定的 ...

  5. Redis源代码分析(二十)--- ae事件驱动

    事件驱动的术语出现更频繁.听起来非常大的,今天我把Redis内部驱动器模型来研究它,奖励的感觉啊.一个ae.c主程序,加4文件的事件类型,让你彻底弄清楚,Redis是怎样处理这些事件的. 在Redis ...

  6. NSIS:制作软件升级安装包

    原文 NSIS:制作软件升级安装包 相信不是每个人写的软件都只发布一次就可以了,肯定要有修改和维护的情况发生.在这种情况下,您可能就需要一个软件的升级安装包了.   现在,我们就来一步步把这个安装包做 ...

  7. NSIS脚本:在卸载页面收集信息

    原文 NSIS脚本:在卸载页面收集信息 此功能用于在软件卸载时收集相关信息,以便进行后续改进.实现功能如图: 以下为实现代码: 01 !include nsDialogs.nsh 02 !includ ...

  8. REST|RESTful初步认识

    工作中要用到jersey来实现restful风格的webservice.对于webservice另一定的认知(能够觉得是一种服务,远程调用的组件),可是对于restful笔者根本就木有了解过,rest ...

  9. jaxb和dozer简介

    一.jaxb是什么     JAXB是Java Architecture for XML Binding的缩写.可以将一个Java对象转变成为XML格式,反之亦然.     我们把对象与关系数据库之间 ...

  10. Open the Lock

    Problem Description Now an emergent task for you is to open a password lock. The password is consist ...