C#委托

10人阅读 评论(0) 收藏 举报
分类:

详情访问 Unity那些事儿happysneaker.com

一、委托的作用是什么?有什么优势值得我们来使用?

C# 委托实际上类似于C++中的函数指针,因为C#中不存在指针,所以用委托可以完成一些原来在C++中用函数指针完成的操作,例如传递一个类A的方法m给另一个类B的对象,使得类B的对象能够调用这个方法m。但与函数指针相比,委托有许多函数指针不具备的优点:

1、函数指针只能指向静态函数,而委托既可以引用静态函数,又可以引用非静态成员函数。在引用非静态成员函数时,委托不但保存了对此函数入口指针的引用,而且还保存了调用此函数的类实例的引用。
2、与函数指针相比,委托是面向对象、类型安全、可靠的受控(managed)对象。也就是说,runtime能够保证delegate指向一个有效的方法,无须担心delegate会指向无效地址或者越界地址。

二、使用委托有哪些需要注意的地方?

“代理”(delegate)(代表、委托):“委托”是类型安全的并且完全面向对象的。
(1)在C#中,所有的委托都是从System.Delegate类派生的(delegate是System.Delegate的别名)。
(2)委托隐含具有sealed属性,即不能用来派生新的类型。
(3)委托最大的作用就是为类的事件绑定事件处理程序。
(4)在通过委托调用函数前,必须先检查代理是否为空(null),若非空,才能调用函数。
(5)在委托实例中可以封装静态的方法也可以封装实例方法。
(6)在创建委托实例时,需要传递将要映射的方法或其他委托实例以指明委托将要封装的函数原型(.NET中称为方法签名:signature)。注意,如果映射的是静态方法,传递的参数应该是类名.方法名,如果映射的是实例方法,传递的参数应该是实例名.方法名。
(7)只有当两个委托实例所映射的方法以及该方法所属的对象都相同时,才认为它们是想等的(从函数地址考虑)。
(8)多个委托实例可以形成一个委托链,System.Delegate中定义了用来维护委托链的静态方法Combion,Remove,分别向委托链中添加委托实例和删除委托实例。
(9)委托三步曲:
a.生成自定义委托类:delegate int MyDelegate();
b.然后实例化委托类:MyDelegate d = new MyDelegate(MyClass.MyMethod);
c.最后通过实例对象调用方法:int ret = d();

三、如何使用委托?或者说如何定义一个委托?

实现一个委托是很简单的,通过以下3个步骤即可实现一个delegate:
1.声明一个delegate对象,它应当与你想要传递的方法具有相同的参数和返回值类型。
声明一个代理的例子:
public delegate int MyDelegate(string message);
2.创建delegate对象,并将你想要传递的函数作为参数传入。
创建代理对象的方法:
1). MyDelegate myDelegate = new MyDelegate(实例名.方法名);
2). MyDelegate myDelegate = new MyDelegate(类名.方法名);
注:如果需要代理的方法是一个static静态方法的话,采用第2种方式,否则采用第1种方式。
3.在要实现异步调用的地方,通过上一步创建的对象来调用方法。
可以直接使用代理调用代理所指向的方法:
myDelegate(向方法传递的参数);

其他见代码吧!!!!

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

//委托是一种特殊的类型,用于引用方法
//定义委托需要用 delegate 关键字
//委托可以把方法当作参数来传递
//委托可以使用 + - 运算符合并/解除绑定委托

namespace learning
{
    // 定义委托 - 访问修饰符 delegate 返回值类型 委托名(参数列表);相当于一种类型;
    public delegate void Something(string name);


    // 定义学生类
    public class Student {

        // 定义一个供老师调用的方法
        // 可以像普通类型一样当作方法参数传递
        public void Do(Something something) {
            // 但是方法最好不要写死了,所以可以定义一个委托
            // 可以像普通方法一样调用
            // 真正调用了方法 A - 方法回调
            something(name);
        }

        public Student(string name) {
            this.name = name;
        }
        private string name;
    }

    public class Teacher {
        public void Hungry() {
            Student s = new Student("老王");

            // 创建委托变量,括号里必须写一个已经实现了的方法
            Something a = new Something(A);
            Something b = new Something(B);
            Something c = a + b;

            // 委托对象可以使用 + - 来绑定/解除其他委托
            // 解除绑定
            c = c - a;
            s.Do(c);
        }

