C# 的 Delegate 的小心得

原创 2006年06月13日 13:52:00

C# 的 Delegate Type
Delegate 是一种函数指针,但与普通的函数指针相比,区别主要有三:
1) 一个 delegate object 一次可以搭载多个方法(methods)[译注1],而不是一次一个。当我们唤起一个搭载了多个方法(methods)的 delegate,所有方法以其“被搭载到 delegate object 的顺序”被依次唤起——稍候我们就来看看如何这样做。
2) 一个 delegate object 所搭载的方法(methods)并不需要属于同一个类别。一个 delegate object 所搭载的所有方法(methods)必须具有相同的原型和形式。然而,这些方法(methods)可以即有 static 也有 non-static,可以由一个或多个不同类别的成员组成。
3) 一个 delegate type 的声明在本质上是创建了一个新的 subtype instance,该 subtype 派生自 .NET library framework 的 abstract base classes Delegate 或 MulticastDelegate,它们提供一组 public methods 用以询访 delegate object 或其搭载的方法(methods)
声明 Delegate Type
一个 delegate type 的声明一般由四部分组成:(a) 访问级别;(b) 关键字 delegate;(c)返回型别,以及该 delegate type 所搭载之方法的声明形式(signature);(d) delegate type 的名称,被放置于返回型别和方法的声明形式(signature)之间。(以上摘自网上)
C#虽然取消了指针的这个概念,但还是可以使用指针的,只要声明这段代码是非安全的(Unsafe).C#为指针找到一个更为有用的引用类型----代表元,它在C#类型里是十分安全的.在声明代表元时,只要指定代表元指向的原型的类型,它不能有返回值,也不能带回输出类型的参数.代表元可以封装一个静态方法,也可以封装一个非静态方法.例子如下:

例1.


using System;
namespace Delegate1
{    
    
public class MyClass
    
{
        
public int InstanceMethod(int a,int b)
        
{
            Console.WriteLine(
"Call InstanceMethod ");
            Console.WriteLine(
"First parametre is {0},second parametre is {1}", a, b);
            
return 0;
        }

        
static public int StaticMethod()
        
{
            Console.WriteLine(
"Call Static Method");
            
return 0 ;
        }

    }

    
class Class1
    
{
        
//声明的代表元要与将代表的方法的参数序列保持一致
        private delegate int MyDelegate();
        
private delegate int MeDelegatePara(int a, int b);

        [STAThread]
        
static void Main(string[] args)
        
{
            MyClass p 
= new MyClass();
            
//将代表元指向静态方法 StaticMethod
            MyDelegate D = new MyDelegate( MyClass.StaticMethod);
            D();
            
//将代表元指向带参数的非静态方法 InstanceMethod
            MeDelegatePara d = new MeDelegatePara( p.InstanceMethod );
            d(
12);            
        }

    }

}


例1的缺点在于每次使用代表元时都要进行实例化,如果能从类中获取代表元就方便了很多,解决方法是将代表元的声明放入到高一级的名字空间

中,或者将代表元封装到一个类中,然后在相关类中以属性的形式绑定静态代表.我推荐使用类封装的方式,下面是改进后的类结构.

 



using System;
namespace Delegate1
{    
        
public class CDelegate
    
{
        
//声明的代表元与将代表的方法的参数的序列要保持一致
        public delegate int MyDelegate();
        
public delegate int MeDelegatePara(int a, int b);
    }

 
    
public class MyClass
    
{
        
          
public int InstanceMethod(int a,int b)
        
{
            Console.WriteLine(
"Call InstanceMethod ");
            Console.WriteLine(
"First parametre is {0},second parametre is {1}", a, b);
            
return 0;
        }

        
static public int StaticMethod()
        
{
            Console.WriteLine(
"Call Static Method");
            
return 0 ;
        }

        
        
public static CDelegate.MyDelegate  MyDelegate1
        
{
            
get 
            
{
                
return new CDelegate.MyDelegate(StaticMethod);
            }

        }

        
        
public  CDelegate.MeDelegatePara  MyDelegate2
        
{
            
get
            
{
                
return new CDelegate.MeDelegatePara(InstanceMethod);
            }
 
        }

    }

    

    
class Class1
    
{
        
