C#中的委托

浅析C#中的委托 委托是寻址方法的.NET版本。在C++中,函数指针只不过是一个指向内存位置的指针,它不是类型安全的。而.NET委托完全不同,委托是安全类型的类,它定义了返回类型和参数的类型。 当把方法传递给其他方法时,需要使用委托。C#中使用一个类时,分两个阶段。首先需要定义这个类,即告诉编译器这个类由什么组成的。然后,实例化一个对象(除非只使用静态方法)。对于委托也是类似,也需要两个步骤。首先必须定义要使用的委 阅读详情
简介
       委托是C#中的一种引用类型,类似于C/C++中的函数指针。与函数指针不同的是,委托是面向对象、类型安全的,而且委托可以引用静态方法和实例方法,而函数指针只能引用静态函数。委托主要用于 .NET Framework 中的事件处理程序和回调函数。
       一个委托可以看作一个特殊的类,因而它的定义可以像常规类一样放在同样的位置。与其他类一样,委托必须先定义以后,再实例化。与类不同的是,实例化的委托没有与之相应的术语(类的实例化称作对象),作为区分我们将实例化的委托称为委托实例。
函数指针
       一个函数在编译时被分配给一个入口地址,这个入口地址就称为函数的指针,正如同指针是一个变量的地址一样。
函数指针的用途很多,最常用的用途之一是把指针作为参数传递到其他函数。我们可以参考下面的例子进一步理解函数指针作为参数的情况:
# include<stdio.h>
int max(int x,int y)
{
       return (x>y?x:y);
}
int min(int x,int y)
{
       return(x<y?x:y);
}
int sub(int x, int y)
{
       return(x+y);
}
int minus(int x,int y)
{    
       return(x-y);
}
void test(int (*p)(int,int),int (*q)(int,int),int a,int b)
{
       int Int1,Int2;
       Int1=(*p)(a,b);
       Int2=(*q)(a,b);
       printf("%d,/t%d/n",Int1,Int2);
}
void main()
{
       test(max,min,10,3);
       test(sub,minus,10,3);
}
客观的讲,使用函数指针作为其参数的函数如果直接调用函数或是直接把调用的函数的函数体放在这个主函数中也可以实现其功能。那么为什么还要使用函数指针呢?我们仔细看一下上面的main()函数就可以发现,main()函数两次调用了test函数,前一次求出最大最小值,后一次求出两数的和与差。如果我们test函数不用函数指针,而是采用直接在test函数中调用函数的方法,使用一个test函数还能完成这个功能吗?显然不行,我们必须写两个这样的test函数供main()函数调用,虽然大多数代码还是一样的,仅仅是调用的函数名不一样。上面仅仅是一个简单的例子,实际生活中也许main()函数会频繁的调用test(),而每次的差别仅仅是完成的功能不一样,也许第一次调用会要求求出两数的和与差,而下一次会要求求出最大值以及两数之和,第三次呢,也许是最小值和最大值,……,如果不用函数指针,我们需要写多少个这样的test()函数?显然,函数指针为我们的编程提供了灵活性。
另外,有些地方必须使用到函数指针才能完成给定的任务,特别是异步操作的回调和其他需要匿名回调的结构。另外,像线程的执行,事件的处理,如果缺少了函数指针的支持也是很难完成的。
类型安全
从上面的介绍可以看出,函数指针的提出还是有其必要的,上面的介绍也同时说明了委托存在的必要性。那么为什么C#中不直接用函数指针,而是要使用委托呢?这就涉及到另外一个问题:C#是类型安全的语言。何谓类型安全?这里的类型安全特指内存类型安全,即类型安全代码只访问被授权可以访问的内存位置。如果代码以任意偏移量访问内存,该偏移量超出了属于该对象的公开字段的内存范围,则它就不是类型安全的代码。显然指针不属于类型安全代码,这也是为什么C#使用指针时必须申明unsafe的缘故。
那么类型不安全代码可能会带来什么不良的后果呢?相信对于安全技术感兴趣的朋友一定十分熟悉缓冲区溢出问题,通过缓冲区溢出攻击者可以运行非法的程序获得一定的权限从而攻击系统或是直接运行恶意代码危害系统,在UNIX下这是一个十分普遍的问题。那么缓冲区溢出又和函数指针有什么关系呢?事实上,攻击者就是通过缓冲区溢出改变返回地址的值到恶意代码地址来执行恶意代码的。我们可以看看下面的代码:
void copy()
            {
                 char buffer[128];
                 ........
                     strcpy (buffer,getenv("HOME"));//HOME为UNIX系统中的HOME环境变量
                 ........
            }
