首页 > 编程语言 >C# 委托(delegate)

C# 委托(delegate)

时间:2023-03-07 13:22:25浏览次数:56  
标签:Console 委托 C# int delegate WriteLine Calc

C# 委托(delegate)

委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序具有更好的可扩展性。C# 中的委托(Delegate)类似于 C 或 C++ 中函数的指针。本文主要介绍C# 委托(delegate)。

1、委托

委托(delegate)特别用于实现事件和回调方法。所有的委托(Delegate)都派生自 System.Delegate 类。委托是一种引用类型,虽然在定义委托时与方法有些相似,但不能将其称为方法。委托的使用包括定义声明委托、实例化委托以及调用委托。委托在使用时遵循三步走的原则,即定义声明委托、实例化委托以及调用委托。

2、委托声明

委托声明定义委托能引用的的方法,委托声明定义了引用的方法的参数和返回值的类型。

语法:

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

例如,

public delegate int MyDelegate (string str);

注意:上面示例代码中,int定义的是引用方法的返回值类型,string str定义的是引用方法的参数

3、委托的使用

委托声明之后,声明的委托类型使用时,也需要使用new关键字来创建对象,并且可以与一个方法关联,

例如,

public delegate void FileDelegate(string str);
FileDelegate fileRead = new FileDelegate(ReadFile);
FileDelegate fileWrite = new FileDelegate(WriteFile);

例如,

using System;
delegate int Calc(int a,int b);
namespace MyDelegate
{
   class DelegateDemo
   {
      public static int Add(int a,int b)
      {
         return a+b;
      }
      public static int Minus(int a,int b)
      {
         return a-b;
      }
      public static int Mult(int a,int b)
      {
         return a*b;
      }
      static void Main(string[] args)
      {
         // 创建委托实例
         Calc c1 = new Calc(Add);
         Calc c2 = new Calc(Minus);
         Calc c3 = new Calc(Mult);
         // 使用委托对象调用方法
         Console.WriteLine("{0}", c1(8,2));
         Console.WriteLine("{0}", c2(8,2));
         Console.WriteLine("{0}", c3(8,2));
      }
   }
}

4、委托的多播

多播委托是指在一个委托中注册多个方法,在注册方法时可以在委托中使用加号运算符或者减号运算符来实现添加或撤销方法。创建一个委托被调用时要调用的方法的调用列表。这被称为委托的 多播(multicasting),也叫组播。

例如,

using System;
delegate int Calc(int a,int b);
namespace MyDelegate
{
   class DelegateDemo
   {
      public static int Add(int a,int b)
      {
         Console.WriteLine(a + b);
         return a+b;
      }
      public static int Minus(int a,int b)
      {
         Console.WriteLine(a - b);
         return a-b;
      }
      public static int Mult(int a,int b)
      {
         Console.WriteLine(a * b);
         return a*b;
      }
      static void Main(string[] args)
      {
         // 创建委托实例
         Calc c;
         Calc c1 = new Calc(Add);
         Calc c2 = new Calc(Minus);
         Calc c3 = new Calc(Mult);
         c = c1;
         c += c2;
         c += c3;
         // 使用委托对象调用方法
         Console.WriteLine("{0}", c(8,2));//三个方法都执行了,返回的是最一个值
      }
   }
}

5、匿名委托

匿名委托是指使用匿名方法注册在委托上,实际上是在委托中通过定义代码块来实现委托的作用。

语法:

委托名 委托对象 = delegate
{
    //代码块
};

例如,

using System;
delegate int Calc(int a,int b);
namespace MyDelegate
{
   class DelegateDemo
   {
     /* public static int Add(int a,int b)
      {
         Console.WriteLine(a + b);
         return a+b;
      }
      public static int Minus(int a,int b)
      {
         Console.WriteLine(a - b);
         return a-b;
      }
      public static int Mult(int a,int b)
      {
         Console.WriteLine(a * b);
         return a*b;
      }*/
      static void Main(string[] args)
      {
         // 创建委托实例
         Calc c;
         Calc c1 = delegate(int a,int b)
        {
            Console.WriteLine(a + b);
            return a+b;
        };
         Calc c2 = delegate(int a,int b)
        {
            Console.WriteLine(a - b);
            return a-b;
        };
         Calc c3 = delegate(int a,int b)
        {
            Console.WriteLine(a * b);
            return a*b;
        };
         c = c1;
         c += c2;
         c += c3;
         // 使用委托对象调用方法
         Console.WriteLine("{0}", c(4,2));//多播三个方法都执行了,返回的是最一个值
      }
   }
}

标签:Console,委托,C#,int,delegate,WriteLine,Calc
From: https://www.cnblogs.com/GaoUpUp/p/17187793.html

相关文章

  • RocketMQ高可用机制
    RocketMQ高可用机制集群部署模式1.单master模式2.多master模式配置配置文件broker.properties的brokerClusterName需要保持一致brokerId需要为0,0代表为0优缺点......
  • C# break和continue关键字
    C#break和continue关键字break跳出最里层的循环,并且继续执行该循环下面的语句。continue适用于任何循环控制结构中。作用是让程序立刻跳转到下一次循环的迭代......
  • C# 方法
    C#方法在C#的语言中,方法相当于其它语言中的函数,但是它与传统的函数也有着明确的不同:在结构化的语言中,整个程序是由一个个函数组成的;但是在面向对象的语言里,整个......
  • C# 方法 重载
    C#方法重载在C#的语言中,方法相当于其它语言中的函数,但是它与传统的函数也有着明确的不同:在结构化的语言中,整个程序是由一个个函数组成的;但是在面向对象的语言......
  • C# 方法 参数
    C#方法参数在C#的语言中,方法相当于其它语言中的函数,但是它与传统的函数也有着明确的不同:在结构化的语言中,整个程序是由一个个函数组成的;但是在面向对象的语言里......
  • C# 作用域
    C#作用域在C#里,作用域是由花括号的位置决定的。C#用一对大括号作为语句块的范围,称为作用域,在作用域里定义的变量,只有在该作用域结束之前才可使用。本文主要介......
  • C# 面向对象编程(OOP)
    C#面向对象编程(OOP)C#是面向对象的编程语言,对象就是面向对象程序设计的核心。所谓对象就是真实世界中的实体,对象与实体是一一对应的,也就是说现实世界中每一个......
  • CMake基本使用
    1、cmakecmake是用于构建、测试和软件打包的跨平台工具2、优势避免硬编码路径可在多台计算机上构建一个包可做持续集成支持不同操作系统支持多个编译器可使用IDE......
  • C# 递归
    C#递归递归就是把规模大的问题转化为规模小的相似的子问题来解决。在函数实现时,因为解决大问题的方法和解决小问题的方法往往是同一个方法,所以就产生了函数调用......
  • C# 类class 字段和属性
    C#类class字段和属性C#是面向对象的编程语言,对象就是面向对象程序设计的核心。所谓对象就是真实世界中的实体,对象与实体是一一对应的,也就是说现实世界中每一个......