委托学习(1)

1. 委托

1. 我们都知道指针在C/C++中的使用是非常灵活具有以下几个优点:

  a.为函数提供修改调用变元的灵活手段;
  b.支持C 动态分配子程序
  c.可以改善某些子程序的效率
  >>在数据传递时,如果数据块较大(比如说数据缓冲区或比较大的结构),这时就可以使用指针传递地址而不是实际数据,即提高传输速度,又节省大量内存。
  d.为动态数据结构(如二叉树、链表)提供支持

虽然C#不支持指针但是委托很好的解决了这个难题。鞋面是委托与指针的区别:

  a,函数指针事不安全的类型,而委托是完全面向对象和类型安全的。

b,函数指针大都指向成员函数,而委托同时封装了对象实例和方法。

  委托实例一个有趣的现象是:它不知道也不关心她所封装的方法所属的类,它所关心的仅限于这些方法必须与委托类型兼容。因此,委托非常适用于"匿名"调用。

 1.1 声明委托

  

  使用关键字 delegate 来声明委托,形式如下:

  【特性】【修饰符】delegate【返回值类型】 【委托名】(【形参列表】)

  【特性】,【修饰符】:可选

【返回值类型】,关键字delegate,【委托名】:必须的

  【形参列表】:可选

    C#的委托名是一中标识符,命名规则:一般采用首字母大写。

    ● 它们具有相同的签名,参数个数,类型,顺序,修饰符完全相同。

  ● 返回值类型也是相同的。

    委托定义了一种引用类型,封装了对方法的引用,委托定义了签名和返回值型。

  例如:我们定义一返回值为Int32 参数列表为Object和Int32类型的。

  delegate Int32 MyDelegate(Object val,Int32 i);

  下面的方法是与MyDelegate兼容的 

  Int32 MyMethod(Object val , Int32  i); 

  对于委托而言:即使它们具有形同的参数列表和返回值类型,仍被认为是两个不同的委托。委托原则:名称等效而不是结构等效。

1.2 委托实例

  【委托名】 【委托实例名】= new 【委托名】(【参数列表】) ;

  其中【参数】必须是方法名或委托名(说白了还是方法),可以是静态的方法但是必须与委托类型兼容。如果参数是委托名,则它标识为其吹安徽建副本的委托实例。

1.3 使用委托

 

 Delegate.cs

  

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Delegate
{
    //声明委托
    public delegate int PrintMessageHandler(string message);

    //定义测试类
    public class Test
    {
        public static int Print(string mesg)
        {
            Console.WriteLine(mesg);
            return mesg.Length;
        }

        //使用委托实例做参数(函数作为参数)
        public static void PrintTitle(PrintMessageHandler prn)
        {
            prn("===========================");
            prn("     委托实例作为参数      ");
            prn("===========================");
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Test test = new Test();

            //实例一委托传参的对象(我感觉其实类似于C++的函数指针)
            PrintMessageHandler prn = new PrintMessageHandler(Test.Print);
            string msg = "委托实例参数";
            //msg = Console.ReadLine().ToString();
            int len = prn(msg);
            //int len1 = Test.Print(msg);
            Console.WriteLine("参数长度:" + len);
            //Console.WriteLine("参数长度:" + len1);

            Test.PrintTitle(prn);
            Console.ReadLine();
        }
    }
}

运行结果:

委托学习(1)

时间: 2024-11-11 10:53:01

委托学习(1)的相关文章

C# 委托学习笔记

接触委托 代理 delegate很久啦.除了看API,Kotoba也给我讲了 .说到委托,拿下面这个小例子比较好.(14年6月26花花给我的练习) 实例:写一个方法A,定义个方法B(打印hello),和方法C(打印world),其中我只允许调用方法A.实现,1秒后打印出hello,3秒后打印出world. 先说一下回调的好处: 在开发中我们有些代码呢,是很固定的,但又有一些东西很灵活很容易发生变动.先假设B和C都不是我们自己写的,而是其他人已经写好的其他方法,所以我们在无BUG的情况下,尽可能不