上面的代码中如果HOME环境变量的字符数大于128,就会产生缓冲区溢出,假如这个缓冲区之前有另一个函数的返回地址,那么这一是地址就有可能覆盖,而覆盖这一地址的字符有可能就是恶意代码的地址,攻击者就有可能攻击成功了!
上面的例子仅仅是指针问题中的一种,除此以外,还可能由于错误的管理地址,将数据写入错误地址,造成程序的崩溃;还可能由于对指针不恰当的赋值操作产生悬浮指针;还可能产生内存越界,内存泄漏等等问题。
由此可见,指针不是类型安全的,函数指针当然也不例外,所以C#里面没有使用函数指针,而且不建议使用指针变量。
委托
前面的说明充分证明了委托存在的必要性,那么我们再谈谈为什么委托是类型安全的。C#中的委托和指针不一样,指针不通过MSIL而是直接和内存打交道,这也是指针不安全的原因所在,当然也是采用指针能够提高程序运行速度的缘故;委托不与内存打交道,而是把这一工作交给CLR去完成。CLR无法阻止将不安全的代码调用到本机(非托管)代码中或执行恶意操作。然而当代码是类型安全时,CLR的安全性强制机制确保代码不会访问本机代码,除非它有访问本机代码的权限。
委托派生于基类System.Delegate,不过委托的定义和常规类的定义方法不太一样。委托的定义通过关键字delegate来定义:
public delegate int myDelegate(int x,int y);
上面的代码定义了一个新委托,它可以封装任何返回为int,带有两个int类型参数的方法。任何一个方法无论是实例方法还是静态方法,只要他们的签名(参数类型在一个方法中的顺序)和定义的委托是一样的,都可以把他们封装到委托中去。这种签名方法正是保证委托是类型安全的手段之一。
产生委托实例和产生类实例(对象)差不多,假如我们有如下的方法:
public int sub(int x,int y)
{
       return(x+y);
}
我们就可以使用如下的代码得到一个委托实例:
myDelegate calculatin=new myDelegate(sub);
接下来我们就可以直接使用calculation调用sub方法了:
calculation(10,3);
下面我们将用委托重写上面的一个程序来看一下在C#中如何通过委托实现由函数指针实现的功能:
using System;
class MathClass
{
       public static int max(int a,int b)
       {
              return(a>b?a:b);
       }
       public static int min(int a,int b)
       {
              return(a<b?a:b);
       }
       public static int sub(int a,int b)
       {
              return (a+b);
       }
       public static int minus(int a,int b)
       {
              return (a-b);
       }
}
class Handler
{
       private delegate int Calculation(int a, int b);
       private static Calculation[] myCalculation=new Calculation[2];
       public static void EventHandler(int i,int a,int b)
       {
              switch (i)
              {
                     case 1:
                            myCalculation[0]=new Calculation(MathClass.max);
                            myCalculation[1]=new Calculation(MathClass.min);
                            Console.WriteLine(myCalculation[0](a,b));
                            Console.WriteLine(myCalculation[1](a,b));
                            break;
                     case 2:
                            myCalculation[0]=new Calculation(MathClass.sub);
                            myCalculation[1]=new Calculation(MathClass.minus);
                            Console.WriteLine(myCalculation[0](a,b));
                            Console.WriteLine(myCalculation[1](a,b));
                            break;
                     default:
                            return;
              }
       }
}
class Test
{
       static void Main()
       {
              Handler.EventHandler(1,10,3);
              Handler.EventHandler(2,10,3);
       }
}
 
