C#中的委托

原创 2004年09月14日 16:35:00

C#中的委托

 

引言:C#中的委托着实让我迷惑(我是位初学者),在不同的C#书籍中,还译为代理、委派等,经反复查阅资料和自己动手编写代码,才稍稍理出点头绪。

 

C#中的委托类似于CC++中的函数指针,但两者有本质区别:CC++不是类型安全的,但C#中的委托是面向对象的,而且是类型安全的。<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

从技术角度来讲,委托是一个引用类型,用来封装带有特定签名和返回类型的方法。

1、声明委托

C#使用关键字delegate来声明委托类型:

[访问修饰符] delegate 结果类型 委托标识符([形参列表]);

委托类型可以在声明类的任何地方声明。

2、实例化委托

委托使用new运算符来实例化。

新创建的委托实例所引用的对象为以下之一:

⑴委托创建表达式中引用的静态方法

⑵委托创建表达式中引用的目标对象(此对象不能为null)和实例方法

⑶另一个委托

例如:

 

delegate void MyDelegate(int x);

     class MyClass

     {

         public static void Method1(int i)

         {

         }

         public void Method2(int i)

         {

         }

     }

    

     class TestClass

     {

         static void <?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />Main()

         {

              //静态方法

              MyDelegate delegate1=new MyDelegate(MyClass.Method1);

              

              //实例方法

              TestClass class1=new MyClass();

              MyDelegate delegate2=new MyDelegate(MyClass.Method2);

              

              //另一个委托

              MyDelegate delegate3=new MyDelegate(delegate2);

         }

    }

3、使用委托

通过委托对象的名称及放入括号的要传递给委托的参数来调用委托对象。调用委托时,调用表达式的主表达式必须是委托类型的值

看一个例子:

namespace delegateTest

{

   public delegate int mydelegateTest(int i,int j);

   class calculate

   {

        public static int add(int i,int j)

        {

             return i+j;

        }

        public static int minus(int i,int j)

        {

             return i-j;

        }

   }

   class delegateapp

   {

       static void Main(string[] args)

        {

             mydelegateTest d0=new mydelegateTest(calculate.add);//声明一个mydelegateTest的实例d0,并用calculate.add对其进行初始化,实际上就是将委托与方法链接起来。

             int i=d0(99,1);//开始调用委托,就像是使用静态成员方法calculate.add(int i,int j)一样。

             System.Console.WriteLine("这是运行add的结果:{0}",i);

             mydelegateTest d1=new mydelegateTest(calculate.minus);

             int j=d1(100,99);

             System.Console.WriteLine("这是运行minus的结果:{0}",j);

             System.Console.ReadLine();

        }

   }

}

C#中的委托和事件

C#中的委托和事件   前言   委托和事件在.NET框架中应用的很广泛,但是楼主因为知识尚浅,用到的不多,但是听前辈们说,这个委托和事件就像两座大山,只要翻过了这...
  • shanyongxu
  • shanyongxu
  • 2016年02月25日 17:09
  • 1105

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

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

C#中的异步委托

异步委托默认情况下,执行一个委托实例操作是同步的,但委托实例同样可以使用成员函数BeginInvoke()进行异步回调。 BeginInvoke()除了接收原有委托签名的参数之外,参数表尾部额外带有两...
  • u011152627
  • u011152627
  • 2016年07月27日 11:30
  • 310

CSharp中的委托

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

C#中利用委托创建窗体单向通信

C#中利用委托创建窗体单向通信
  • J_Kang
  • J_Kang
  • 2016年05月06日 11:25
  • 1413

快速理解C#中的委托与事件

以下内容只是个人理解,仅供参考。 什么是委托? 先看最简单的委托例子: namespace DelegateTest { public delegate void MessageDele...
  • Wiiix
  • Wiiix
  • 2016年05月20日 20:02
  • 5317

C#的委托 VS C++的指针

在学习C#时,对于其中的委托一直没能好好的理解。现在学习C++,又遇到了同样是难点的指针。都说两者有一定的相似之处,现在,我们就来谈谈他们的区别和联系吧!...
  • u013033838
  • u013033838
  • 2015年03月08日 21:22
  • 997

【C#】C#委托和事件的实例讲解

using System; namespace delegate_event { // 定义一个猫类 class Cat { // 定义一个名字字段 private string na...
  • sinat_20559947
  • sinat_20559947
  • 2015年07月22日 15:33
  • 3965

C#使用委托调用主线程上的控件

摘自其他人博客,自己试过确实解决问题。(如在自己定义的线程里面给textbox赋值) 由于Windows窗体控件本质上不是线程安全的。因此如果有两个或多个线程适度操作某一控件的状态(set valu...
  • wyvbboy
  • wyvbboy
  • 2016年01月26日 15:23
  • 3904

C#多线程中使用代理(委托)

net2.0以后,微软加强了控件的安全机制,不允许跨线程操作。     如果想跨线程操作控件的话要使用委托。   以前有过相关学习,后来既不清了,看了一遍之前写的文章,觉得太烂了,重新总结一下:...
  • Baple
  • Baple
  • 2014年03月19日 12:43
  • 3224
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C#中的委托
举报原因:
原因补充:

(最多只允许输入30个字)