using System;
namespace InheritanceApplication
{
delegate void PrintFunction();
class Test
{
public void Print1()
{
Console.WriteLine("Print1--instance");
}
public static void Print2()
{
Console.WriteLine("Print2--static");
}
}
class Program
{
static void Main()
{
Test t = new Test();
PrintFunction pf;
pf = t.Print1;//这里的pf有何意义?为何不可以写成pf += t.Print1;
pf += Test.Print2; //这里为何不可以写成pf = Test.Print2;
pf += t.Print1;
pf += Test.Print2;
if (null != pf)
pf();
else
Console.WriteLine("Delegate is empty");
}
}
}
pf += t.Print1; 这个叫做多播委托,也就是把多个方法挂在一个委托上
第一次只能用 =
之后才可以 += (当然也可以 = 那样把之前的冲掉了)
google@ubuntu1404:~/workspace/test/play_game$ cat test.c
#include<stdio.h>
//没参数的情况 :
void single_life( void(*function)(void *arg));
void function(void *arg);
void main()
{
single_life(function);
}
void single_life( void(*function)(void *arg) )
{
function(0);//由于没有带参数所以通过函数指针调用的时候直接写0,但不能不写不然会抛错
}
void function(void *arg)
{
while(1)
{
printf("加油 ,打工人!\n");
sleep(3);
}
}
google@ubuntu1404:~/workspace/test/play_game$ gcc test.c
google@ubuntu1404:~/workspace/test/play_game$ ./a.out
加油 ,打工人!
加油 ,打工人!
加油 ,打工人!
加油 ,打工人!
^C
google@ubuntu1404:~/workspace/test/play_game$
委托(Delegate)是一种类型,他可以用来存储具有特定签名的方法的引用,允许以后回调这些方法。委托可以看做是函数的抽象,有助于增强程序的灵活性和可扩展性。它在许多语言中都被使用。
其中,委托有以下作用和用途:
委托可以用于事件处理程序,当特定事件发生时,程序员可以订阅委托,以便在该事件发生时调用在委托中定义的方法。
委托的另一个常见用途是实现回调方法。在这种情况下,委托用于存储所调用的回调方法的引用。这样,当某些行为发生时,回调方法可以自动调用。
委托还可以实现方法的多播,即将多个方法组合成一个单一的方法。这种组合在一些情况下非常有用,例如当需要多个方法执行相同的任务时。
下面是使用委托的示例代码:
using System;
public delegate void GreetingDelegate(string name);
public class GreetingManager
{
// 声明一个委托作为事件,可以有多个方法订阅
public event GreetingDelegate GreetingEvent;
// 使用委托实现回调方法
public void GreetPeople(string name)
{
Console.WriteLine("Hello " + name);
if (GreetingEvent != null)
{
// 调用订阅了委托的方法
GreetingEvent(name);
}
}
}
public class Program
{
static void Main(string[] args)
{
GreetingManager greetingManager = new GreetingManager();
// 将方法订阅到委托上
greetingManager.GreetingEvent += EnglishGreeting;
greetingManager.GreetingEvent += ChineseGreeting;
greetingManager.GreetPeople("Tom");
Console.ReadLine();
}
static void EnglishGreeting(string name)
{
Console.WriteLine("Nice to meet you, " + name);
}
static void ChineseGreeting(string name)
{
Console.WriteLine("你好," + name);
}
}
这段代码演示了如何使用委托来实现事件处理和回调方法。委托被声明为一个类型,并定义其方法签名。在GreetingManager
类中,声明了一个委托事件GreetingEvent
,来满足特定的事件。在GreetPeople
方法中,使用GreetingEvent
来调用已订阅的方法。在Main
方法中,首先将两个方法订阅到GreetingEvent
中,然后调用GreetPeople
方法,并触发GreetingEvent
事件,以调用已订阅的方法。
希望这个例子可以帮助你更好地理解委托的概念以及它的作用和用途。