我们还可以声明一个委托数组,就像声明一个对象数组一样,上面的例子中就使用到了委托数组;一个委托还可以封装多个方法(多路广播委托,经常与事件处理程序结合使用),只要这些方法的签名是正确的。多路广播委托的返回值一般为void,这是因为一个委托只能有一个返回值,如果一个返回值不为void的委托封装了多个方法时,只能得到最后封装的方法的返回值,这可能和用户初衷不一致,同时也会给管理带来不方便。如果你想通过委托返回多个值,最好是使用委托数组,让每个委托封装一个方法,各自返回一个值。
事件
在C#中,委托的最基本的一个用处就是用于事件处理。事件是对象发送的消息,以发信号通知操作的发生,通俗一点讲,事件就是程序中产生了一件需要处理的信号。
事件的定义用关键字event声明,不过声明事件之前必须存在一个多路广播委托:
public delegate void Calculate(int x,int y);//返回值为void的委托自动成为多路广播委托;
public event calculate OnCalculate;
从上节的委托实例和上面的事件的声明可以看出,事件的声明仅仅是比委托实例的声明多了个关键字event,事实上事件可以看作是一个为事件处理过程定制的多路广播委托。因此,定义了事件后,我们就可以通过向事件中操作符+=添加方法实现事件的预定或者是通过-=取消一个事件,这些都与委托实例的处理是相同的。与委托实例不同的是,操作符=对于事件是无效的,即
OnCalculate=new calculate(sub) ;//无效
只是因为上面的语句会删除由OnCalculate封装的所有其他方法,指封装了由此语句指定的唯一方法,而且一个预定可以删除其他所有方法,这会导致混乱。
回调函数
回调函数是在托管应用程序中可帮助非托管 DLL 函数完成任务的代码。对回调函数的调用将从托管应用程序中,通过一个 DLL 函数,间接地传递给托管实现。在用平台调用调用的多种 DLL 函数中,有些函数要求正确地运行托管代码中的回调函数。关于回调函数只是使用到委托,在此不加过多说明,具体实现可参考下图:

 

 

一、什么是委托

      下面引用自 MSDN

      委托类型声明的格式如下:

public delegate void TestDelegate(string message);


      delegate 关键字用于声明一个引用类型,该引用类型可用于封装命名方法或匿名方法。委托类似于 C++ 中的函数指针;但是,与函数指针不同,委托是面向对象和类型安全的。

      通过将委托与命名方法或匿名方法关联,可以实例化委托。与之关联的匿名方法必须除了方法名之外参数类型、参数个数、参数顺序和返回值都必须和声明的委托类型保持一致。
对于可隐式转换的参数和返回值类型处理可查阅 MSDN。

      看看《.NET 大局观》第2版中对委托的定义:委托是指向方法的一个安全可靠的指针。所有 delegate 都继承自一个共同的 System.Delegate 类型,通常用于事件的处理和回调(callbacks)。每个委托都关联一系列成员,称为调用列表(invocation list)。一旦委托被调用,列表中的每一个成员也都会被调用,并获得委托所收到的参数。

二、委托是什么?

      上面已经提到了什么是委托,现在又反问了委托是什么,这不是吃饱饭没事做忽悠人吗?
      当然不是,上面的问题是从委托本身狭小的范围来说事的,现在是要在超出委托定义的范围来说明。

      为了看清委托的真面目,我们来创建一个委托类型

namespace DelegateAndEventTest
{
    
public delegate void SampleDelegate(string message);
}


      再用 ildasm 打开编译后的 dll 查看生成的 IL 代码,结果如下:

      

      没有搞错,委托其实也只是一个类,它派生自 System.MulticastDelegate。

      既然委托是一个类,那它实例化出来的当然也是一个对象,它存储了一个类的方法的引用。这点对于用惯了 .NET 或者 JAVA 的用户来说不是很好理解,因为在他们的潜意识中已经把方法当成了语言的语法特性,它们可以被定义,被调用,但却不是数据类型,其实这样理解也是正确无误的,但却对我们理解方法引用造成一些障碍,直到有一天看《JS 权威指南》中对函数的介绍时忽然茅塞顿开,因为在 js 中它把函数也当成一种数据类型处理,如果在委托中也把方法当成一种数据类型看待呢?一个方法同样同样也是需要被分配一定范围内存空间的,同样也可以通过地址访问,委托存储的就是它的地址引用。

      总结:委托是一个定义签名的类型,即方法的返回值类型和参数列表类型。可以使用委托类型来声明一个变量,该变量可以引用与委托签名相同的所有方法。

      C#高级编程(第4版)中提到:理解委托的一种好方式是把委托的作用当作是给方法签名指定名称。

三、什么是事件

      下面的解释来自MSDN,基本上已经能说明事件的概念了:

      .NET 使用 event 关键字来指定事件。

      事件是类在发生其关注的事情时用来提供通知的一种方式。例如,封装用户界面控件的类可以定义一个在用户单击该控件时发生的事件。控件类不关心单击按钮时发生了什么,但它需要告知派生类单击事件已发生。然后,派生类可选择如何响应。
