汪...好,請允許我歸納了一下:
所以在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