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]