对委托中的疑惑不理解


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; 这个叫做多播委托,也就是把多个方法挂在一个委托上
第一次只能用 =
之后才可以 += (当然也可以 = 那样把之前的冲掉了)

  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/1023761
  • 你也可以参考下这篇文章:判断输入的字符是不是字母
  • 除此之外, 这篇博客: 指针中的 不带参数的函数指针 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 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$ 
    
  • 您还可以看一下 邓俊老师的软件项目管理实战课程中的 课程及自我介绍小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    委托(Delegate)是一种类型,他可以用来存储具有特定签名的方法的引用,允许以后回调这些方法。委托可以看做是函数的抽象,有助于增强程序的灵活性和可扩展性。它在许多语言中都被使用。

    其中,委托有以下作用和用途:

    1. 委托可以用于事件处理程序,当特定事件发生时,程序员可以订阅委托,以便在该事件发生时调用在委托中定义的方法。

    2. 委托的另一个常见用途是实现回调方法。在这种情况下,委托用于存储所调用的回调方法的引用。这样,当某些行为发生时,回调方法可以自动调用。

    3. 委托还可以实现方法的多播,即将多个方法组合成一个单一的方法。这种组合在一些情况下非常有用,例如当需要多个方法执行相同的任务时。

    下面是使用委托的示例代码:

    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事件,以调用已订阅的方法。

    希望这个例子可以帮助你更好地理解委托的概念以及它的作用和用途。