私はこの問題を思いつきました。質問:なぜfunc2が呼び出されますか? ああ、もう1つ。私は代理人に関数を追加すると言う。この関数では別の代理人を呼び出しますが、この関数がこの代理人を呼び出す前に最初の代理人に追加された関数がすべて呼び出されるようにしたいのですが、クリーンな解決策があります(getInvocationListに本当に関心がない)。 ありがとうございます、あなたは最高です。C#デリゲートは正常に動作しませんか?
class Program
{
delegate void voidEvent();
voidEvent test;
private void func1()
{
Console.Write("func1");
test -= func2;
}
private void func2()
{
Console.WriteLine("func2");
}
static void Main(string[] args)
{
Program p = new Program();
p.test += p.func1;
p.test += p.func2;
p.test();
}
}
+1。はい。このため、 'var func = p.test; if(func!= null){func(); } '何もロックせずにマルチスレッドのシナリオで。 'func'は' p.test'のコピーであり、 'p.test'に対する変更は気にしないからです。 –
しかし、私はtest- = func2を呼び出してgetinvocationlistを呼び出すと、func2がリストにないことが分かります。だから、あなたは、すべての代議員が現在呼び出されている(そして到達可能でない)リストと、次回呼び出されるリストの2つのリストを持っていると言っていますか? – Yamcha
@ user1316459、実際には2つのリストはありません。しかし、あなたがフィールドからデリゲートを呼び出すとき、あなたは効果的に何かを言う:「現場*の価値を今すぐ取ってからそれを呼び出す」。つまり、 'test'自体ではなく' test'の値のコピーを呼び出すことになります。 – svick