C# 委托 C函数指针

 《C#高级编程》里说“.Net已委托的形式实现了函数指针的概念”,这里简单比较一下两者的区别:

1 首先看看C下的“函数指针”如何声明和定义一个函数变量:

typedef int (*FUNC)(int x, int y);         //声明

FUNC     func;                                          //定义一个“函数变量”

当已经有这样一个实现的函数时:

int SomeFn(int m, int n)

{

    //函数实现

}

就可以将这个SomeFn 函数名赋值给 func变量:

              func = SomeFn;

使用它:

       func(100, 200)

2 再来看看C#里委托如何实现上面所说,仍然使用上述的SomeFn函数实现:

声明一个委托“类”(在C#中没有全局函数概念,只有类):

              private delegate void FUNC (int x, int y );           // private是public没关系

也的确,当你写完了上句后,在VS2005中,发现Func是和其他的“类”是并列的。

       再来声明一个变量,并new一个:

FUNC func = new FUNC (SomeFn)

注意new后面函数名后跟的参数不是SomeFn的两个参数,而是SomeFn本身函数名,不过,这时的SomeFn实现若放在同一个类中,需添加一个static 关键字。

使用它,同上面的C语言一样:

       func(100, 200)


文章出处:DIY部落(http://www.diybl.com/course/4_webprogram/asp.net/netjs/20090316/161868.html)

 

 

 

C#委托的例子:

以前对dot net 委托的理解 ,没有一个很好的理解,总是不清不混的,今天在<<C#高级编程(第六版)>>,总算有了新的看法,不像我以往想象的那么抽象或难以理解,如果你想知道委托到底是怎么回事的话,就慢慢看下去,真谛再现,哈哈哈...


1. 
简单的委托示例

在这个示例中,定义一个类MathsOperations,它有两个静态方法,对double类型的值执行两个操作,然后使用该委托调用这些方法。这个数学类如下所示:

   class MathsOperations
   {
      public static double MultiplyByTwo(double value)
      {
             return value*2;
      }
      public static double Square(double value)
      {
            return value*value;
      }
   }

下面调用这些方法:

using System;
namespace Wrox.ProCSharp.Delegates
{

   delegate double DoubleOp(double x);
   class Program
   {
      static void Main()
      {
          DoubleOp [] operations =
          {
               MathsOperations.MultiplyByTwo,
               MathsOperations.Square
           };

         for (int i=0 ; i<operations.Length ; i++)
         {
            Console.WriteLine("Using operations[{0}]:", i);
           
            ProcessAndDisplayNumber(operations, 2.0);
           
            ProcessAndDisplayNumber(operations, 7.94);

            ProcessAndDisplayNumber(operations, 1.414);

            Console.WriteLine();

         }

      }

      static void ProcessAndDisplayNumber(DoubleOp action, double value)
      {
              double result = action(value);

              Console.WriteLine( "Value is {0}, result of operation is {1}", value, result);
       }

   }

}

在这段代码中,实例化了一个委托数组DoubleOp (记住,一旦定义了委托类,就可以实例化它的实例,就像处理一般的类那样—— 所以把一些委托的实例放在数组中是可以的)。该数组的每个元素都初始化为由MathsOperations类执行的不同操作。然后循环这个数组,把每个操作应用到3个不同的值上。这说明了使用委托的一种方式—— 把方法组合到一个数组中,这样就可以在循环中调用不同的方法了。

这段代码的关键一行是把委托传递给ProcessAndDisplayNumber()方法,例如:

            ProcessAndDisplayNumber(operations, 2.0);

其中传递了委托名,但不带任何参数,假定operations是一个委托,其语法是:

●       operations
表示这个委托。换言之,就是委托代表的方法。

●       operations(2.0)
表示调用这个方法,参数放在括号中

ProcessAndDisplayNumber()
方法定义为把一个委托作为其第一个参数:

      static void ProcessAndDisplayNumber(DoubleOp action, double value)

在这个方法中,调用:

         double result = action(value);

这实际上是调用action委托实例封装的方法,其返回结果存储在result中。

运行这个示例,得到如下所示的结果:

SimpleDelegate

Using operations[0]:

Value is 2, result of operation is 4

Value is 7.94, result of operation is 15.88

Value is 1.414, result of operation is 2.828

Using operations[1]:

Value is 2, result of operation is 4

Value is 7.94, result of operation is 63.0436

Value is 1.414, result of operation is 1.999396

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值