理解委托

委托是一种类型.委托像String,像Integer,像我们定义的Class一样,是一种类中.

委托是一种引用方法的类型.与委托的签名(参数和返回值)匹配的方法都可以分配给该委托.方法可以是静态方法,也可以是实例方法.

一旦为委托分配了方法,委托将与该方法具有相同的行为.委托方法的调用可以像其他方法一样,具有参数和返回值.

使用委托,可以将多个方法绑定到同一个委托变量.当调用此变量时,可以依此调用所绑定的方法.

注意:

在方法重载的上下文中,方法的签名不包括返回值,但是在委托的上下文中,签名包括参数和返回值.

委托的特点:

1.委托类似于方法指针.

2.委托允许将方法作为参数进行传递

3.委托可用于方法回调.

4.委托可以链接在一起.

5.方法不必与委托签名完全相同

6.可以将匿名函数作为参数传递.

注意,我们在上面提到,与委托签名匹配的方法都可以分配给该委托,而不是说与委托签名相同的方法都可以分配给该委托.

对于第5个特点,我们来看:委托中的协变和逆变

协变可以将委托与具有返回类型的方法一起使用,其中这些返回类型继承自委托的返回类型.

协变允许方法具有的派生返回类型比委托中定义的更多.

例:

public class Anmail
{    

}

public class Cat : Anmail
{
    public static Cat GetCat()
    {
        HttpContext.Current.Response.Write("Get a cat!<br/>");
        return new Cat();
    }
}
public class Dog : Anmail
{
    public static Dog GetDog()
    {
        HttpContext.Current.Response.Write("Get a dog!<br/>");
        return new Dog();
    }
}

public delegate Anmail GetAnmails();

protected void Page_Load(object sender, EventArgs e)
{
    GetAnmails get = new GetAnmails(Cat.GetCat);
    get += Dog.GetDog;
    get();
}

结果:

逆变可以将委托与具有某个类型的参数的方法一起使用.其中这些参数委托签名的基类型.

逆变允许方法具有的派生参数类型比委托类型中的更少.例:

public class Anmail
{
    public string Name { get; set; }
}

public class Cat : Anmail
{

}
public class Dog : Anmail
{

}

public delegate void GetAnmails(Anmail an);

someclass
{
    protected void Page_Load(object sender, EventArgs e)
    {
        Cat c = new Cat() { Name = "Cat" };
        Dog g = new Dog() { Name = "Dog" };

        GetAnmails get = new GetAnmails(GetName);
        get(c);
        get(g);
    }

    public void GetName(Anmail an)
    {
        Response.Write(an.Name + "<br/>");
    }
}

结果:

时间: 2024-11-07 15:19:11

理解委托的相关文章

编写高质量代码改善C#程序的157个建议——建议44:理解委托中的协变

