うわー...わかりました、少し一般化させてください:
したがって、Javaでは、関数を渡す方法が必要です。Javaは本質的に第一級市民としての関数をサポートしていません。これが、匿名クラスの実装の背後にある理由の1つです。インラインで宣言し、これらの関数を呼び出すメソッド/他のクラスに(インターフェイスとして)渡すことができる関数のパッケージ化されたグループです。 。
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
。これは、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();
}
}