事件使用委托来为触发时将调用的方法提供类型安全的封装。委托可以封装命名方法和匿名方法。

      事件具有以下特点:
      * 事件是类用来通知对象需要执行某种操作的方式。
      * 尽管事件在其他时候(如信号状态更改)也很有用,事件通常还是用在图形用户界面中。
      * 事件通常使用委托事件处理程序进行声明。
      * 事件可以调用匿名方法来替代委托。

      事件处理程序委托的标准签名定义一个没有返回值的方法,其第一个参数的类型为 Object,通常命名为 sender,它引用引发事件的实例,第二个参数从 EventArgs 类型派生,通常命名为 e,它保存事件数据。如果事件不生成事件数据,则第二个参数只是 EventArgs 的一个实例。否则,第二个参数为从 EventArgs 派生的自定义类型,提供保存事件数据所需的全部字段或属性。

四、 一个关于委托与事件的例子

      下面是一个关于一个人从一个地方走到另一个地方的例子,Person 中包含一个方法 Move(),同时 Move() 会触发两个事件,一个是 OnBeginMove (在开始移动时发生),另一个是 OnEndMove (在到达目的地时发生),为了使其更像一个人,我们给它加上一个 Name 属性。

Person 类源代码:

using System;

namespace DelegateAndEvent
{
    
/// <summary>
    
/// 声明一个委托,用于代理一系列"无返回"及"不带参"的自定义方法
    
/// </summary>
    
/// <param name="sender">事件源</param>
    
/// <param name="e">不包含任何事件数据的 EventArgs</param>

    public delegate void MyEventHandler(object sender, EventArgs e); 

    
/// <summary>
    
/// 人类
    
/// </summary>

    public class Person
    
{
        
/// <summary>
        
/// 在开始移动时发生
        
/// </summary>

        public event MyEventHandler OnBeginMove;

        
/// <summary>
        
/// 在到达目的地时发生
        
/// </summary>

        public event MyEventHandler OnEndMove;

        
private string _name;

        
/// <summary>
        
/// 名字
        
/// </summary>

        public string Name
        
{
            
get { return _name; }
            
set { _name = value; }
        }


        
/// <summary>
        
/// 移动
        
/// <remarks>封装了触发事件的方法</remarks>
        
/// </summary>
        
/// <param name="place">目的地</param>

        public void Move(Place place)
        
{
            
// OnBeginMove 事件在这里被触发了
            if (OnBeginMove != null)
                OnBeginMove(
this, EventArgs.Empty);

            OnMove(place);

            
// OnEndMove 事件在这里被触发了
            if (OnEndMove != null)
                OnEndMove(
this, EventArgs.Empty);
        }


        
private void OnMove(Place place)
        
{
            Console.WriteLine(
"我走啊走啊走啊走.");
            Console.WriteLine(
"我已经走到 x={0} y={1} 的位置", place.X, place.Y);
        }

    }

}


Place 类源代码:

using System;

namespace DelegateAndEvent
{
    
public class Place
    
{
        
private int _x;
        
private int _y;

        
public Place() { }

        
public Place(int x, int y)
        
{
            
this._x = x;
            
this._y = y;
        }


        
public int X
        
{
            
get { return _x; }
            
set { _x = value; }
        }


        
public int Y
        
{
            
get { return _y; }
            
set { _y = value; }
        }

    
    }

}


客户端原代码:

using System;

namespace DelegateAndEvent
{
    
public class Program
    
{
        
static void Main(string[] args)
        
{
            
// 创建一个 Person 的新实例
            Person Yyw = new Person();

            
// 将事件与委托绑定
            
// 这里使用了命名委托
            Yyw.OnBeginMove += new MyEventHandler(Yyw_OnBeginMove);
            
// 这里使用了匿名委托(C# 2.0 的新特性)
            Yyw.OnEndMove += delegate(System.Object sender, System.EventArgs e)
            
{
                Console.WriteLine(
"我已经走到了尽头");
            }
;
            
            Place place 
= new Place(10, 20);
            
            
// 到那边去
            Yyw.Move(place);

            Console.Read();
        }


        
static void Yyw_OnBeginMove(object sender, EventArgs e)
        
{
            Console.WriteLine(
"我要开始走动了");
        }

    }
   
}


程序输出结果:

我要开始走动了
我走啊走啊走啊走....
我已经走到 x=10 y=20 的位置
我已经走到了尽头
 