        // 参照委托的格式写
        public void A(string name) {
            Console.WriteLine("hello," + name);
        }
        public void B(string name) { Console.WriteLine(name + "paoshiquan"); }

    }

    class Program{

        public static void Main(string[] args)
        {
            Teacher t = new Teacher();
            t.Hungry();
        }
    }
}

这里写图片描述

查看评论

C#语法:委托与方法

1、了解委托(delegate) * 委托是一种全新的面向对象语言特性,运行于.NET平台     *基于委托开发事件驱动程序变得简单 *使用委托可以大大简化多线程编程的难度 2、理解委托 *委托(d...
  • superSmart_Dong
  • superSmart_Dong
  • 2017-06-01 13:36:54
  • 550

c#使用委托实现异步调用

异步编程是受公共语言运行库的许多领域(如远程处理、ASP.NET 和 Windows 窗体)支持的功能。异步编程是 .NET Framework 中的核心概念。使用 .NET 异步编程,在程序继续执行...
  • tangpeicheng
  • tangpeicheng
  • 2006-12-03 00:52:00
  • 4897

C#委托及各种写法

C# 委托及各种写法 委托是嘛? 委托是一个类型安全的对象,它指向程序中另一个以后会被调用的方法(或多个方法)。通俗的说,委托是一个可以引用方法的对象,当创建一个委托,也就创建一个引用方法的对象,进...
  • Blues1021
  • Blues1021
  • 2015-10-01 09:41:03
  • 866

c#多线程与委托

一:线程 在.net中提供了两种启动线程的方式,一种是不带参数的启动方式,另一种是带参数的启动的方式。 不带参数的启动方式  如果启动参数时无需其它额外的信息,可以使用ThreadStart来实...
  • wyw308
  • wyw308
  • 2012-03-06 16:15:45
  • 7417

CSharp中的委托

一、什么是委托 委托是一个类,它定义了方法的类型,使得可以将方法当作另外一个方法的参数来进行传递;调用委托的时候,委托包含的所有方法将被执行。 二、委托的定义 public delegate...
  • ForeverLove_1989
  • ForeverLove_1989
  • 2016-11-11 16:33:43
  • 2934

c# 委托与多线程

很多时候写windows程序都需要结合多线程,在.net中用如下得代码来创建并启动一个新的线程。public void ThreadProc();Thread thread = new Thread(...
  • lekelaier_msn
  • lekelaier_msn
  • 2007-06-24 09:51:00
  • 7159

C# 用委托有什么好处? 它起什么作用?

什么是委托   首先要知道什么是委托,用最通俗易懂的话来讲,你就可以把委托看成是用来执行方法(函数)的一个东西。如何使用委托   在使用委托的时候,你可以像对待一个类一样对待它。即先声明,再实例化。只...
  • qq_36215025
  • qq_36215025
  • 2017-04-10 09:55:03
  • 2162

C# 委托及各种写法

C# 委托及各种写法 委托是嘛? 委托是一个类型安全的对象,它指向程序中另一个以后会被调用的方法(或多个方法)。通俗的说,委托是一个可以引用方法的对象,当创建一个委托,也就创建一个引用方法的...
  • zhangxiao93
  • zhangxiao93
  • 2015-03-27 10:16:24
  • 1193

图解C#利用委托实现窗体传值

窗体传值的本质是类与类之间的传值         从第一个窗体向第二个窗体传值的方法有很多,可以利用第二个窗体的构造函数,也可以通过在第二个窗体的属性,也可以通过调用第二个窗体的方法等等来实现。但是...
  • songyi160
  • songyi160
  • 2016-04-10 23:05:20
  • 1314

如何在C#中的委托实现

先说下我为什么会用委托。在最开始想用委托的时候,其实我是拒绝的。为什么?因为结构看起来会有点乱啊,只是写个方法名,然后在括号写几个参数,但是实现却不在当前的对象中,给别人看的时候很不容易找诶。并且你一...
  • u014545772
  • u014545772
  • 2015-08-17 18:48:09
  • 707
    个人资料
    持之以恒
    等级:
    访问量: 5635
    积分: 348
    排名: 23万+
    最新评论