Example #1
0
        public static void SetDelegate(out dlgtAnonymous dlgt)
        {
            int k = 5;

            dlgt = delegate(int x, int y) { return(x + y + k); };
        }
Example #2
0
        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
        }
Example #3
0
 public static int Calc(dlgtAnonymous dlgt)
 {
     return(dlgt(2, 3));
 }