2013-04-19 1 views
49

표현식 트리에서 작동하는 라이브러리가 있습니다. 라이브러리는 식 트리가C#과 VB.Net 사이의 표현 트리 차이점

  • 문자열 비교
    () => "a" == "b"을 구성하는 방법에 대한 언어 사이에 약간의 차이를 드러내 C# 및 VB.Net

    모두 작업해야하는 Expression.Equals("a", "b")
    Function() "a" = "b"Expression.Equals(Expression.Call(CompareString, "a", "b"), 0)
    을하게된다 VB.Net에서 CompareString을 사용하는 이유는 여기에 있습니다.

  • Str ING의 연결
    () => "a" + "b"Expression.Add("a", "b", String.Concat)
    Function() "a" & "b"Expression.Call(String.Concat, "a", "b")

  • 최적화를하게된다?
    () => !(1 == 2)Expression.Not(Expression.Equals(1, 2))
    Function() Not (1 = 2)된다 Expression.NotEqual(1, 2)

내 라이브러리가 모든 차이를 처리하게하지만 밖으로 볼 필요가 더 차이가 입니까?

편집 내 코드의 설명.

var filter = document.Filter; 
filter.LeftParanthesis(); 
filter.Column(columnNumber); 
filter.Equals(); 
filter.Value("abc"); 
filter.RightParanthesis(); 
filter.And(); 
filter.LeftParanthesis(); 
... 
document.Refresh(); 

이 쉽게 내 코드는 당신이 Expression<Func<bool>> 람다와 같은 필터를 지정할 수있는 필터를 사용할 수 있도록하려면 :

내가 작업 시스템은이 같은 지정 문서 필터가 있습니다.

Expression<Func<bool>> filter =() => (123.AsStringColumn() == "abc") && (...); 
filter.Apply(document); 

내 코드는 표현 트리를 반복하고 위에서 지정한대로 문서 필터 메소드를 호출합니다. 필터는 람다에 넣을 수있는 모든 것을 지원하지 않습니다. 메서드 호출이 가장 확실합니다.

VB.Net은 C#이 인터셉트하고 다르게 처리해야하는 경우가 종종 있습니다.

+20

캡쳐 된 변수, 익명 유형 및 불투명 식별자 ('let')는 아마도 약간의 사랑이 필요할 것입니다. –

+0

@Marc 이름이 다를 수도 있지만 트리가 다르게 보이기를 기대합니까? – adrianm

+3

VB.NET에서'option strict off'로 암시 적 변환을 찾으십시오. C#이 지원하지 않기 때문에 실제로는 차이가 없지만 처리에 관심이있을 수있는 추가 호출이있을 수 있습니다. –

답변

6

/ 나누기 연산자는 C#과 VB에서 다르게 작동합니다.

() => 1/2Expression.Divide(1, 2)
Function() 1/2되고 당신은 정수 나누기에 대한 \ 연산자를 사용해야 VB에서 Expression.Divide(Expression.Convert(1, Double), Expression.Convert(2, Double))

된다 : VB는 항상 부동 소수점 값을 피연산자로 변환하면서 C#으로는, 사용되는 데이터 유형에 적응 C#에서 / 연산자와 같은 것을 얻으려면 부동 소수점 나누기를 /으로 지정하십시오.

+0

감사합니다. 나는 그것을 처리하는 가장 좋은 방법은 (나를 위해) 변환 오류 메시지에서 언급하는 것입니다 생각합니다. – adrianm

+0

@DaveMarkle : 무엇? – Guffa

+1

죄송합니다. VB의 단점은 나를 미친 듯이 몰아 넣는다 - 내 말은 - 뒤로 쓰러진 것? 맙소사! –

2

나는 C#과 VB.Net을 자주 사용하여 프로젝트와 관련이 있으며, VB.Net이 안전하지 않은 모드에있을 때 보았던 대부분의 차이점이 있습니다. ie 우리가 VB를 만들면.닷넷 타입 안전 (Option strict on, 옵션 explicite on ... 옵션 모두) C#처럼 작동합니다.