在我这菜鸟理解上,委托就是可以用方法名调用另一方法的便捷方法,可以简化switch等语句的重复。最近做项目的时候恰好需要用到委托,便来复习及学习委托的使用。嗯...本人以前并没有用过,只是稍微知道而已。以下是整理的笔记。

一.委托的概念

委托是用户自定义的类,它定义了方法的类型。储存的是一系列具有相同参数和返回类型方法的地址列表,调用委托时,此委托列表的所有方法都将被执行。

二.委托类型的定义

委托类型必须在被用来创建变量以及类型对象之前声明。

委托类型的声明:

1.以delegate关键字开头。

2.返回类型+委托类型名+参数列表

delegate void MyDel(int a)

三.实例

1)现在我们先创建了控制台程序,进行简单的实例

namespace Func
{
public delegate void MyDel();//声明一个自定义委托
class Program
{
static void Main(string[] args)
{
MyDel say1 = SayHi;
MyDel say2 = new MyDel(SayHi);
say1();
say2();
}
static void SayHi()
{
Console.WriteLine("hi");
}
}
}

2)扩展实例

namespace Func
{
public delegate int MyDel(int num);//声明一个自定义委托
class Program
{
static int Add1(int a)
{
int b = + a;
Console.WriteLine("——Add1———");
return b; } static int Add2(int a)
{
int b = - a;
Console.WriteLine("——Add2———");
return b; } static void Calculate(MyDel ex, int a)
{
var result = ex(a);
Console.WriteLine(result + "\n");
} static void Main(string[] args)
{
Calculate(Add1, );
Calculate(Add2, );
Console.ReadKey();
}
}
}

结果如下图

上面实现了“把方法当作参数在另一个方法中传递或调用”;从上面可以看出,调用的方法和委托的返回类型,参数类型都必须一致。

我我们可以把委托作为参数传递给封装好了的方法,通过委托来动态的调用方法。

四.委托的加减运算

可以使用+=运算符,为委托新增方法。

同样可以使用-=运算符,为委托移除方法。

当委托列表中有几个方法时,调用委托时,则会依次经过各个方法,并返回列表最后一项方法的结果。

namespace Func
{
public delegate int MyDel(int num);//声明一个自定义委托
class Program
{ static int Add1(int a)
{
int b = + a;
Console.WriteLine("——Add1———");
return b; } static int Add2(int a)
{
int b = - a;
Console.WriteLine("——Add2———");
return b; } static void Calculate(MyDel ex, int a)
{
var result = ex(a);
Console.WriteLine(result + "\n");
} static void Main(string[] args)
{
//Calculate(Add1, 1);
//Calculate(Add2, 10);
MyDel myDel = Add1;
myDel += Add2;
Calculate(myDel, );
Console.ReadKey();
}
}
}

结果如下图:

c#委托(Delegates)--基本概念及使用-LMLPHP

那么有时候我们需要返回每个方法的结果,此方法就不适用了,那怎么才能实现每个方法的返回结果都可以获取到呢?后续再写了。今天就简单的介绍了委托的基本概念和使用。

五、泛型委托

泛型的委托,就是然参数的类型不确定,例如代码改写为:

using System;
using System.Collections.Generic;
using System.Text; namespace TestApp
{
/// <summary>
/// 委托
/// </summary>
/// <param name="s1"></param>
/// <param name="s2"></param>
/// <returns></returns>
public delegate string ProcessDelegate<T,S>(T s1, S s2); class Program
{
static void Main(string[] args)
{
/* 调用方法 */
ProcessDelegate<string,int> pd = new ProcessDelegate<string,int>(new Test().Process);
Console.WriteLine(pd("Text1", ));
}
} public class Test
{
/// <summary>
/// 方法
/// </summary>
/// <param name="s1"></param>
/// <param name="s2"></param>
/// <returns></returns>
public string Process(string s1,int s2)
{
return s1 + s2;
}
}
}

输出的结果就是:
Text1100

泛型的详细内容不属于本文的介绍范围,这里不加多说了。

05-23 06:18