C# 委托 在 C# 中,委托(Delegate)是一种类型安全的函数指针,它允许将方法作为参数进行传递,并在不同的上下文中调用这些方法。委托提供了一种灵活的方式来实现事件处理、回调机制和异步编程等功能,极大地增强了 C# 语言的功能性和可扩展性。委托是一种引用类型,它定义了方法的签名。委托可以指向任何具有相同签名的方法。这个委托定义了一个方法签名,该方法接受一个整数参数和一个字符串参数,并且没有返回值。委托是 C# 中一个非常强大的特性,它允许将方法作为参数进行传递,并在不同的上下文中调用这些方法。 阅读详情

相关推荐

yakit 通过codec 解决RSA加密

靶场就不过多叙述,具体的可以看yakit系列的前几篇文章。yakit 热加载进行 RSA 加密如何显示想要的payloads。

Arkmornings的博客 2687

C#基础--委托(Delegate)

简单介绍C# 委托知识

five_s的博客 1万+

CVPR 2027 投稿规划:基于近3年录用率与截稿周期的5步时间管理法

本文为计算机视觉研究者提供CVPR 2027投稿的完整规划指南,基于近三年录用率与截稿周期数据,提出五步时间管理法。涵盖选题策略、实验设计、论文写作、同行评审到最终提交的全流程优化,特别针对CVPR日益激烈的竞争环境(2024年投稿量达11532篇,录取率仅23.6%)提供实用解决方案,帮助研究者提升投稿成功率。

weixin_34079177的博客 1160

C# 调用C/C++ DLL库的回调函数

