C# 中的委托
1. 什么是委托
委托是一个引用类型,它定义一个方法类,可以使得一个方法当作另一个方法的参数传递过去。它储存的不是实际值,而是一个储存在堆中对象的一个引用。而委托的关键子就是 delegate
public delegate void MyDel(int x);
public : 修饰词
delegate : 关键字
void : 返回类型
MyDel : 委托类型名
int x : 签名
这样一个 返回值为 void 型 ,带一个int 参数的委托类型就创建好了。
那么我们创建了一个委托,应该如何使用它呢?首先,我们要创建一个委托对象,委托对象跟创建其他的对象是类似的
int num;
MyDel myDel;
这样就创建了一个委托对象。那我们要如何对它赋值呢?
因为该委托是void型带一个int参数的,所以,我们也要用对应的函数给其赋值,看下面代码
class Test
{
public void TestDel(int num)
{
Console.WriteLine("num = {0}", num);
}
}
我们就可以直接的对委托 赋值 TestDel
MyDel = TestDel
public delegate void MyDel(int x);
class Test
{
public void TestDel(int num)
{
Console.WriteLine("num = {0}", num);
}
}
class Program
{
static void Main(string[] args)
{
Test test = new Test();
MyDel myDel;
// 对委托赋值
myDel = test.TestDel;
Console.ReadKey();
}
}
使用 “=” 符号赋值是一种方式,还有一种是 “+=” 符号。 因为委托还有一个功能就是:可以组合使用 。
当我们想对两个对象里的相同方法进行同时调用时,一般会这样
Test test = new Test();
Test test2 = new Test();
test.TestDel(1);
test2.TestDel(1);
而使用委托方法的话是这样的
MyDel myDel1 = test.TestDel;
MyDel myDel2 = test2.TestDel;
myDel1(1);
myDel2(1);
而这样执行的会比较繁琐,所以我们可以直接用一个委托的类型来执行
Test test = new Test();
Test test2 = new Test();
MyDel myDel;
myDel = test.TestDel;
myDel += test2.TestDel;
myDel(1);
这样以来,我们就可以直接的通过一个委托对象 myDel 来执行调用所有的函数了。其实委托在堆内存中的排布时这样的。(注意:这里如果使用 += 的话,myDel 委托必须不为null,否则会报编译错误。)
最后介绍的就是如何执行了。执行委托很简单,直接跟普通的对象调用对象函数一样使用 “()”就可以。
下面是一个完整的执行代码:
public delegate void MyDel(int x);
class Test
{
public void TestDel(int num)
{
Console.WriteLine("Test_num = {0}", num);
}
}
class Test2
{
public void TestDel2(int num)
{
Console.WriteLine("Test2_num = {0}", num);
}
}
class Program
{
static void Main(string[] args)
{
Test test = new Test();
Test2 test2 = new Test2();
MyDel myDel;
myDel = test.TestDel;
myDel += test2.TestDel2;
myDel(12);
Console.ReadKey();
}
}
输出的结果:
Test_num = 12
Test2_num = 12
下面来看一个带返回值的委托
public delegate int MyDel(int x);
class Test
{
public int TestDel(int num)
{
return num + 1;
}
}
class Test2
{
public int TestDel2(int num)
{
return num + 2;
}
}
class Program
{
static void Main(string[] args)
{
Test test = new Test();
Test2 test2 = new Test2();
MyDel myDel;
myDel = test.TestDel;
myDel += test2.TestDel2;
Console.WriteLine($"return num is {myDel(12)}");
Console.ReadKey();
}
}
执行后的结果是:
return num is 14
所以带返回值的委托返回的永远是最后一个函数返回的值。
版权声明:本文为qq_36361527原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。