2017-11-26 17 views
0

대리인의 인스턴스를 만드는 것이 무엇인지 궁금합니다. 나는 그들이 함수 포인터라는 것을 알고 있지만 위임 인스턴스를 사용하는 목적은 무엇입니까? 항상 람다를 사용하는 말인가 첫번째 생각에서대리인 인스턴스 대 함수 전달 직접

public delegate bool IsEven(int x); 

class Program 
{ 
    static void Main(string[] args) 
    { 
     int[] nums = new int[] { 1, 3, 4, 5, 6,7, 8, 9 }; 

     // creating an instance of delegate and making it point to 'CheckEven' function  
     IsEven isEven = new IsEven(CheckEven); 

     // using delegate for parameter to get sum of evens 
     int tot1 = Sums(nums, isEven); 

     // passing in the function directly as parameter and not delegate instance 
     int tot2 = Sums(nums, CheckEven); 

     // using lambda expressions 
     int tot3 = Sums(nums, x=> x%2==0); 

     ReadKey(); 
    } 

    public static int Sums(int[] nums, IsEven isEvenOdd) 
    { 
     int sum = 0; 

     foreach(int x in nums) 
     { 
      if (isEvenOdd(x)) 
       sum += x; 
     } 

     return sum; 
    } 

    public static bool CheckEven(int x) 
    { 
     if (x % 2 == 0) 
      return true; 
     else 
      return false; 
    } 
} 

는 복잡한 구현이없는 전달할 것 기능의 기능 그렇지 않으면 왜 그냥 직접 내 기능을 통과하지 않는다면 좋은 생각처럼 보인다 매개 변수? 또한 람다 (Lambdas)를 사용하면 대표자들과 같이 새로운 방법을 만드는 것에 반대하여 확률의 합을 계산하는 것이 훨씬 쉽습니다.

+0

_ "매개 변수로 메소드를 직접 사용하는 것이 무엇입니까?"- 위에서 게시 한 코드를 컴파일 했습니까? 그것이 있어야하고, 그렇게 할 때 분명히 그 질문에 "아무것도"대답하지 않아야합니다. 그것은 효과가 있었기 때문에 아무것도 멈추지 않았습니다. 솔직히 말해서, 당신이 무엇을 요구하고 있는지 명확하지 않습니다. –

+2

여러분의 질문은 주로 의견을 바탕으로 한 것이지만, new 연산자를 사용하든 메서드 이름을 제공하든 똑같은 일이 발생한다는 것을 이미 알고 있다고 가정합니다. 새 대리자 인스턴스가 생성됩니다. 후자는 컴파일러가'새로운 IsEven (CheckEven)'을 채워서 암묵적으로 그렇게합니다. 이해할 수 없다면 사용 가능한 문서를 읽는 데 집중해야합니다. 여기에 질문이 너무 광범위 할 수 있으므로 (프로그래밍 언어의 작동 방식에 대한 자습서를 제공하는 곳이 아닙니다.) –

+2

나는 델리게이트 인스턴스를 사용하는 것이 무엇인지 물어봐야한다고 생각한다. – Cosmik11

답변

0

메서드를 직접 전달한 경우에도 대리자를 이미 사용했지만 위임 정의에 따라 기대 값이 설정되지 않은 경우 Sums 메서드는 메서드 이름을받을 수 없습니다.

(그러나 더 복잡한 시나리오에서, 물론 당신이 여기 람다를 사용할 수 있습니다)

public static bool CheckOdd(int x) 
    { 
     if (x % 2 != 0) // here changed 
      return true; 
     else return false; 
    } 

:

당신이 당신의 CheckEven 방법 또는이 방법 중 하나를 보낼 수 있습니다 public delegate bool EvenOddStatus(int x);

에 위임 이름을 변경 고려

이제 Sums 메서드는 호출 코드 (CheckEven 또는 CheckOdd 전달)를 기준으로 홀수 또는 짝수 중 하나를 합산 할 수 있습니다.

대리인은 메소드에 대한 포인터입니다. 코드에서 메소드가 수신 및 리턴 할 방법을 정의하고, 호출 코드는 나중에 메소드 또는 위임 중 하나 인 사전 정의 된 구현을 전달할 수 있습니다.

귀하의 Main이 무엇을 합산 할 지 모르는 다른 방법 인 경우는 어떻게됩니까? 호출 코드에서 스택까지 위임자를 갖게됩니다.