1、在 C/C++端 定义一个函数指针 Typedef void (*TESTBACK)(int a, int b); 定义一个带函数指针的函数 __declspec(dllexport int add(TESTBACK ptsTestBack, int a, int b) { return ptsTestBack(a, b); } 2、C# 端 声明回调函数的委

H265技术专栏 8521

从零开始:TexLive(Latex)安装与配置全指南

本文提供了一份详尽的TexLive(Latex)安装与配置全指南,旨在帮助用户从零开始快速搭建LaTeX工作环境。内容涵盖从镜像下载、安装步骤详解、环境验证到高效编辑器(如VS Code)配置,并特别强调了中文排版支持与宏包管理,确保用户能顺利处理学术论文等专业文档的排版需求。

weixin_29284885的博客 903

042_小驰私房菜_MTK Camera yuv旋转90度方案

做旋转可以在app层接收到数据后,自行做旋转,也可以在hal层,针对yuv format这路流进行旋转。那我们做旋转也可以采用类似的方式。预览和录像是正常的,这个是因为预览和录像有方向相关属性可以调整,系统会根据摄像头mount的角度已经当前设备的方向,进行对应的旋转。这个下面这个文件,可以修改摄像头的mount角度。,可以看到前摄的Orientation是270,所以原始出图是做了90度的旋转。这个方案,思路就是在配流信息中,将rotation信息进行修改。注:本文章所用权归:小驰成长圈,禁止转载宣传!

587

c#调用托管dll

调用方法: 1.项目右键,添加引用,选择你c#写的dll 2.直接通过命名空间.类名.方法,就可以用了,举例:   dll 内容为: using System; using System.Collections.Generic; using System.Text;

清闲居 2349

【Python音频处理】syncstart 计算媒体文件同步时间偏移

syncstart是一个强大的工具,它简化了多媒体文件的音视频同步过程,特别适用于多设备录制的媒体内容。在使用命令行工具时,可以根据实际需求灵活调整参数,如归一化、降噪、低通滤波等,以提高同步的精度和效率。通过本文介绍的基本操作和应用示例,可以快速掌握syncstart的使用方法,并将其应用到日常的音视频处理工作中。

Mr数据杨 817

C#中调用dll(托管和非托管)的方法

<br />1. 如果C#调用托管dll(比如C#生成的dll),可以使用下面的两个方法:<br />(1)通过project--->Add Reference--->Browser--->选择要加入的dll,同时将dll中要使用的变量或函数的所属的namespace加进来(using xxxx;).<br />(2)通过project--->Add Reference--->Projects将dll所在的project加进来即可。<br />2. 如果C#调用非托管的dll(比如 unmanaged C+

我编程,我快乐 2960

Yocto系列讲解[入门篇] 1 - 快速入门熟悉Yocto的构建

yocto quick start up带大家快速上手

fulinux的博客 5万+

educoder实训——计算几何形状的表面积与体积

educoder python实训

qq_41234663的博客 1230

C#中委托

文章目录一、C#委托二、隐式类型与匿名类型三、C#扩展方法与yield关键字四、Lambda表达式 一、C#委托 举例1: 创建控制台应用程序 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace TheOne { //声明委托 public delegate string Translatio

weixin_46596213的博客 4437

YOLOv8多传感器融合技术——毫米波雷达融合技术详解

本文介绍了YOLOv8与毫米波雷达融合技术在自动驾驶系统中的应用。毫米波雷达具有全天候工作、测距测速精准等优势,但存在分辨率低等局限。通过融合YOLOv8的视觉检测能力,可显著提升系统在恶劣环境下的感知性能。文章详细阐述了融合实现方法,包括雷达数据处理、目标投影匹配、置信度融合等关键技术,并提供了评估指标和应用场景分析。这种多传感器融合方案能有效弥补单一传感器的不足,为自动驾驶提供更可靠的环境感知能力,是实现高级别自动驾驶的重要技术支撑。

u010117029的博客 175

C#——委托

Action是.NET Framework内置的泛型委托,可以使用Action委托以参数形式传递方法,而不用显示声明自定义的委托。使用多播委托就可以按照顺序调用多个方法,多播委托只能得到调用的最后一个方法的结果,一般我们把多播委托的返回类型声明为void。引用可在运行时被改变。定义了一个委托叫做 IntMethodInvoker ,这个委托可以指向带有一个int类型的参数,并且返回值是void的一个方法。在定义好委托后就可以实例化委托,命名方法委托在实例化委托时必须带入方法的具体名称或者是null。

m0_51743362的博客 1万+

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

C#中的委托

开发工具与关键技术: MVC 撰写时间:2021/9/18 下面我们来讲C#中的委托和事件; 委托的概念: 委托从字面上理解就是一种代理,类似于房屋中介,由租房人委托中介为其租赁房屋。 在 C# 语言中,委托则委托某个方法来实现具体的功能。 委托的特点: (1) 委托是一种引用类型,在定义委托时与方法有些相似; (2) 从数据结构来讲,委托是和类一样是一种用户自定义类型; (3) 委托是方法的抽象,它存储的就是一系列具有相同签名和返回回类型的方法的地址; (4) 调用委托的时候,委托包含的所有方法将

无 3181

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

c#————委托

定义:委托是一种引用类型,存储了对方法的引用,即委托的内部包含一个指向某个方法的指针。委托可以看作是方法的抽象,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递。声明:委托的声明类似于变量声明,需要指定委托类型和变量名。委托类型定义了方法的签名,包括返回类型和参数列表。例如,声明了一个名为MyDelegate的委托,它引用了一个返回void类型、带有一个string类型参数的方法。

2401_82978699的博客 1468

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

C# 委托和事件委托

C# 本文描述了什么是委托,什么是事件委托,如何他们,并使用C#代码描述了如何实现的。 目录: 什么是委托? 1、概念 2、代码描述委托 什么是事件委托? 1、概念 2、代码描述事件委托

C/C#、Android driver、STM32、Linux等等。 1987

C# 中的委托

在学习的过程中,遇到了委托的概念,翻阅了学习资料,简单的记录一下 一 定义: 委托是一种引用类型,它是函数指针的托管版本。在C#中,委托是一种可以把引用存储为函数的类型。委托可以引用实例和静态方法,而函数指针只能引用静态方法。委托的声明非常类似于函数,和函数不同的的是委托不带函数体,并且需要Delegate关键字。委托的声明指定了一个函数签名,其中包含参数列表和和一个返回类型。...

xiaohu1996的博客 1722

C#中委托的用法

前言 大家好,我是阿辉。 昨天大家和我一起学习了,C#中的委托,了解了什么是委托,也简单写了一个委托的完整实例。那么为什么会出现委托!委托该如何使用! 委托有如下好处: 委托实现了将方法当作参数使用。 在两个不能直接调用的方法中作为桥梁。比如在多线程中的跨线程的方法调用就得用委托。 当不知道方法具体实现什么时使用委托。如事件中使用委托。 委托的用法 给委托赋值 由于委托是引用类型,可通过给它赋值来改变包含在委托变量中的引用,旧的委托将被GC回收处理。 //给委托赋值 testOne

讲述工作、生活、技术中的日常与感悟。 4114
上一篇: 一些.net中应该知道的问题
下一篇: C#的6种常用集合类大比拼
NETZHOU
博客等级 码龄24年 10粉丝 29原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值