programing tip

식의 차이

itbloger 2020. 10. 17. 10:04
반응형

식의 차이> 및 Func <>


이 질문에 이미 답변이 있습니다.

예를 들어, 대부분의 LINQ 연산자는 왜 Expression<Func<TSource>>그에 상응하는 값을 수락 Func<TSource>합니까?

Expression람다 구문 대신 일반 클래스 를 사용하는 이점 / 이유는 무엇입니까 ?


를 사용 Expression<T>하면 명시 적으로 표현식 트리가 생성 됩니다. 이는 쿼리를 구성하는 코드를 마치 데이터 인 것처럼 처리 할 수 ​​있음을 의미합니다.

그 이유는 LINQ 공급자 (예 : LINQ to SQL)가 쿼리 자체를 검사하여 C # 식을 T-SQL 쿼리로 변환하는 가장 좋은 방법을 결정하기 때문입니다. 표현식 트리를 사용하면 코드를 데이터로 볼 수 있으므로 공급자가이를 수행 할 수 있습니다.


요약하면 둘 사이의 주요 차이점은 다음과 같습니다.

  • Expression<Func<...>>되는 식 트리 원본 소스 코드를 나타내고, (아주 근접 원래 C # 코드이다 데이터 트리 구조에 저장된다). 이 형식에서는 소스 코드를 분석 할 수 있으며 LINQ to SQL과 같은 도구는 식 트리 (소스 코드)를 다른 언어 (예 : LINQ to SQL의 경우 SQL이지만 JavaScript 등을 대상으로 지정할 수도 있음)로 변환 할 수 있습니다.

  • Func<...>실행할 수있는 일반 대리자입니다. 이 경우 컴파일러는 표준 메서드를 컴파일 할 때와 마찬가지로 함수 본문을 IL (중간 언어)로 컴파일합니다.

런타임에 표현식을 컴파일하고를 생성 Expression<..>하는 Compile메서드가 Func<...>있으므로 첫 번째에서 두 번째로 변환 (일부 성능 비용 포함) 이 있음을 언급 할 가치가 있습니다. 그러나 IL을 얻으면 원래 소스 코드를 재구성하는 것이 매우 어렵 기 때문에 (불가능) 두 번째 코드에서 첫 번째 코드로의 변환이 없습니다.


Func<T> 실행 가능한 함수를 만듭니다.

Expression<Func<T>> 함수의 코드를 데이터로 사용할 수있는 표현식 트리를 만듭니다.

식 트리를 사용하면 .NET 코드에서 기본 호출을 생성하여 LINQ to SQL 및 LINQ to XML과 같은 작업을 수행 할 수 있습니다.


An Expression<Func<>>은 아직 코드로 변환되지 않은 함수의 표현입니다. A Func<>는 실제 실행 가능한 함수입니다. 전자를 사용하면 표현식을 호출 할 때 적절한 함수로 바꿀 수 있습니다. 예를 들어 LINQ to SQL을 사용하면 SQL 문을 실행하고 지정된 내용을 반환하는 동등한 코드로 변환됩니다. LINQ to 개체를 사용하면 CLR을 사용하여 클라이언트에서 코드를 실행합니다. A Func<>는 항상 CLR에서 실행되며 실행 가능한 코드입니다.

참고 URL : https://stackoverflow.com/questions/2664841/difference-between-expressionfunc-and-func

반응형