C#委托本质探索 一、初试委托

// 初听委托,看字面的意思,我理解成:一个人委托另一个人做某件事.
// 按照这个想法,设计了下面这个测试程序
// 领导委托下属做某件事.

using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;

namespace ConsoleApplication1
{
    public class FirstTest
    {
        public static void 测试()
        {
            领导 朱哥 = new 领导();

            朱哥.下达任务();
        }
    }

    delegate string 委托任务(string 任务内容);

    class 领导
    {
        下属 小薇 = new 下属();

        public void 下达任务()
        {
            string 执行结果;

            委托任务 一个委托任务;
            一个委托任务 = new 委托任务(小薇.本职工作);
            //一个委托任务 = 小薇.本职工作;

            执行结果 = 一个委托任务("运营魔兽世界");
            Console.WriteLine(执行结果);
            执行结果 = 一个委托任务("处理业内竞争");
            Console.WriteLine(执行结果);

            //这样不是更直接
            执行结果 = 小薇.本职工作("运营魔兽世界");
            Console.WriteLine(执行结果);
            执行结果 = 小薇.本职工作("处理业内竞争");
            Console.WriteLine(执行结果);

            //来点邪性的,用Type.InvokeMember
            object 某下属 = typeof(下属).InvokeMember(null, BindingFlags.CreateInstance, null, null, null);
            执行结果 = (string)typeof(下属).InvokeMember("本职工作", BindingFlags.InvokeMethod, null, 某下属, new object[] { "运营魔兽世界" });
            Console.WriteLine(执行结果);
        }

    }

    class 下属
    {
        public string 本职工作(string 任务内容)
        {
            StringBuilder 工作内容 = new StringBuilder();
            if (任务内容 == "运营魔兽世界")
            {
                工作内容.AppendLine("安排设备采购");
                工作内容.AppendLine("招募客服,上岗培训");
                工作内容.AppendLine("广告宣传");
                工作内容.AppendLine("游戏上市");
                工作内容.AppendLine("推出活动");
                工作内容.AppendLine("…………");
            }
            else if (任务内容 == "处理业内竞争")
            {
                工作内容.AppendLine("调查竞争对手");
                工作内容.AppendLine("展开斗争");
            }
            return 工作内容.ToString();
        }

    }
    // 从这个例子可以看出来,委托别人做某件事可以有很多种方法,而用委托技术是最扯淡的.
    // 这能否说明,我对委托技术的理解进入了一个误区.委托技术根本不是这样用的.
    // 从编程角度讲,委托技术绝对不是为了实现一个类让另一个类执行某个方法而诞生的技术.
    // 想实现那样的功能,只需要实例化另一个类,调用实例的方法就实现目的了.

    // 委托技术的本质是什么?
    // 观察定义语句 delegate string 委托任务(string 任务内容);
    // 从级别上看delegate与class是同级的.
    // 如果把后面的 string 委托任务(string 任务内容)看成一个对象的实体
    // delegate 是不是可以理解成class这样的对象定义符?
    // 而这个定义符专门就是用来定义一个方法用的.

    // 继续观察,"委托任务"的实例化过程
    // 一个委托任务 = new 委托任务(小薇.本职工作);
    // 仔细分析:
    // 首先,在"一个委托任务"被实例化前,"下属"类已然被实例化.
    // "小薇.本职工作"是一个地址指针,指向"下属"类的实例"小薇"的方法"本职工作".
    // "小薇.本职工作"指针遵循"委托任务"类的结构,实例化为一个新的方法指针,并赋值给"一个委托任务"变量.
    // 这个赋值过程可以变成这样: 一个委托任务 = 小薇.本职工作;
    // 对比类的实例化过程 MyClass aClass = new MyClass(Type instance);
    // delegate定义的类型的构造函数需要传入方法实例参数,参数类型为delegate定义的类型.

    // 回头再看类型定义部分 delegate string 委托任务(string 任务内容);
    // 这里只有一行声明,没有内容,很抽象.没错,这不就是个没有内容的抽象类定义嘛!

    // 总结,delegate本质就是:一个抽象方法的类型定义,实例化抽象方法时需要传入实例指针.
    // 委托这个词远离我,我有语义依赖,看到委托这个词头晕.顾名思义!看到委托这个词我明不了在.NET里的意.

    // 为什么delegate定义和实例化时表现与class存在区别,先不管他,那是更深层事.总之是这样的一个用法.
    // *参照string其实是System.String的转义,delegate一样using delegate = System.Delegate;
    // *System.Delegate先不研究,准备研究他的用法.

}

// 测试代码

            FirstTest.测试();

原文地址:https://www.cnblogs.com/ww960122/p/1903950.html