什么是C#委托

 我来答
新科技17
2022-09-29 · TA获得超过5852个赞
知道小有建树答主
回答量:355
采纳率:100%
帮助的人:72.8万
展开全部

   什么是委托

  首先要知道什么是委托 用最通俗易懂的话来讲 你就可以把委托看成是用来执行方法(函数)的一个东西

   如何使用委托

  在使用委托的时候 你可以像对待一个类一样对待它 即先声明 再实例化 只是有点不同 类在实例化之后叫对象或实例 但委托在实例化后仍叫委托

  声明 如

   namespace Vczx ProCSharp Exc

   {

   delegate double MathsOp( double x )

   //class defination here

   }

  这就声明了一个委托 意义 任何一个返回值为double 且只有一个形参为double的函数 都可以用这个委托来调用

  注意 委托的声明位置在namespace里面 类的外面 其实 委托的声明也可以在类的里面 甚至是任何一个可以声明类的地方

  实例化

  首先我们要先有一个满足委托声明的方法 假设一个返回一个数的 倍的方法

   class MathsOperations

   {

   public static double MultiplyBy ( double value )

   {

   return value *

   }

   }

  有了这样一个方法 我们就可以实例化一个委托了

  MathsOp operation = new MathsOp( MathsOperations MultiplyBy )

  在实例化一个委托时 要给它一个参数 这个参数就是委托执行的方法 它可以是静态方法 也可以是实例方法(这一点有别于函数指针 函数指针只能调用静态方法) 如

  MathsOp operation = new MathsOp( new Class () Method )

  在实例化完一个委托之后 就可以用这个委托来调用方法了

  double result = operation( )

  例子代码

   namespace Vczx ProCSharp Exc

   {

   delegate double MathsOp( double x )

   class Start

   {

   public class MyDelegate

   {

   public static double MultiplyBy ( double x )

   {

   return x *

   }

   }

   [STAThread]

   static void Main(string[] args)

   {

   MathsOp operation = new MathsOp( MyDelegate MultiplyBy )

   double x =

   double result = operation( x )

   Console WriteLine( { } multiply by is { } x result )

   Console Read()

   }

   }

   }

  多路广播委托

  前面使用的委托只包含一个方法调用 调用委托的次数与调用方法的次数相同 如果要调用多个方法 就需要多次显示调用这个委托 其实委托也可以包含多个方法 这种委托就是多路广播委托 多路广播委托派生于System MulticastDelegate 它的Combine方法允许把多个方法调用链接在一起 我们可以通过+=来向委托添加调用方法 也可以用 =删除其中的调用方法 如

   namespace Vczx ProCSharp Exc

   {

   public class MyDelegate

   {

   public static void MultiplyBy ( double value )

   {

   double result = value *

   Console WriteLine( Multiplying by { } gives { } value result )

   }

  

   public static void Squre( double value )

   {

   double result = value * value

   Console WriteLine( Squaring { } gives { } value result )

   }

   }

  

   delegate void MathsOp( double x )

  

   class Start

   {

   [STAThread]

   static void Main(string[] args)

   {

   MathsOp operation = new MathsOp( MyDelegate MultiplyBy )

   operation += new MathsOp( MyDelegate Squre )

   double x =

   operation( x )

  

   operation = new MathsOp( MyDelegate MultiplyBy )

   operation( x )

  

   Console Read()

   }

   }

   }

  输出

  Multiplying by gives

  Squaring gives

  Squaring gives

  注意 多路广播委托声明时必须返回void 否则返回值不知道应该送回什么地方 对此 我做了一个测试 如果不将委托的声明返回void 则返回值返回的是最后一个链入委托链的方法的返回值 编译不会出错

   为什么要用委托

lishixinzhi/Article/program/net/201311/11900

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式