2011-10-08 6 views
1

다음과 같은 델리게이트가 있습니다.바이트 배열을 람다 식으로 수정하는 대리인을 전환 할 수 있습니까?

public delegate byte[] CopyPixelOperation(byte[] pixel); 

비트 맵의 ​​각 픽셀을 반복하고 수정하는 함수에 임의의 연산을 삽입 할 수 있습니다. 위임의 구현 예제는 다음과 같습니다.

CopyPixelOperation greenify = delegate(byte[] pixel) 
           { 
             int redValue = pixel[2]; 
             int greenValue = pixel[1]; 
             int blueValue = pixel[0]; 

             pixel[1] += 10; 
             pixel[0] -= 10; 
             pixel[2] -= 10; 

             return pixel; 
           }; 

람다 식에서는 조금 불안정합니다. 식 내부에서 배열의 개별 요소를 참조하는 방법을 모르겠습니다. 가능한가? 그것은 의미가 있습니까, 아니면 그냥 그대로 두어야합니까?

+0

람다를 사용하는 것이 더 간결 할 수 있지만 코드를 검토하고 모든 익명 함수를 바꾸는 이유는 없습니다. int o lambdas. 그러나 새 코드에서는 lambdas를 사용하는 것이 좋습니다. – svick

답변

2

delegate() 구문과 람다 모두 구문이 다른 것은 아닙니다. 최소한 delegate 키워드를 삭제하고 => 연산자를 추가해야합니다. 다음 람다로 대리자를 표현할 수 :

CopyPixelOperation greenify = (byte[] pixel) => 
{ 
    int redValue = pixel[2]; 
    int greenValue = pixel[1]; 
    int blueValue = pixel[0]; 

    pixel[1] += 10; 
    pixel[0] -= 10; 
    pixel[2] -= 10; 

    return pixel; 
}; 

것은 그것을 더 단순화하기 위해, 당신은 인수가 너무 (byte[] pixel)pixel이되고, 그 유형이 CopyPixelOperation 대리자 형식에서 유추됩니다 입력 생략 할 수 있습니다.

+1

그리고 구문 적으로 다른 것은 아니지만, * 표현식 *을 사용하지 않으면 런타임에 전혀 다르지 않습니다. 둘 다 동일한 유형의 실행 코드에 대한 위임자입니다. –

4

예, 람다 식을 사용할 수 있습니다.하지만 개인적으로는 그렇지 않을 수도 있습니다. 당신이 그것을 필요로 할 때

public static byte[] Greenify(byte[] pixel) 
{ 
    int redValue = pixel[2]; 
    int greenValue = pixel[1]; 
    int blueValue = pixel[0]; 

    pixel[1] += 10; 
    pixel[0] -= 10; 
    pixel[2] -= 10; 

    return pixel; 
} 

쉽게 대리자 메서드 그룹 변환을 사용하는 방법에 해당하는를 만들 수 있습니다 : 그건 방법를 대신 작성하는 좋은 장소처럼 보인다

CopyPixelOperation operation = Greenify; 

또는 (메소드 호출 인수로) :

var result = Apply(Greenify).Then(Save); // Or whatever 

병렬 foreach 또는 컨텍스트를 캡처해야하는 상황에서 일반적으로 긴 익명 함수를 사용하는 방법을 선호합니다.

0

내가 아는 한, 람다와 델리게이트는 거의 동일합니다. 문법 이외의 유일한 차이점은 람다가 암시 적으로 입력 될 수 있다는 것입니다. 그것은 더 읽을 수있는 최대 당신의 :

CopyPixelOperation greenify = delegate(byte[] pixel) 
          { 
            int redValue = pixel[2]; 
            int greenValue = pixel[1]; 
            int blueValue = pixel[0]; 

            pixel[1] += 10; 
            pixel[0] -= 10; 
            pixel[2] -= 10; 

            return pixel; 
          }; 

또는

CopyPixelOperation greenify = pixel => 
          { 
            int redValue = pixel[2]; 
            int greenValue = pixel[1]; 
            int blueValue = pixel[0]; 

            pixel[1] += 10; 
            pixel[0] -= 10; 
            pixel[2] -= 10; 

            return pixel; 
          }; 

또한 그 CopyPixelOperation이

Func<byte[], byte[]> 

수 있습니다주의 (또한 당신의 방법이 사용되지 않습니다 값을 저장 것을 알 수 있습니다.)

관련 문제