C#1所搭建的核心基础(一)-委托

.Net 专栏收录该内容
23 篇文章 0 订阅

委托在某种程度上提供了间接的方法。换言之,不需要直接指定一个行为,而是将这个行为用某种方式“包含”在一个对象中。这个对象可以象其他任何对象那样使用。在这个对象中,可以执行封装的行为。可以将委托类型看做只定义了一个方法的接口,将委托的实例看做实现了那个接口的一个对象。

委托的4个基本条件:

1)声明委托类型;

2)必须有一个方法包含了要执行的代码;

3)必须创建一个委托实例;

4)必须调用(invoke)委托实例。

 

1.声明委托类型

委托类型实际上只是参数类型的一个列表以及一个返回类型。它规定了类型的实例能表示的操作。以如下方式声明一个委托类型。

delegate void StringProcessor(string input);

这里的重点是StringProcessor其实是一个类型。它有方法,可以创建它的实例,并将引用传递给实例。

2.为委托实例的操作找到一个恰当的方法

找到(或者写)一个方法,它能做我们想做的事情,同时具有和委托类型相同的签名。

来看看以下StringProcessor实例的5个备选的方法签名:

    void PrintString(string x)

    void PrintInteger(int x)

    void PrintTwoString(string x, string y)

    int GetStringLength(string x)

    void PrintObject(object x)

我们来看,第一个方法完全符合要求,所以可以用它创建一个委托实例。第二个方法虽然也有一个参数但不是string类型,所以不兼容StringProcessor。第三个方法参数数量不匹配,所以不兼容。第四个方法有正确的参数列表,但是返回类型不是void(如果委托类型有返回类型,方法的返回类型也必须与之匹配)。第五个方法比较有趣,任何时候调用一个StringProcessor实例,都可以调用具有相同的参数的PrintObject方法,这是由于string是从object派生的。

3.创建委托实例

既然已经有了一个委托类型和一个有正确签名的方法,接着可以创建委托类型的一个实例,指定在调用委托实例时就执行该方法。至于具体用什么形式的表达式来创建委托实例,取决于操作使用实例方法还是静态方法。如果操作是静态方法,指定类型名称就可以了。如果操作时实例方法,就需要先创建类型(或者它的派生类型)的一个实例。这和平时调用方法是一样的。

假定PrintString是StaticMethods类型中的一个静态方法,在InstanceMethods类型中是一个实例方法。下面是创建一个StringProcessor实例的两个例子:

  StringProcessor proc1, proc2;

    proc1=new StringProcessor(StaticMethods.PrintString);

    InstanceMethods instance=new InstanceMethods();

    prce2=new StringProcessor(instance.PrintString);

4.调用委托实例

这是很简单的事情(仅对同步调用而言)-调用一个委托实例的方法就可以了。这个方法本身被称为Invoke。在委托类型中,这个方法以委托类型的形式出现,并且具有与委托类型的声明中所指定的相同的参数列表和返回类型。调用Invoke会执行委托实例的操作,向它传递在调用Invoke时指定的任何参数。让我们看下下图更好的理解:

 

下面来看一个完整的代码:

using System;//声明委托类型delegate void StringProcessor(string input);class Person{    string name;    public Person(string name) { this.name = name; }    //声明兼容的实例方法    public void Say(string message)    {        Console.WriteLine("{0}说:{1}", name, message);    }}class Background{    //声明兼容的静态方法    public static void Note(string note)    {        Console.WriteLine("({0})",note);    }}class SimpleDelegateUse{    static void Main()    {        Person jon = new Person("Jon");        Person Tom = new Person("Tom");        //创建3个委托实例        StringProcessor jonsVoice, tomsVoice, background;        jonsVoice = new StringProcessor(jon.Say);//实例方法        tomsVoice = new StringProcessor(Tom.Say);//实例方法        background = new StringProcessor(Background.Note);//静态方法        //调用委托实例        jonsVoice("Hello,World!");        tomsVoice.Invoke("欢迎观临我的博客!");        background("版权所有爱智旮旯!");        Console.Read();    }}

效果如图:

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值