汪...好,请允许我归纳了一下:
所以在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 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();
}
: - :是同样在C#侧现在
public void Main(string[] args)
{
Func<int> returns42 =() => 42;
Func<string,bool> amIPretty = name => name == "jerkimball";
Action<int> foo = x => {};
}
,如其他人所说,你通常与事件的处理打交道时看到在Java端这种模式
请注意,我们也可以给它使用相同的“形”的东西:
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
)什么帖子 - 我们能做的事情这个问题,以及在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();
}
}
如果它是事件和事件处理,看.. [在C#活动(http://msdn.microsoft.com/en-us/library/awbftdfh.aspx)。整个构造以不同的“C#方式”完成。你会在你的阅读中遇到代表(即回调函数)和MulticastDelegate(即多个事件处理程序是如何绑定的)。 – 2013-03-23 00:07:30
这是一个[匿名类](http://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html),没有,这不适用于C#中的接口。 – 2013-03-23 00:10:19
你想要处理事件还是要求实例化一个接口(在你的simulateEvent代码中)? – 2013-03-23 00:11:17