C#自学25一委托(基础篇)

本文详细介绍了委托的概念、使用方法及其实现原理。通过实例演示了如何声明委托类型、创建委托实例并利用委托调用方法,降低了调用者和被调用者之间的耦合度。

一、什么是委托?
  首先要知道什么是委托,用最通俗易懂的话来讲,可以把委托看成是用来执行方法(函数)的一个东西。
  即将一个方法作为一个参数传给另一个方法

二、如何使用委托?
  在使用委托的时候,你可以像对待一个类一样对待它。即先声明,再实例化。只是有点不同,类在实例化之后叫对象或实例,但委托在实例化后仍叫委托。
委托所指向的函数必须跟委托具有相同的签名(参数和返回值)

三、委托类型和委托实例

  1. 委托类型

委托类型定义了委托实例可以调用的方法、方法的返回类型和参数。我们可以通过委托类型的返回类型和参数来得知具体可以调用哪种方法。下面我们通过一个例子来看一下:
(1)首先我们定义一个委托类型:
csharp
delegate string DemoDelegate(int num);

(2)其次我们定义两个方法:
csharp
string IntToString(int num)
{
return num.ToString();
}

int StringToInt(string num)
{
return int.Parse(num);
}

我们来分析一下这两个代码段。首先我们定义了一个委托 DemoDelegate ,委托所定义的返回值类型是 string 类型,参数只包含一个,参数类型是 int。因此根据委托定义得知只有方法的返回值类型是 string 且参数只有一个,并且 参数类型是 int 时,委托才能调用。所以符合条件的方法就只有IntToString。

  1. 委托实例

当把方法赋值给委托变量的时候就创建了委托实例。同样我们用一个例子来看一下:
csharp
static void Main(string[] args)
{
DemoDelegate dd = IntToString;
string num = dd(123);
// 将输出 string 类型 “123”
Console.WriteLine(num);
}

委托实例本质上就是调用者委托委托方法调用被调用者,在这里就是 Main 方法委托DemoDelegate 去调用 IntToString 方法。这样做的好处是调用者和被调用者的耦合度降低了。

小知识:上面的代码我们还可以这样写,这两种写法是等价的:
csharp
static void Main(string[] args)
{
DemoDelegate dd = new DemoDelegate(IntToString);
string num = dd.Invoke(123);
// 将输出 string 类型 “123”
Console.WriteLine(num);
}

委托的用途很多,我们这里来看一个例子,这个例子展示了委托其中一种的用途
csharp
public delegate int DemoDelegate(int num);

class Tool
{
public static void IntSquare(int[] intArray, DemoDelegate dd)
{
for (int i = 0; i < intArray.Length; i++)
{
intArray[i] = dd(intArray[i]);
}
}
}

class Program
{
static void Main(string[] args)
{
DemoDelegate dd = Square;
int[] intArray = {2,4,6 };
Tool.IntSquare(intArray, dd);
for (int i = 0; i < intArray.Length; i++)
{
Console.WriteLine(intArray[i]);
}

    Console.Read();
}
static int Square(int num)
{
    return num * num;
}

}
我们将委托提取出来,作为一个公共的,然后定义一个 Tool 类,其中定义了一个计算数组中每个值的方法,这个方法接受两个参数,一个是int类型的数组,另一个是 DemoDelegate 委托类型的参数。通过委托调用 Program 类中的 Square 方法来计算数组中每个数字的平方值。我们在 Main方法中将 Square 方法赋值给委托变量,然后见数组和委托变量一同传入刚才我们定义的 Tool 类中的 IntSquare 方法,最后输出值为:4、16、36。这种用途叫做编写插件式方法,插件式方法就是只有在运行时才将方法赋值给委托。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值