        [STAThread]
        
static void Main(string[] args)
        
{
            MyClass p 
= new MyClass();
            
//将代表元指向静态方法 StaticMethod
            CDelegate.MyDelegate D = MyClass.MyDelegate1;
            D();
            
//将代表元指向带参数的非静态方法 InstanceMethod
            
            CDelegate.MeDelegatePara d 
= p.MyDelegate2   ;
            d(
12);            
            
        }

    }

}

C#的Delegate的小心得

C# 的 Delegate Type Delegate 是一种函数指针,但与普通的函数指针相比,区别主要有三: 1) 一个 delegate object 一次可以搭载多个方法(methods)[...
  • jojojojo2002
  • jojojojo2002
  • 2011年08月16日 16:10
  • 393

C#中的委托(delegate)用法简介

委托 delegate是只有一个函数的特殊的类委托对象的引用相当函数指针delegate 声明定义一种引用类型,该类型可用于将方法用特定的签名封装。委托实例封装静态方法或实例方法。委托大致类似于 C+...
  • keggle
  • keggle
  • 2005年11月17日 21:59
  • 32441

[C#-2] delegate和Delegate的区别

问题:delegate和Delegate的区别 分析: 相信很多朋友开发过程中都遇到过上述疑问,为了解开这个疑问,最近查阅了不少帖子,最终在msdn的官方文档找到了答案。 下面是delegate...
  • shishengshi
  • shishengshi
  • 2015年05月13日 17:15
  • 1884

终于会用c#中的delegate(委托)

一、开篇忏悔 对自己最拿手的编程语言C#,我想对你说声对不起,因为我到现在为止才明白c#中的delegate和event是怎么用的,惭愧那。好了,那今天就趁月黑风高的夜晚简单来谈谈delegate和e...
  • agilelau
  • agilelau
  • 2015年01月21日 09:35
  • 2257

C#中的delegate与event简单讲解

一、开篇忏悔 对自己最拿手的编程语言C#,我想对你说声对不起,因为我到现在为止才明白c#中的delegate和event是怎么用的,惭愧那。好了,那今天就趁月黑风高的夜晚简单来谈谈delegat...
  • liulong1567
  • liulong1567
  • 2015年08月30日 13:56
  • 625

C#中的委托(Delegate)和事件(Event)

分类:   把C#中的委托(Delegate)和事件(Event)放到现在讲是有目的的:给下次写的设计模式——观察者(Observer)有一个参考。     委托和事件应该是C#相较于...
  • haihsl123456789
  • haihsl123456789
  • 2015年03月13日 22:45
  • 1063

C#中Delegate的效率问题

昨天在研究C#的定时器的过程中,发现 Delegate的效率比直接调用一个函数的效率要低不少,今天研究了一下,的确如此。在网上查了一下http://www.cnblogs.com/sumtec/arc...
  • Nocky
  • Nocky
  • 2010年12月05日 17:28
  • 2942

CSharp_delegate简单讲解;

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace wor...
  • u011168154
  • u011168154
  • 2014年03月25日 09:44
  • 1211

快速理解C#高级概念(一) Delegate委托

做.NET开发很久,最近重新温习《C#高级编程》一书。发现很多曾经似懂非懂的问题,其实也是能够慢慢钻研慢慢理解的。 所以,打算开写《C#高级编程系列》博文。其中会借鉴《C#高级编程》一书的概念,也会...
  • chamychen
  • chamychen
  • 2012年12月19日 17:40
  • 24849

C#中委托(Delegate)

委托(Delegate)特别用于实现事件和回调方法。所有的委托(Delegate)都派生自 System.Delegate 类。 委托声明决定了可由该委托引用的方法: public d...
  • Silk2018
  • Silk2018
  • 2017年04月28日 17:40
  • 520
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C# 的 Delegate 的小心得
举报原因:
原因补充:

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