public static void SetDelegate(out dlgtAnonymous dlgt) { int k = 5; dlgt = delegate(int x, int y) { return(x + y + k); }; }
void Main() { dlgt d; d = new dlgt(AA); //인수로 메서드 전달 d(12); //12의 제곱 = 144 d = new dlgt(AAA); d(12); //12의 세제곱 = 1728 // 공변성 : 메서드의 리턴타입이 델리게이트의 리턴타입보다 더 자식 타입일 떄 이 메서드를 델리게이트가 가리킬 수 있는 성질. // 메서드의 매개변수가 더 부모여야 하며 반환되는 형이 더 부모여야 공변성 허용. dlgtBase db; db = GetBase; db = GetDerived; // 내장형 타입은 부모 자식관계가 성립하지 않으므로 정확하게 일치해야 한다. dlgtLong dl; dl = GetLong; dlgtInt di; di = GetInt; dlgtOperator dot; int a = 3, b = 5; dot = new dlgtOperator(Add); Console.WriteLine("더하기 {0} + {1} = {2}", a, b, dot(a, b)); dot = new dlgtOperator(Mul); Console.WriteLine("곱하기 {0} + {1} = {2}", a, b, dot(a, b)); if (Compress(10, Progress) == true) { Console.WriteLine("모든 파일을 압축하였습니다."); } else { Console.WriteLine("취소되었습니다."); } Book[] books = new Book[10]; for (int i = 0; i < books.Length; i++) { books[i] = new Book(i); } // 반환형이 void 인 델리게이트의 멀티케스트를 위해 null로 초기화한 후, += 연산자를 이용해 멀티캐스트 가능. dlgtRent rentCall = null; rentCall += books[1].Rend; rentCall += books[4].Rend; rentCall += books[6].Rend; rentCall += books[9].Rend; rentCall("운명");//1{4, 6, 9)번 고객이 운명을 빌려간다. Printer prt = new Printer(); Receiver rcv = new Receiver(); rcv.Complete += prt.Print; rcv.Receive(); Button btnStart = new Button(); btnStart.Draw(); btnStart.Click += GameStart; Console.WriteLine("S: 게임시작, E: 게임종료"); for (;;) { if (Console.KeyAvailable) { ConsoleKeyInfo input; input = Console.ReadKey(); if (input.Key == ConsoleKey.S) { btnStart.OnClick(); } else if (input.Key == ConsoleKey.E) { break; } } System.Threading.Thread.Sleep(100); } // 익명메서드 : 한번만 사용할 경우 // 익명메서드에서는 외부변수와 같은 이름의 지역변수를 선언해서는 안된다. dlgtAnonymous da = delegate(int x, int y) { return(x + y); }; int k = da(2, 3); Console.WriteLine("익명메서드 실행결과: {0}", k);//5 k = Calc(delegate(int x, int y) { return(x + y); }); Console.WriteLine("익명메서드 실행결과: {0}", k);//5 k = Calc(delegate(int x, int y) { return(x * y); }); Console.WriteLine("익명메서드 실행결과: {0}", k);//6 dlgtOut dout = delegate(int x, out int y) { y = 0; }; dlgtAnonymous dRtn; SetDelegate(out dRtn); int z = dRtn(2, 3); Console.WriteLine(z);//10 }
public static int Calc(dlgtAnonymous dlgt) { return(dlgt(2, 3)); }