2010-11-20 5 views
4

누군가 제발 설명해주세요 ... (C# 람다 식)

의 차이점

Func<string,int> returnLength; 
returnLength = (string text) => { return text.Length; }; 
Console.WriteLine (returnLength("Hello")); 

 string str = "Hello"; 
    Console.WriteLine (str.Length); 

그 중 하나를 사용하는 장점은 무엇입니까?

+1

이것은 'x ++'와 'x = Add (x, 1)'의 차이점을 묻는 것과 같습니다. 둘 다 동일한 결과를 산출합니다. 위의 게시물에 제공된 정보가 충분하지 않아서 전화를 걸기가 쉽지 않습니다. – ja72

+1

짧은 답변은 차이가 없습니다! 당신이 여기서 언급 한 것은 단지 예시 일 뿐이므로 질문을 다시 말해야 할 것입니다. 람다 (Lambdas)의 위치와 사용 장소를 더 잘 이해하고 싶습니까? –

+0

+1 jalexiou, hahaha 재미있는 질문. 그러나 기술적으로 말하자면 : '...와 단순한 것의 차이점은 무엇입니까?': 방법 1을 실행하면 여분의 구체적인 유형이 정의되고 초기화됩니다. b) 비용이 최소 4 개 더 많습니다. IL 연산 코드 2 번 (둘 다 문자열 리소스를 Hello로 정의하므로 차이가 없습니다) '그 중 하나를 사용하면 어떤 이점이 있습니까?' 음 ...이 사람은 나를 미안하게 만듭니다. – user44298

답변

2

이 질문은 람다 식을 일반적으로 대리자를 사용할 때와 같이 사용할 때가 아닙니다. 대답은 행동을 캡슐화하고 전달하는 방법으로 델리게이트를 사용한다는 것입니다. 즉 유용한 곳의

예 : (예 : 버튼 클릭으로 가장 일반적인 예는 사용자 인터페이스 이벤트 인)

  • 이벤트 핸들러
  • 비동기 작업 콜백 ("당신이 끝나면이 코드를 실행) "스레드가 생성 된 경우,이 코드를 실행"(새 스레드를 시작)
  • 을 '이 술어를 사용하여 필터링을 수행
0 "()
  • LINQ 작업"웹 페이지를 다운로드

    이 모두는 일 수 있습니다. 대신 인터페이스를 사용해야합니다. 대리자는 여러 가지면에서 단일 메서드 인터페이스와 유사합니다. 그러나 대리자는 인터페이스를 구현하거나 개별 메서드를 사용하거나 익명 메서드 또는 람다 식으로 논리를 인라인으로 표현하는 것보다 유연하게 대리자를 만들 수 있기 때문에 대리자를 사용하는 경우가 많습니다.

  • +0

    감사합니다, 전 예제 코드는 당신의 책에서 가져온 것입니다 :) – yonan2236

    +0

    @ yonan2236 : 설명합니다. 저는 종종 * syntax *를 설명하기 위해 간단한 예제를 사용합니다. 그러나 그 예제는 종종 여러분이 * 실제로 * 사용하는 곳과 별개입니다 . –

    0

    내가 뭔가를 놓치지 않는 한, 후자는 훨씬 더 명확하고 단순 해 보입니다. 왜 람다를 사용하여 복잡한 일을 할 수 있습니까?

    +0

    그것은 단지 예입니다. – yonan2236

    2

    람다는 Length 회원에 대한 액세스를 하드 코딩하는 대신 다른 기능으로 전달할 수있는 기능을 제공합니다.

    +0

    예, 그렇지만 * 길이 멤버에 액세스하는 것을 하드 코딩하지 않으실 이유가 무엇입니까? 람다는 문자열에서만 작동합니다 ... 처음부터 정확하게 다재다능한 것은 아닙니다. – mpen

    +0

    @ 마크, 나는 OP가 단지 사소한 예를 사용하고 있다고 확신한다. 특정 코드보다는 오히려 개념에 집중하십시오. –

    +0

    @ 마크 : 문자열을 정수로 변환하는 함수가 필요할 수도 있습니다. 또는 특정 하위 문자열이 표시된 횟수를 나타내는 값입니다. 파이썬의'list.sort()'의'key' 인자를 생각해보십시오. http://docs.python.org/library/stdtypes.html#mutable-sequence-types –

    2

    기술적으로 두 옵션 모두 작동합니다. 그러나 여러 이유로 선택할 수 있습니다. 그러나이 사람은 나에게 가장 중요한 것 같다

    단순성, 가독성, 유지 보수 - 일부 람다 표현, 특히 LINQ의 사람이, 자신의 비 람다 제품보다 더 짧고 유지 보수입니다.

    이 경우 람다는 실제로 더 많은 공간을 사용하고있는 것으로 보입니다. 따라서 개인적으로 두 번째 옵션을 선호합니다. 그러나, 다른 경우에는 람다가 더 나은 선택입니다.

    성능 측면에서 : 내가 아는 한, 람다는 조금 느립니다. 물론,이 상황에서 그 차이는 무시할 수 있습니다.

    0

    두 번째 코드는 적은 코드로 동일한 결과를 산출하므로 더 유리합니다. 더 이해하기 쉽고 유지 보수가 용이합니다. 당신이 언급하지 않은 람다에 대한 필요가 없다면, 나는 더 복잡한 버전으로 갈 이유가 없다.

    0

    Func 메서드를 사용하는 코드는 개념 증명 일 뿐이며 람다 식과 함수가 무엇인지 보여줍니다. 당신은 문자열의 길이를 찾는 간단한 경우에 lamdas를 사용하지 않을 것입니다.
    Lamda 표현식과 함수는 문자열의 길이를 표시하는 것보다 훨씬 많은 작업을 수행합니다.

    둘째는 문자열의 길이를 검색하는 빠르고 비교적 최적화 된 방법입니다.

    로마로가는 길은 여러 가지가 있습니다. 그렇지만 여기에서 좌회전을 할 때 적도를 돌면되는 이유는 무엇입니까? 첫 번째는 단순히

    Func<string, int> returnLength = text => text.Length; 
    

    최초의 유용성과 같이 다시 할 수 있다는

    1

    참고가 위임이 필요한 곳을 일반적으로 람다를 제공하는 것처럼, 가장 일반적으로, LINQ를 사용하는 경우 사용할 수 있다는 것입니다 LINQ 기능을하는 많은 확장 메서드를 사용할 때.

    다른 상황에서는 논리 또는 동작을 캡슐화하는 또는 Action<> 매개 변수를 허용하는 메서드를 정의 할 수 있습니다. 호출자는 특정 논리가 무엇인지 지정할 수 있으며 모든 호출 수신자는 일부 논리를 제공해야합니다.

    +0

    호기심에서 벗어나'Func '대신'var'을 사용할 수 있습니까? 잠깐만 요. 당신이'text'의 접두어에'string'을 붙이면 어떨까요? – mpen

    +0

    @ 마크 - 정말 필요하지 않으면'var'의 팬이 아닙니다. 그러나이 경우 단순히'var'을 사용하는 것은'var returnLength = (Func ) (text => text)와 같은 캐스트를 제공하지 않는 한 에러입니다.길이); '보시다시피,이 경우에는 얻을 수있는 것이 없습니다. –

    +0

    저는 델리게이트와 람다 표현을 사용하는 것이 더 유리한 시나리오를 실제로 상상할 수 없습니다. – yonan2236