p.252 관련한 질문인데요 event에 대해 풀어서 구현 설명을 하고 있는 것 같은데 코드 이해가 안되서 질문드립니다. 난수 생성은 그렇다 치더라도 이해가 안되서 질문 드립니다
모르는 부분은 코드 옆에 주석으로 질문 했습니다
namespace Cons_Application
{
    class CallbackArg { } //이 부분을 왜 비워놓았는데 PrimeCallbackArg에서 상속을 받는 건가요?? 아무런 기능도 안하는 건데 말이죠??
    class PrimeCallbackArg : CallbackArg
    {
        public int Prime;
        public PrimeCallbackArg(int Prime)
        {
            this.Prime = Prime;
        }
    }
    class PrimeGenerator
    {
        public delegate void PrimeDelegate(object sender, CallbackArg arg);// 여기서 CallbackArg 클래스 안에는 내용이 아무것도 없는데 왜 인자로 전달한 것일까요??
        PrimeDelegate callbacks; 
        public void AddDelegate(PrimeDelegate callback)
        {
            callbacks = Delegate.Combine(callbacks, callback) as PrimeDelegate; 
        }
        public void RemoveDelegate(PrimeDelegate callback)
        {
            callbacks = Delegate.Remove(callbacks, callback) as PrimeDelegate;
        }
        // 여기부분에서 콜백 메서드를 호출한다고 했는데 어느 부분이 호출 한다는 건가요 if 조건문 을 만족하면 callbacks()실행을 하는 부분이 호출하는 것인가요??
        public void Run(int limit)
        {
            for (int i = 2; i <= limit; i++)
            {
                if (IsPrime(i)==true && callbacks != null) // 그리고 여기서 callbacks가 null이 아닌 조건을 추가한 이유가 무엇인가요??
                {
                    // 
                    callbacks(this, new PrimeCallbackArg(i));
                }
            }
        }
        private bool IsPrime(int candidate)
        {
            if ((candidate & 1) == 0)
            {
                return candidate == 2;
            }
            for (int i = 3; (i*i) <=candidate; i+=2)
            {
                if ((candidate % i) == 0)
                    return false;
            }
            return candidate != 1;
        }
    }
    class Program
    {
        static int Sum;
        static void PrintPrime(object sender,CallbackArg arg) 
        {
            Console.Write((arg as PrimeCallbackArg).Prime + ",");// 이 부분에서 arg 변수를 PrimeCallbackArg으로 형변환 했는데 왜 해야하는 것인가요??
        }
        static void SumPrime(object sender, CallbackArg arg)
        {
            Sum += (arg as PrimeCallbackArg).Prime; // 이 부분에서 Prime을 Sum에다가 추가를 했는데 이건 메서드의 추가인건가요?? 아니면 그냥 단순히 숫자의 증가를 의미하는 건가요??
        }
        static void Main(string[] args)
        {
            PrimeGenerator gen = new PrimeGenerator();
            PrimeGenerator.PrimeDelegate callprint = PrintPrime;
            gen.AddDelegate(callprint); // 이 부분이 gen이라는 것에 PrintPrime 기능을 추가하기 위한 것인가요??
            PrimeGenerator.PrimeDelegate callsum = SumPrime;
            gen.AddDelegate(callsum); // 이부분도 gen이라는 것에 SumPrime을 추가하기 위한 것인가요?
            gen.Run(10);
            Console.WriteLine();
            Console.WriteLine(Sum);
            gen.RemoveDelegate(callsum); //여기서 SumPrime기능을 제거하기위해서 작성한 것이고 아래는 그 결과를 출력하기 위한 것 같은데 왜 제거한 것인가요? 제거를 하면 어느 부분에서 달라지는 건가요? 아래 부분은 위에 기능을 제거를 안한 것과 출력결과가 똑같은 것 같은데 말이죠;
            gen.Run(15);
        }
    }
}
        
        
                    
                    
                    
                    
                    
    
                    
                    
                    
                    
                    
                
                    [최초 등록일: ]
                    [최종 수정일: 1/11/2017]