static void Main(string[] args)
{
ThereIsAFire Fire = new ThereIsAFire(Call119);
Fire += new ThereIsAFire(ShoutOut);
Fire += new ThereIsAFire(Escape);
Fire("우리집");
}
C#에서는 += 연산자를 통해대리자에 메소드 참조를 추가할 수 있다. 그리고 대리자를 한 번만 호출하게 되면, 자신이 참조하고 있는 메소드를 모두 호출한다. 체인(Chain)이라고 불리는 이유가 여기에 있는 것이다. 그 외에도 다음과 같이 대리자 체인을 만들 수 있는 방법들이 있다.
// +와 = 연산자 사용
ThereIsAFire Fire = new ThereIsAFire(Call119)
+ new ThereIsAFire(ShoutOut)
+ new ThereIsAFire(Escape);
// Delegate.Combine() 메소드 사용
ThereIsAFire Fire = (ThereIsAFire) Delegate.Combine(
new ThereIsAFire(Call119),
new ThereIsAFire(ShoutOut),
new ThereIsAFire(Escape));
또한, 대리자에 추가한 메소드 참조들은 -= 연산자로 삭제할 수 있으며 Delegate.Remove() 메소드를 사용해도 된다.
// -= 연산자로 체인 끊기 예시
ThereIsAFire Fire = new ThereIsAFire(Call119);
Fire += new ThereIsAFire(ShoutOut);
Fire += new ThereIsAFire(Escape);
Fire("우리집");
Console.WriteLine("---------------------------------\n");
Fire -= ShoutOut; // ShoutOut 메소드 참조 삭제
Fire("당신 집");
3. 익명 메소드
대리자에게 참조할 메소드를 넘겨야 할 일이 생겼는데, 이 메소드가 두 번 다시 사용할 일이 없다고 판단된다면?
이 때 익명 메소드를 유용하게 활용할 수 있다. 대리자에 익명 메소드 참조는 다음과 같이 한다.
대리자_인스턴스 = delegate(매개변수_목록)
{
// 실행하고자 하는 코드
};
당연한 얘기겠지만, 익명 메소드는 자신을 참조할 대리자의 형식과 동일한 형식으로 선언되어야 한다.
익명 메소드를 사용한 예시를 한 번 보자. 다음과 같이 대리자를 선언하고,
delegate int Calculate(int a, int b);
익명 메소드를 참조시켜 보았다.
Calculate Calc;
Calc = delegate(int a, int b)
{
return a + b;
};
Console.WriteLine("{0} + {1} = {2}", 3, 4, Calc(3, 4));