(四十四)C#编程基础复习——C#委托(Delegate)

C#中的委托(Delegate)类似于C或C++中的函数指针,是一种引用类型,表示对具有特定参数列表和返回类型的方法的引用。委托特别适用于实现事件和回调方法,所有的委托都派生自System.Delegate类。在实例化委托时,可以将委托的实例与具有相同返回值类型的方法相关联,这样就可以通过委托来调用方法。另外,使用委托还可以将方法作为参数传递给其他方法。

委托具有以下特点:

  1. 委托类似于C/C++中的函数指针,但委托时完全面向对象的。另外,C++中的指针会记住函数,而委托则是同时封装对象实例和方法;
  2. 委托允许将方法作为参数进行传递;
  3. 委托可用于定义回调方法;
  4. 委托可以链接在一起,例如可以对一个事件调用多个方法;
  5. 方法不必与委托类型完全匹配;
  6. C#2.0版引入了匿名函数的概念,可以将代码块作为参数(而不是单独定义的方法)进行传递。C#3.0引入了Lambda表达式,利用它们可以更简练地编写内联代码块。匿名方法和Lambda表达式都可编译为委托类型,这些功能现在统称为匿名函数。

一、声明委托

声明委托需要使用delegate关键字,语法如下:

delegate<return type> delegate-name(<parameter list>)

其中return type为返回值类型,delegate-name为委托的名称,parameter list为参数列表。提示:委托可以引用与委托具有相同签名的方法,也就是会所委托在声明时即确定了委托可以引用的方法。

二、实例化委托

委托一旦声明,想要使用就必须使用new关键字来创建委托的对象,同时将其与特定的方法关联。如下所示:

public delegate void printString(string s);//声明一个委托
...
printString ps1=new printString(WriterToScreen);//实例化委托对象并将与其WriteToScreen方法关联
PrintString ps2=new printString(WriteToFile);//实例化委托对象并将其与WriteToFile方法关联

下面通过具体的示例来演示委托的声明、实例化和使用,该委托可用于引用带有一个整型参数的方法,并返回一个整型值。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

delegate int NumberChanger(int n);//定义委托
namespace _005
{
    internal class Program
    {
        static int num = 10;
        public static int AddNum(int p)
        {
            num += p;
            return num;
        }
        public static int MultNum(int q)
        {
            num *= q;
            return num;
        }
        public static int getNum()
        {
            return num;
        }
        static void Main(string[] args)
        {
            //创建委托实例
            NumberChanger nc1 = new NumberChanger(AddNum);
            NumberChanger nc2 = new NumberChanger(MultNum);
            //使用委托对象调用方法
            nc1(25);
            Console.WriteLine("num1的值为:{0}",getNum());
            nc2(5);
            Console.WriteLine("num1的值为:{0}",getNum());
            Console.ReadKey();

        }
    }
}

三、多播委托(合并委托)

委托对象有一个非常有用的属性,那就是可以通过使用+运算符将多个对象分配给一个实例,同时还可以使用-运算符从委托中移除已分配的对象,当委托被调用时会依次调用列表中的委托。委托的这个属性被称为委托的多播,也可称为组播,利用委托的这个属性,您可以创建一个调用委托时要调用的方法列表。

注意:仅可合并类型相同的委托。

1.演示委托的多播,示例如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

delegate int NumberChanger(int n);//定义委托
namespace _005
{
    internal class Program
    {
        static int num = 10;
        public static int AddNum(int p)
        {
            num += p;
            return num;
        }
        public static int MultNum(int q)
        {
            num *= q;
            return num;
        }
        public static int getNum()
        {
            return num;
        }
        static void Main(string[] args)
        {
            //创建委托实例
            NumberChanger nc;
            NumberChanger nc1 = new NumberChanger(AddNum);
            NumberChanger nc2 = new NumberChanger(MultNum);
            nc = nc1;
            nc += nc2;
            //使用委托对象调用方法
            nc1(25);
            Console.WriteLine("num1的值为:{0}",getNum());
            nc2(5);
            Console.WriteLine("num1的值为:{0}",getNum());
            //调用多播
            nc(5);
            Console.WriteLine("num的值为:{0}",getNum());
            Console.ReadKey();

        }
    }
}

2.定义一个委托printString,我们使用这个委托来调用两个方法,第一个把字符串打印到控制台,第二个把字符串打印到文件:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;

namespace _006
{
    internal class Program
    {
        static FileStream fs;
        static StreamWriter sw;
        //委托声明
        public delegate void printString(string s);
        //该方法打印到控制台
        public static void WriteToSCreen(string str)
        {
            Console.WriteLine("The String is:{0}",str);
        }
        //该方法打印到文件
        public static void WriteToFile(string s)
        {
            fs = new FileStream("E:\\VS2022/message.txt", FileMode.Append, FileAccess.Write);
            sw = new StreamWriter(fs);
            sw.WriteLine(s);
            sw.Flush();
            sw.Close();
            fs.Close();
        }
        //该方法把委托作为参数,并使用它调用方法
        public static void sendString(printString ps)
        {
            ps("C#中文网");
        }
        static void Main(string[] args)
        {
            printString ps1 = new printString(WriteToSCreen);
            printString ps2 = new printString(WriteToFile);
            sendString(ps1);
            sendString(ps2);
            Console.ReadKey();
        }
    }
}

 

posted @   代号六零一  阅读(92)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
点击右上角即可分享
微信分享提示