哇…好吧,请允许我概括一下:
因此,在Java中,您需要一种方法来传递函数。Java本质上不支持以一等公民身份使用函数,这是实现 匿名类的 背后原因之一-
打包的函数组可以内联声明并(作为接口)传递给方法/其他类,然后再调用这些函数。
在C#中,函数是一等公民,可以声明为
Delegates,
Func<>s或
Action<>s。让我们尝试一下比较:
某种Java-y构造(我的Java相当老,请耐心等待):
public interface IDoSomething { public int Return42(); public bool AmIPrettyOrNot(string name); public void Foo();}public void Main(String[] args) { DoStuff(new IDoSomething() { public int Return42() { return 42; } public bool AmIPrettyOrNot(string name) { return name == "jerkimball"; } public bool Foo(int x) { ... } });}public void DoStuff(IDoSomething something) { ... }C#中的(非常粗糙)等效项为:
public void Main(string[] args){ Func<int> returns42 = () => 42; Func<string,bool> amIPretty = name => name == "jerkimball"; Action<int> foo = x => {};}现在,正如其他人提到的那样,在处理事件时,通常会在Java端看到这种模式-同样在C#端:
public class Foo { // define the shape of our event handler public delegate void HandlerForBarEvent(object sender, EventArgs args); // declare our event public event HandlerForBarEvent BarEvent; public void CallBar() { // omitted: check for null or set a default handler BarEvent(this, new EventArgs()); } } public void Main(string[] args) { var foo = new Foo(); // declare the handler inline using lambda syntax foo.BarEvent += (sender, args) => {// do something with sender/args } foo.CallBar(); }注意,我们也可以给它一些具有相同“形状”的东西:
public void MyHandler(object sender, EventArgs args) { // do stuff } public void Main(string[] args) { var foo = new Foo(); // that method above is the same "shape" as HandlerForBarEvent foo.BarEvent += MyHandler; foo.CallBar(); }但是在Java中,它也用于定义内存(例如
Runnable)服务时Thread的功能-我们也可以在C#中做到这一点:
var thread = new Thread((Action)(() => { // I'm the threads "run" method! });thread.Start();现在,其他内容-枚举:
public void processEvents(){ for(Event event : eventList) eventList.execute();}C#的想法相同,只是调用方式不同:
public void processEvents(){ // edit: derp, 'event' is a keyword, so I'm // renaming this, since I won't get into why // you could also use @event... foreach(var evt in eventList) { evt.Execute(); }}


