c#中什么来代替函数指针

 我来答
双枪老椰子
2015-06-10 · TA获得超过5.5万个赞
知道大有可为答主
回答量:5797
采纳率:93%
帮助的人:1822万
展开全部
C#中的函数指针

函数指针也叫指向函数的指针,它是为了提高函数的通用性而引入的。比较传统的方法是在函数中增加参数,通过增加的参数来判断到底要用什么函数,这样的缺点是灵活性差,为了支持多种方法要在函数中要写很多分支判断语句。比如,你要计算一个函数值(如sin x,log10 x)的平方,按照传统的方法你可以这样写这个函数:

public double Fuction(double Param,int FunctionSelection)
{
if(FunctionSelection=0)
return Math.Pow(Math.Sin(Param),2);
if(FunctionSelection=1)
return Math.Pow(Math.Log10(Param),2);
..............
}

显然,这种方法很费事,造成函数体很长。所以,函数指针的思想很重要。大家可能很熟悉C++中的DDP函数指针类型,那么,在完全面向对象的C#语言中函数指针是什么样子的呢?
在C#中我们使用delegate(委托)关键字来实现函数指针。
在《.NET Framework Essential》中有一个经典的例子:
using System;
namespace testDelegate
{
public class testDelegate
{
//1.定义回调函数指针.
delegate void MsgHandler(string strMsg);
//2.定义回调函数.
void OnMsg(string strMsg)
{
Console.WriteLine(strMsg);
}
public static void Main()
{
testDelegate t=new testDelegate();
//3.连接函数指针对象f到t.OnMsg.
MsgHandler f=new MsgHandler(t.OnMsg);
//4.调用指针的回调函数
f("Hello,Delegate!");
}
}
}
上面的例子注释说明了实现函数指针所要做的工作,我们发现在delegate void MsgHandler(string strMsg)一句中的参数是字符串型的,说明能够指向的函数也必须只有一个字符串参数,而MsgHandler f=new MsgHandler(t.OnMsg);中是把t.OnMsg这个函数直接传递给f。这个例子过于简单,但是已经说明函数指针的用法。我们不妨解决一下前面提出的计算不同函数值的平方的问题。
首先定义一个函数委托(指针):
delegate double DoubleHandler(double D_Parm);
这相当于在C++定义函数指针类型。
第二步定义回调函数就免了,因为我们可以使用Math.Sin函数和Math.Log10函数,但是我们必须定义一个函数来求平方:
public static double MathMethod(double parm1)
{
return Math.Pow(parm1,2);
}
这个函数和前面那个加参数的函数相比简单多了,但更具有通用性。
百度网友11fc0e4
2012-03-16 · TA获得超过131个赞
知道小有建树答主
回答量:108
采纳率:0%
帮助的人:99.5万
展开全部
委托 delegate 委托就是函数指针,但其安全性更高,C#中的事件就是委托的最好实例!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
styshoo1986
2012-03-01 · TA获得超过893个赞
知道小有建树答主
回答量:832
采纳率:100%
帮助的人:263万
展开全部
委托
委托比函数指针更安全,也更容易理解。
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
励珈蓝赐7331
2012-03-01 · TA获得超过6.5万个赞
知道大有可为答主
回答量:5.5万
采纳率:0%
帮助的人:7113万
展开全部
委托
委托属于C#中的新名词,它的应用也非常广泛,例如事件就是委托最简单而又直接的例子。
那么首先说说什么是委托,其实委托在用过C或者C++的人看来就是函数指针,不过使用C#的大多数人都没有用过这两门语言,因此对委托的理解不是很深,对于委托可以简单的从字面去理解,即“委托别人去执行某些操作”,也就是说执行一个操作,而这个操作过程自身并不知道,只是委托过来让你去执行而已。

参看如下这个例子。

public delegate void HelloHandler( string Msg );

private void SayHello( string sMsg )

{

MessageBox.Show( sMsg );

}

// delegate sample

HelloHandler hHello = new HelloHandler( SayHello );

hHello( "Hello World!" );

例子很明显,在执行hHello的时候,并不知道具体的过程是什么样的,只是去执行而已。

现在要说说委托能做些什么,那么先来分析一下事件,这也是委托用得最多的地方。一般事件的初始化需要绑定一个事件处理函数,那么当事件触发的时候,处理函数会被调用,也就是说在事件处理函数可以明确的知道,此事件是被触发了。例如,点击窗体的上的Button,它会把Click事件反馈给窗体。很明显,委托是处理对象之间的信息交互。除了事件外,委托的大多用处都和此类似,那么这样使用的好处在于降低对象之间耦合性。

其次委托不同于以前函数指针的地方在于,可以绑定多个委托函数,例如:

public delegate void HelloHandler( string Msg );

private void WriteHello1( string sMsg )

{

Debug.WriteLine( "WriteHello1:" + sMsg );

}

private void WriteHello2( string sMsg )

{

Debug.WriteLine( "WriteHello2:" + sMsg );

}

// delegate sample

HelloHandler hHello = new HelloHandler( WriteHello1 );

hHello += new HelloHandler( WriteHello2 );

hHello( "Hello World!" );

不过在这种情况下,由于绑定到委托上的函数是按照顺序执行的,所以有两个潜在的问题。

第一个问题,当一个函数执行过程中产生异常,导致后面的不能进行执行。就上面的例子而言,如果在“WriteHello1”函数中出现异常,会导致“WriteHello2”不能被执行。

另一个问题,就是委托执行的返回值,当绑定多个函数,委托执行的返回值是最后一个绑定函数执行后的返回值,那么通过这个值去做判断将会是不正确的。

那么对于委托绑定多个函数,要注意的是不要把异常扩散出来,其次委托类型的返回值为“void”。

如何去使用委托,很多人看了书上的例子,也知道委托的意义,但是无法把它和实际应用进行结合。那么在使用委托的时候,首先要明白几个问题,等各个问题清楚了,委托原型也就自然出来了。

需要分析清楚的问题有如下几点。

问题一,传递信息是什么,传递的时机是否固定,一次传递还是多次传递;

问题二,用委托是否合适;

问题三,哪一方是委托的调用端,而哪一方是委托的初始端;

问题四,委托的初始化放在哪里比较合适。

问题一是关键,这首先决定是否要使用委托来实现,其次如果要使用委托,那么需要确定委托函数类型。

对于问题二来说,很多人可能就不解了。没错,委托是可以降低类型之间的耦合性,但是能起到这种作用的并不是只有委托这一种方法。很多情况下,用重载构造函数即可以达到这一目的,因此想问题的时候,不能局限于此。例如,很多人都做过弹出一个单独窗体对某一条记录进行修改,这里用委托可以实现,但是考虑到DataRow属于引用类型,而这个窗体脱离了数据记录就失去了意义,因此可以重载构造函数,在初始化窗体的时候,把记录传递给窗体就行了。相对而言,后者会更简单直接些。

有了前两个问题的分析,不少人在写委托的时候,会把顺序写反了,因此程序执行的效果并不是设想中的那样,这一点要尤为注意。

对于第四个问题来说,可以借鉴窗体的控件事件初始化部分代码,即委托的初始化采取就近原则,不过这不是唯一初始化的地方,这样写只是便于防止漏写。
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式