c#委托
2015-08-02 20:23
323 查看
委托(delegate)是一种引用类型,我们在处理他的时候要当作类来看待而不是方法,说白了委托就是对方法或者方法列表的引用,调用一个委托实例就好像是调用c++中的指针一样,他封装了对制定方法的引用,或者说委托起到的是桥梁的作用,实例后的委托对象会将给定的参数传递给他所回调的方法,并去执行方法。【方法作为参数进行传递,类似函数指针】
看一个简单的例子:
//声明一个委托
delegate int myDelegateHandler(int a, int b);
public class A
{
//静态的处理方法
public static int M1(int a, int b)
{
int c = 0;
c = a + b;
return c;
}
}
//入口类
public class B
{
public static void Main()
{
//实例一个委托
myDelegateHandler mdh = new myDelegateHandler(A.M1);
//调用委托
int sum = mdh(2, 2);
Console.WriteLine(sum.ToString());
}
}
上面是一个非常简单的例子,具体的实现步骤:
1、 先声明个委托实例 ;
2、然后提供要处理的方法;
3、再实例化委托(把委托看作是类的话,实例化委托就不难理解了,其参数是要处理的方法,这里的方法 不用加括号,实例化的过程就是装载方法的过程,就好像需要参数的构造函数一样)实例化后的委托对象就好比是c++中的指针,它本身就是封装了方法的对象;
4、最后我们调用委托对象就好比是调用了被封装方法本身,调用时的参数也就传给了被封装的方法。
5、需要注意的是 所声明的委托无论是 参数个数,参数类型,返回值类型 都要和所要封装的方法保持一致,当调用委托实例对象时,所传入的参数也要保持一致 ,否则会出现错误。
委托链
我们知道委托是对方法的封装,而且委托可以封装很多方法形成委托链,其实委托就好像是一个容器,他封装了我们想要实现的若干方法,当调用委托对象(相当于c++中的指针)时,就会顺序的执行它所封装的所有的方法,如果有返回值的话,往往返回的是最后一个被执行的方法的返回值,委托链的形成可以用"+="或"-="对不同的委托实例进行二元操作。委托链只是把多个委托链接在一起。
namespace Delegate
{
class Program
{
delegate void MyDelegate(int p1, int p2);//定义一个委托类型 简单理解为一个函数指针 委托时一种类型
delegate void MyDelegate1(string a);
void Add(int p1,int p2)
{
int sum=p1+p2;
Console.WriteLine(sum);
}
static void method(MyDelegate my)//方法的参数是委托类型
{
my(1, 2);
}
static void print(string a)
{
Console.WriteLine(a);
}
static void Main(string[] args)
{
MyDelegate d;
MyDelegate1 e = new MyDelegate1(Program.print),f=null;
d = new MyDelegate(new Program().Add);//实例化委托类型,传递的方法是方法
d(2, 3);
e("hello");
f += e;
f += e;
f("dd");
}
}
}
还是要满足两点1.参数一致 2.返回类型一致
看一个简单的例子:
//声明一个委托
delegate int myDelegateHandler(int a, int b);
public class A
{
//静态的处理方法
public static int M1(int a, int b)
{
int c = 0;
c = a + b;
return c;
}
}
//入口类
public class B
{
public static void Main()
{
//实例一个委托
myDelegateHandler mdh = new myDelegateHandler(A.M1);
//调用委托
int sum = mdh(2, 2);
Console.WriteLine(sum.ToString());
}
}
上面是一个非常简单的例子,具体的实现步骤:
1、 先声明个委托实例 ;
2、然后提供要处理的方法;
3、再实例化委托(把委托看作是类的话,实例化委托就不难理解了,其参数是要处理的方法,这里的方法 不用加括号,实例化的过程就是装载方法的过程,就好像需要参数的构造函数一样)实例化后的委托对象就好比是c++中的指针,它本身就是封装了方法的对象;
4、最后我们调用委托对象就好比是调用了被封装方法本身,调用时的参数也就传给了被封装的方法。
5、需要注意的是 所声明的委托无论是 参数个数,参数类型,返回值类型 都要和所要封装的方法保持一致,当调用委托实例对象时,所传入的参数也要保持一致 ,否则会出现错误。
委托链
我们知道委托是对方法的封装,而且委托可以封装很多方法形成委托链,其实委托就好像是一个容器,他封装了我们想要实现的若干方法,当调用委托对象(相当于c++中的指针)时,就会顺序的执行它所封装的所有的方法,如果有返回值的话,往往返回的是最后一个被执行的方法的返回值,委托链的形成可以用"+="或"-="对不同的委托实例进行二元操作。委托链只是把多个委托链接在一起。
namespace Delegate
{
class Program
{
delegate void MyDelegate(int p1, int p2);//定义一个委托类型 简单理解为一个函数指针 委托时一种类型
delegate void MyDelegate1(string a);
void Add(int p1,int p2)
{
int sum=p1+p2;
Console.WriteLine(sum);
}
static void method(MyDelegate my)//方法的参数是委托类型
{
my(1, 2);
}
static void print(string a)
{
Console.WriteLine(a);
}
static void Main(string[] args)
{
MyDelegate d;
MyDelegate1 e = new MyDelegate1(Program.print),f=null;
d = new MyDelegate(new Program().Add);//实例化委托类型,传递的方法是方法
d(2, 3);
e("hello");
f += e;
f += e;
f("dd");
}
}
}
还是要满足两点1.参数一致 2.返回类型一致
相关文章推荐
- C#-基础加强(1)
- C#委托(Delegate)学习日记
- C#高级编程六十二天----LINQ标准的查询操作符
- c#初始化顺序
- C# WinFrom 中如何将txt内容显示到dataGridView
- /*用c#!!输入一个数如果是质数则输出该数是质数,如果是合数用质因子乘积的形式输出来如8=2*2*2*/
- /*用C#求一个数,它的九倍是它的反序数*/
- C#编程:如何获得当前进程运行路径
- C#实现百度站长工具的主动推送功能
- C#高级编程六十一天----LINQ中的扩展方法
- C#高级编程六十天----LINQ的概述
- 浅谈C#委托和事件
- C#高效分页代码(不用存储过程)
- [项目实战派]csharp通过dll调用opencv函数,图片作为参数
- C#数据类型
- C#关键字列表
- 课程小结-C#进制转换
- 解 自己关于 C# Button的Click事件的疑惑
- C#自动选择出系统中最合适的IP地址
- C# WinForm程序退出的方法