建议44:理解委托中的协变 委托中的泛型变量天然是部分支持协变的.为什么是“部分支持协变”?看下面示例: class Program { public delegate T GetEmployeeHanlder<T>(string name); static void Main() { GetEmployeeHanlder<Employee> getAEmployee = GetAManager; Employee e = getAEmployee("Mike"

理解委托(delegate)及为什么要使用委托

理解委托(delegate)及为什么要使用委托 委托:是一种定义方法签名的类型. 当实例化委托时,您可以将其实例与任何具有兼容签名的方法相关联. 您可以通过委托实例调用方法. 上述为官方说法,理解起来比较难,举个生活中的例子: 某人有三子,让他们各自带一样东西出门,并带回一头猎物.上面一句话可以理解为父亲对儿子的委托:猎物 办法(工具 某工具)-->delegate 猎物(返回值) 带回猎物(委托名)(工具(参数类型) x)-->delegate int GetValue(int i)三个人执

没有代码也让你理解委托的作用

假如我们现在有个机器人,它有一个功能或者叫作方法,叫做dosomething(),然后我们在里面写实现代码,例如快过年了,就写拜年的方法 ,OK,然后过年的时候它就会向大家拜年了,现在到这里还是很正常的,但是新年过去了之后呢?拜年这个方法也就不用使用了, 这个时候我们就需要机器人干其他事情了,不可能买一个机器人就只是为了拜年吧?我现在想要机器人扫地,所以我们就需要修改 dosomething这个方法了,那怎么修改了,我想应该是修改代码之后再植入到机器人的芯片吧!但是这样的操作方法是违反了开封 闭

C#学习之初步理解委托、事件、匿名方法和Lambda

最经在学习LinqtoSql,然后扯到Lambda表达式,然后扯到匿名方法,然后扯到委托,最后扯到事件处理...后来发现对委托这个概念和事件处理这个过程理解得不是很清晰,遂得一下学习笔记.那里说得不对,请大家多多指教! 第一部分:理解委托 委托委托,顾名思义,就是类似于中间人的意思,有些事情你不做,委托别人去做,比如你想相亲,但你不想去主动约女孩子,那你可以交给媒婆去帮你约. 如果你学过C++,请把委托理解成函数指针,都是为了调用函数.函数指针可以调用符合该函数指针要求的函数.什么叫符合该函数指

使用委托中介租房理解委托与事件

委托和事件,.Net Framework中的应用非常广泛,然而,较好的理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像一道门槛儿,跨过去的,觉得太容易了,而没有过去的人每次见到委托事件就觉得心慌慌,浑身不自在. 我个人还是比较喜欢用面向对象的编程思想去理解逻辑程序,理解编程.下面就用委托中介公司租房子的示例理解使用委托流程: 1.定义委托和委托对象——租房人想要租房,但是没有房源,于是委托中介找房子:2.编写要委托的方法——租房中介有房源,可以找到房子:3.将要委托的方法传递给委托

[转] 把委托说透(2):深入理解委托

在上一篇随笔中我们通过示例逐步引入了委托,并比较了委托和接口.本文将重点剖析委托的实质. 委托在本质上仍然是一个类,我们用 delegate 关键字声明的所有委托都继承自System.MulticastDelegate.后者又是继承自System.Delegate类,System.Delegate类则继承自System.Object.委托既然是一个类,那么它就可以被定义在任何地方,即可以定义在类的内部,也可以定义在类的外部. 正如很多资料上所说的,委托是一种类型安全的函数回调机制, 它不仅能够调

C#委托的定义 以及使用方式详解,更简单的理解委托。

委托的声明及定义: 委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序具有更好的可扩展性.“ 这是百度上和许多教科书上都有的一个概念,但是初学这门编程语言的话,或者基础比较差的童鞋,看到这句话,肯定是一脸懵比,先不用着急,我们来慢慢通过代码去理解委托这个概念. 下面就在C#控制台上看代码把 相信刚学C#的朋友们应该很熟悉 using System;using Sy

通俗的理解委托(二)

在通俗理解委托(一)中,我们讲到了委托的定义,声明和使用,接下继续讲Action Func,多播委托 一:Action,Fun 这两个方法都是微软给我们封装好了的 Action Action是无返回值的泛型委托. Action 表示无参,无返回值的委托 Action<int,string> 表示有传入参数int,string无返回值的委托 Action<int,string,bool> 表示有传入参数int,string,bool无返回值的委托 Action<int,int,

理解委托类型

怕大家看了觉得乱七八糟不知道讲什么,先一句话描述下:如标题,在C#中委托是一种类型,如class一样也需要声明,定义,赋值,并与class在同一个层面 再介绍之前先看下相关内容的定义(我不是咬文嚼字,个人以为,有些东西的定义一定要没明白,不能含糊,不然只会是似懂非懂) delegate :(关键字->类型->引用类型[class,interface等等这些都是引用类型关键字]) delegate 是一种可用于封装命名或匿名方法的引用类型.(并不是所有的引用类型都是class) 是一种定义方法签

通过一个WPF实例进一步理解委托和事件

在前写过"浅谈C#中的委托"和"浅谈C#中的事件"两篇博客,内容有些抽象,似乎难以说明委托和事件的关系. 今天通过一个小程序来进一步说明二者的使用及联系. 首先新建一个WPF应用程序,取名TestDelegateAndEvent. 在.xmal中加入四个按钮,并添加Window_Loaded事件. 代码如下: <Window x:Class="TestDelegateAndEvent.MainWindow" xmlns="http