Console.WriteLine("abc:"+msg);
}
private static void def(string msg){
Console.WriteLine("abc:"+msg);'' WinForm可以中用 MessageBox.Show(msg);
}
private static void MsgFunc(string msg,SomeFuncDelegate DoSomeFunc){
DoSomeFunc(msg);
}
static void Main(string[] args){
MsgFunc("哈哈",abc);//输出 abc:哈哈
}
}
下边都基本上都能通过模拟实现,词语不一样,理是一样的,有的叫委托,有的叫回调,有的叫指针,有的宏替换/代换。
到底怎么用?具体问题具体对待。一定要注意无数前辈的共识:
委托 能够大大简化在某些特定的场合调用多个相同形式函数的处理,并使得程序具有更好的可扩展性;
或者说当一个对象包含复杂单独立的,必须基于判决执行的功能性的若干部分时,最佳的方法是适用基于委托设计模式的对象。
了解这个含义,灵活运用,切记不要死板。
与vb/vbs/asp 对比,vb之类的可以用 Execute 或 Eval 或更厉害的 ExecuteGlobal,与C#的区别是不用申明 委托
例如:
sub abc(msg)
msgbox "abc:"&msg '' asp 中换成 Response.write("abc:"&msg) 或换成 response.write("<"&"script>alert('abc:"&msg &"')</script>")
end sub
sub def(msg)
msgbox "def:"&msg
end sub
sub MsgFunc(f,msg)
Execute f &""""&msg &""""
end sub
MsgFunc "abc","哈哈"
与C对比在C中早就有 callback,指针函数之类,当然这个和C#的委托还是有很大区别,一般都做个模仿C#的委托,代码超长。
与DELPHI对比
unit Unit1;
interface
uses
Windows,Messages,SysUtils,Variants,Classes,Graphics,Controls,Forms,Dialogs,StdCtrls;
type
TSomeFuncDelegateClass=procedure(msg:string) of object;//定义一个委托
{...此处省略1024字...}
private
procedure abc(msg:string);
procedure def(msg:string);
procedure DoMsgFunc(Delegate:TSomeFuncDelegateClass;msg:string);
{...此处省略八万四千字...}
var
Form1:TForm1;
implementation
{...此处又发生了省略事件,不过该懂的一定懂的...}
procedure TForm1.abc(msg:string);
begin
MessageBox('abc:'+msg);
end;
procedure TForm1.def(msg:string);
begin
MessageBox('def:'+msg);
end;
procedure TForm1.DoMsgFunc(Delegate:TSomeFuncDelegateClass;msg:string);
begin
if Assigned(Delegate) then Delegate(msg);
end;
procedure TForm1.Button1Click(Sender:TObject);
begin
DoMsgFunc(abc,'哈哈');
end;
与JavaScript对比,也免了声明了,可以回调,也可以eval,还可以模拟C#,太灵活了
//用在网页中(DOM)
function abc(msg){alert('abc:'+msg);};
function def(msg){alert('def:'+msg);};
function someFunc(f,msg){f(msg);};
someFunc(abc,"哈哈");
// eval("abc('哈哈');")
与PHP对比call_user_func,call_user_func_array,forward_static_call 等等等,可以回调,可以模拟
<?php
function abc($msg){echo "abc:$msg";}
function def($msg){echo "def:$msg";}
call_user_func('abc','哈哈');