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

C#委托本质探索 1、初试委托
// 初听委托,看字面的意思,我理解成:一我的委托另外一我的作某件事.
// 按照这个想法,设计了下面这个测试程序
// 领导委托下属作某件事.
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.测试();web

相关文章
相关标签/搜索