c#重要特性之一委托

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c#重要特性之一委托相关的知识,希望对你有一定的参考价值。

委托的构成必须满足的4个条件:

  1. 声明委托类型;
  2. 必须有一个方法包含了要执行的代码;
  3. 必须创建一个委托实例;
  4. 必须调用(invoke)委托实例

委托包装的方法需要满足以下条件

  • 方法的签名必须与委托一致,方法签名包括参数的个数、类型和顺序;
  • 方法的返回类型要和委托一致,注意,方法的返回类型不属于方法签名的一部分

示例一:

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

namespace ConsoleAppDelegate
{
    class Program
    {
        //1、使用delegate关键字来定义一个委托类型
        delegate void MyDelegate(int parm1, int parm2);

        static void Main(string[] args)
        {
            //2、声明委托变量d
            MyDelegate d;
            //3、实例化委托类型,传递的方法也可以为静态方法,这里传递的是实例方法
            d = new MyDelegate(new Program().Add);
            //4、委托类型作为参数传递给另一个方法
            MyMethod(d);
            Console.Read();
        }
        //该方法的定义必须与委托定义相同,即返回类型void,两个int类型的参数
        void Add(int parm1,int parm2)
        {
            int sum = parm1 + parm2;
            Console.WriteLine("两个数的和为:"+sum);
        }
        //方法的参数是委托类型
        private static void MyMethod(MyDelegate mydelegate)
        {
            //5、在方法中调用委托
            //mydelegate.Invoke(1, 2);
            mydelegate.Invoke(1, 2);
        }
    }
}

 示例二:

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

namespace ConsoleAppDelegateGreeting
{
    class Program
    {

        static void Main(string[] args)
        {
            Program p = new Program();
            p.Greeting("苍井空",p.ChineseGreeting);
            p.Greeting("Tommy Li", p.EnglishGreeting);
            Console.Read();
        }
        //定义委托类型
        public delegate void GreetingDelegate(string name);

        //有了委托之后可以像下面这样实现打招呼方法
        public void Greeting(string name,GreetingDelegate callback)
        {
            //调用委托
            callback(name);
        }
        //美国人打招呼方法
        public void EnglishGreeting(string name)
        {
            Console.WriteLine("Hello, " + name);
        }
        //中国人打招呼方法
        public void ChineseGreeting(string name)
        {
            Console.WriteLine("你好, " + name);
        }
    }
}

总结:

  • 委托封装了包含特殊返回类型和一组参数的行为,类似包含单一方法的接口;
  • 委托类型声明中所描述的类型签名决定了哪个方法可用于创建委托实例,同时决定了调用的签名;
  • 为了创建委托实例,需要一个方法以及(对于实例方法来说)调用方法的目标;
  • 委托实例是不易变的;
  • 每个委托实例都包含一个调用列表---一个操作列表;
  • 委托实例可以合并到一起,也可以从一个委托实例中删除另一个;
  • 事件不是委托实例-----只是成对的add/remove方法(类似于属性的取值方法/赋值方法)

 

以上是关于c#重要特性之一委托的主要内容,如果未能解决你的问题,请参考以下文章

C# 1的核心基础之一——委托

对“xxx”类型的已垃圾回收委托进行了回调。这可能会导致应用程序崩溃损坏和数据丢失。向非托管代码传递委托时,托管应用程序必须让这些委托保持活动状态,直到确信不会再次调用它们。 错误解决一例。(代码片段

C# 1.0 特性之异步委托(APAPM)

C#网络编程一:C#网络编程常用特性

C#中的委托解析

C#基础——事件初步