developer tip

Expression 클래스의 목적은 무엇입니까?

copycodes 2021. 1. 7. 08:08
반응형

Expression 클래스의 목적은 무엇입니까?


대리자를 내부에 배치하는 Expression<>것과 그렇지 않은 것의 차이점이 정확히 무엇인지 궁금합니다 .

내가보고 있어요 Expression<Foo>존재가 LINQ로 많이 사용하지만, 지금까지 나는이 차이를 설명하고 어떤 기사를 찾을 수없는 한, 단지 대리자를 사용하여.

Func<int, bool> Is42 = (value) => value == 42;

Expression<Func<int, bool>> Is42 = (value) => value == 42;

람다를 대리자로 저장하면 일부 작업을 수행하는 대리자의 특정 인스턴스를 저장하게됩니다. 수정할 수 없습니다. 그냥 부르면됩니다. 대리인을 확보 한 후에는 수행하는 작업과 그렇지 않은 작업을 검사 할 수있는 옵션이 제한됩니다.

람다를 식으로 저장하면 대리자를 나타내는 식 트리가 저장됩니다. 매개 변수 변경, 몸체 변경 및 근본적으로 다른 작업을 수행하도록 조작 할 수 있습니다. 원하는 경우 호출 할 수 있도록 델리게이트로 다시 컴파일 할 수도 있습니다. 표현식을 쉽게 검사하여 매개 변수가 무엇인지, 무엇을하고 어떻게 수행하는지 확인할 수 있습니다. 이는 쿼리 공급자가 식을 이해하고 다른 언어로 번역하는 데 사용할 수있는 것입니다 (예 : 해당 식 트리에 대한 SQL 쿼리 작성).

또한 코드를 내보내는 것보다 식을 사용하여 동적으로 대리자를 만드는 것이 훨씬 쉽습니다. 더 높은 수준의 코드는 컴파일러가 낮은 수준으로 이동하는 대신 코드를 보는 방식과 매우 유사한 식으로 생각하고 코드를 IL 명령어로 볼 수 있습니다.

따라서 식을 사용하면 단순한 익명 대리자보다 훨씬 더 많은 작업을 수행 할 수 있습니다. 실제로 무료는 아니지만 정규 메서드 또는 익명 대리자에 비해 컴파일 된 식을 실행하면 성능이 저하됩니다. 그러나 표현 사용의 다른 이점이 중요 할 수 있으므로 문제가되지 않을 수 있습니다.


Func<>대리자 유형입니다. Expression은 선택적으로 런타임에 대리자로 컴파일 될 수 있는 전체 작업 트리의 런타임 표현입니다 . Linq-to-SQL과 같은 표현식 파서가 SQL 문을 생성하거나 다른 영리한 작업을 수행하는 것은이 트리입니다. Expression 형식에 람다를 할당하면 컴파일러는이 식 트리와 일반적인 IL 코드를 생성합니다. 표현식 트리에 대해 자세히 알아보십시오 .


다른 답변을 설명하기 위해이 두 표현식을 컴파일하고 컴파일러 생성 코드를 살펴보면 다음과 같이 표시됩니다.

Func<int, bool> Is42 = (value) => value == 42;

Func<int, bool> Is42 = new Func<int, bool>((@value) => value == 42);


Expression<Func<int, bool>> Is42 = (value) => value == 42;

ParameterExpression[] parameterExpressionArray;
ParameterExpression parameterExpression = Expression.Parameter(typeof(int), "value");
Expression<Func<int, bool>> Is42 = Expression.Lambda<Func<int, bool>>(Expression.Equal(parameterExpression, Expression.Constant(42, typeof(int))), new ParameterExpression[] { parameterExpression });

식 트리 노드를 나타내는 클래스가 파생되는 기본 클래스를 제공합니다.

System.Linq.Expressions.BinaryExpression
System.Linq.Expressions.BlockExpression
System.Linq.Expressions.ConditionalExpression
System.Linq.Expressions.ConstantExpression
System.Linq.Expressions.DebugInfoExpression
System.Linq.Expressions.DefaultExpression
System.Linq.Expressions.DynamicExpression
System.Linq.Expressions.GotoExpression
System.Linq.Expressions.IndexExpression
System.Linq.Expressions.InvocationExpression
System.Linq.Expressions.LabelExpression
System.Linq.Expressions.LambdaExpression
System.Linq.Expressions.ListInitExpression
System.Linq.Expressions.LoopExpression
System.Linq.Expressions.MemberExpression
System.Linq.Expressions.MemberInitExpression
System.Linq.Expressions.MethodCallExpression
System.Linq.Expressions.NewArrayExpression
System.Linq.Expressions.NewExpression
System.Linq.Expressions.ParameterExpression
System.Linq.Expressions.RuntimeVariablesExpression
System.Linq.Expressions.SwitchExpression
System.Linq.Expressions.TryExpression
System.Linq.Expressions.TypeBinaryExpression
System.Linq.Expressions.UnaryExpression

http://msdn.microsoft.com/en-us/library/system.linq.expressions.expression.aspx

Expression tree represents linq expression that can be analyzed and for example turned into SQL query.


Expression Trees allow you to inspect the code inside the expression, in your code.

For example, if you passed this expression: o => o.Name, your code could find out that the Name property was being accessed inside the expression.


To whatever the other wrote (that is completely correct) I'll add that through the Expression class you can create new methods at runtime. There are some limits. Not all the things you can do in C# can be done in an Expression tree (at least in .NET 3.5 . With .NET 4.0 they have added a great number of possible Expression "types"). The use of this could be (for example) to create a dynamic query and pass it to LINQ-to-SQL or do some filtering based on the input of the user... (you could always do this with CodeDom if all you wanted was a dynamic method incompatible with LINQ-to-SQL, but emitting directly IL code is quite difficult :-) )

ReferenceURL : https://stackoverflow.com/questions/7765932/whats-the-purpose-of-the-expression-class

반응형