• 收藏

委托 —— 连载(一)

2017/9/10 13:42:25   易思捷科技


委托,是一个比较难以理解的概念。在.Net平台中,存在委托的概念,在Java领域则不存在委托概念,当然会有其实现的思路及方法,后续会讲到。

先看看微软对委托的定义:是一种引用类型,表示对具有特定参数列表和返回类型的方法的引用。 在实例化委托时,你可以将其实例与任何具有兼容签名和返回类型的方法相关联。 你可以通过委托实例调用方法。学习建议:建议微软技术请一定要看MSDN,或微软提供的技术文档,概念会更加精准一些。每个人对于编程的概念都会有自己的理解,我们建议看原版,这样您的思想可以更加接近于官方的思想,当然官网的思想有时太难于理解了,这时需要借助第三方文章进行入门,第三方的文章会带有一定的个人倾向,因此在掌握了基础之后还是一定要去理解官方的说法,形成自己的理解),此定义引用地址为:https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/delegates/index,有兴趣的朋友可以在此查看。

如果没看懂,请多看几遍。

特定参数列表和返回类型,这个就是指方法了,很明确,一个方法可以有特定参数,也可以有返回的类型,譬如:

public UserInfo getInfo(int UserID)

这就是一个方法了,通过字面可以很容易理解,通过指定用户的编号,来获取用户信息。

继续看,何为引用类型?

这个概念比较难以解释,所以,很多文章在谈到委托时,都会引用指针的概念(指针则是更加难以控制的东西,在C/C++中常见,但其难以控制,容易引发更大的问题,因此在.Net及Java这种高级语言中取消了这个概念),因为其极其相似,更可以说是一种替代。简单的说明一下,引用类型,则是在定义一个类型并在内存分配了存储地址后,提供的是这个地址,而非值。这样意味着,您定义一个变量为引用类型,系统不会再创建此变量的副本,而是直接引用到了原始位置,获取的也是原始值。要真正理解这个概念,建议先去看看堆栈。

如果以上两个概念可以理解,那么委托就基本上明白了,委托实际就是定义了一个引用的方法,通常我们是定义一个引用的变量,委托则是引用的方法。知道了定义,那该如何使用呢?委托解决了我们编码中的什么问题呢?

看下蓝色字体,官方定义说明了使用的方法,定义委托之后,都可以讲相同返回类型的方法进行关联,在委托实例中调用,这就是委托。

先来理解一下官方的例子:有关此示例可参见:https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/delegate

// Declare delegate -- defines required signature:
delegate double MathAction(double num);
class DelegateTest{    // Regular method that matches signature:
    static double Double(double input)    
{        return input * 2;
    }    
static void Main()    {        // Instantiate delegate with named method:
        MathAction ma = Double;        // Invoke delegate ma:
        double multByTwo = ma(4.5);
        Console.WriteLine("multByTwo: {0}", multByTwo);        // Instantiate delegate with anonymous method:
        MathAction ma2 = delegate(double input)
        {            return input * input;
        };        double square = ma2(5);
        Console.WriteLine("square: {0}", square);        // Instantiate delegate with lambda expression
        MathAction ma3 = s => s * s * s;        double cube = ma3(4.375);

        Console.WriteLine("cube: {0}", cube);
    }    // Output:
    // multByTwo: 9
    // square: 25
    // cube: 83.740234375}

这个例子中,介绍了三种方法:

第一种,直接引用了一个方法:Double,这与前面所讲一致,委托,就是定义一个引用方法;

第二种,采用的是匿名方法实现委托;

第三种,使用了Lambda表达式,后续再讲解Lambda表达式会详解;

坦率的讲,这就是官方文档的问题,只告诉你概念,及用法,但却不告诉你什么时候使用,在何种应用场景下使用,让人根本无法理解这个技术的特点。

学习建议:对于初学者一定要明白一个道理,任何一项技术,绝不是为了好玩而出现的,一定是因为在某种应用场景下,或者特定的环境下遇到了不可解决的问题,或者解决问题的成本居高不下时,那些大牛们才会针对此问题提出一种解决方案,成熟时候形成一种新的技术,所以,在学习初期,无论您是学习并掌握哪种技术,一定要明白这个技术是要解决什么问题得,至少要明白在何种应用场景下去使用它,否则,单纯的理解,在不久的将来,这个东西对您而言如同没学,甚至概念都会忘掉。

委托最典型的应用就是在winform中的窗体数据传递,如下图:

在我们使用winform程序中,经常会有这样的应用场景,在操作过程中,会弹出一个模式窗口,用于接收用户的数据信息,并将输入的信息返回给调用的窗口。

就是在A窗口中,实例化了B窗口,并打开了B,然后再B中接收用户的信息,譬如:上图所示的类别名称,然后将用户输入的名称传递给A,让A实现具体的类别创建工作。B的作用就是为了接收用户的输入。

对于有经验的人员来讲,可能第一个想到的就是回调,第二个想到的是事件,但我们还可以用更简单的方法委托来实现。实际回调与事件都与委托相关,后续我们还会讲到这两个概念。

在B中定义一个委托,A中定义B的时候,给B传递一个引用方法,在B中获取到用户的信息后,将此信息通过委托给了A中的变量。这样就完成了我们所说的内容。

有关此案例,可以参考soukey采摘开源产品,里面在处理此类问题时,采用的都是委托。



版权声明:如无特别说明,均为“易思捷IT训练营”原创,如转载请著名出处!

阅读:223  评论:0  
  • 评论