저는 C#에 다소 새로운 것이므로이 문제를 생각해 냈습니다. 질문 : func2를 호출하는 이유는 무엇입니까? 오, 그리고 한가지 더. 대리자에 함수를 추가한다고 해봅시다. 이 함수에서는 다른 대리자를 호출하지만이 함수가이 대리자를 호출하기 전에 첫 번째 대리자에 추가 된 다른 모든 함수가 호출되도록하고 싶습니다. 깨끗한 솔루션 (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가 더 이상 목록에 없음을 알 수 있습니다. 따라서 모든 대표는 두 개의 목록을 가지고 있다고 말하면서 현재 호출 된 (그리고 도달 할 수없는) 목록과 다음 번에 호출 할 목록이 있습니다. – Yamcha
@ user1316459, 실제로 두 개의 목록이 없습니다. 그러나 소송에서 대표를 파견 할 때, 당신은 효과적으로 "현장 *의 가치를 취하여 그 다음에 그것을 호출하십시오."같은 말을 효과적으로합니다. 즉,'test' 자체가 아니라'test' 값의 복사본을 호출하는 것입니다. – svick