委托学习(2)

1.1 委托链 委托是多路广播的,因此可以将两个或多个非委托实例组合到一起,构成委托链.所谓委托链就是被委托的的方法用链表的形式连接在一起. 关于委托链的形成在C#中使用二元+和+=运算符来来组合委托,使用-或-=运算符来从委托链中移除一个委托. 当组合连个委托或者从一个委托链中移除一个委托实例时,将产生一个新的委托.该委托有自己的调用列表,被组合或移除的委托的调用列表将保持不变. 如果一个委托实例的列表中包含多个方法,那么调用这样的委托实例时将会按照调用列表的顺序执行方法.如果参数含引用或输出

委托学习(3)

1.1 匿名方法 在上次我们提到,创建委托实例时都必须明确指定使用的方法.C# 2.0引入了匿名方法,及允许与委托相关联的的代码块以内联方式写入使用委托的位置,从而方便地将代码块直接"绑定"到委托实例.使用匿名方法就可以降代码块直接作为委托的参数,而不需要先定义方法,再将方法作为参数来创建委托.匿名方法还能够对包含它的函数成员的拒不状态进行共享访问,如果要使用具名方法来实现同样的状态共享,就需要将局部变量提升为一个辅助类的字段. 匿名方法由delegate,可选的参数表和包含{}内的代

委托学习笔记后续:泛型委托及委托中所涉及到匿名方法、Lambda表达式

引言: 最初学习c#时,感觉委托.事件这块很难,其中在学习的过程中还写了一篇学习笔记:委托.事件学习笔记.今天重新温故委托.事件,并且把最近学习到和委托相关的匿名方法.Lambda表达式及泛型委托记录下来,以备复习使用. 委托: 日常工作中,常常见到委托用在具体的项目中.而且委托使用起来相对来说也是非常简单的,下面列举一个委托实例用以说明如何使用委托,代码如下: class Program { public delegate int CalculateDelegate(int x, int y)

泛型委托学习进程

首先先回顾委托的使用过程步骤: 委托使用总结: (1)     委托声明(定义一个函数原型:返回值+参数类型和个数)注:在类的外部--中介(房产中介商) (2)     根据委托定义"具体"的方法------房源   注:在类中定义方法 (3)     创建委托对象,关联"具体方法"---中介商拥有房源  注意:在主函数中操作 第一种方式:使用new初始化.第二种方式:直接给委托变量赋值方法 (4)     通过委托去调用方法(而不是直接调用方法)------中介带

JS和JQuery中的事件委托 学习笔记

事件委托其实并不是一个很高级的技巧,比如在一个页面里面,当只存在两个按钮的时候,可能你给按钮添加监听是这样的:(本文不考虑浏览器兼容性,关于事件的兼容性可参考前面的学习笔记) <div id="container"> <button id="btn1">按钮1</button> <button id="btn2">按钮2</button> </div> var btn1 =

异步无阻塞委托 学习1

using System;using System.Collections.Generic;using System.Linq;using System.Runtime.Remoting.Messaging;using System.Threading;using System.Web;using System.Web.UI;using System.Web.UI.WebControls; namespace WebApplication21{ public partial class WebF

C#委托学习

..>前言 无力吐槽今天的天气,特别冷,喝杯奶茶继续写点东西吧! 委托 委托是一种引用类型,类似于C语言中的指针类型,不过这个“指针”一定是指向某种类型的函数的. 对象也是引用类型,注意引用类型与值类型的区别.例如:写出以下程序的运行结果. 1 class A 2 { 3 public int x; 4 } 5 class Program 6 { 7 static void Main(string[] args) 8 { 9 A a = new A(); 10 a.x = 5; 11 A b =

委托学习中

1.基本委托 class delete { delegate double MyDelegate(double message); public static double Ordinary(double price) { double price1 = 0.95 * price; Console.WriteLine("Ordinary Price : " + price1); return price1; } public static double Favourable(doubl