49 votes

Différences entre les arbres d’expression entre C # et VB.Net

J'ai une bibliothèque de travail sur l'expression des arbres. La bibliothèque besoin de travailler avec les deux C# et VB.Net

Remarqué quelques différences entre les langues sur la façon dont l'expression arbres sont construits

  • Comparaison de chaînes de caractères
    () => "a" == "b" devient Expression.Equals("a", "b")
    Function() "a" = "b" devient Expression.Equals(Expression.Call(CompareString, "a", "b"), 0)
    (Je comprends pourquoi VB.Net utilise CompareString ici)

  • La concaténation de chaîne
    () => "a" + "b" devient Expression.Add("a", "b", String.Concat)
    Function() "a" & "b" devient Expression.Call(String.Concat, "a", "b")

  • Optimisation?
    () => !(1 == 2) devient Expression.Not(Expression.Equals(1, 2))
    Function() Not (1 = 2) devient Expression.NotEqual(1, 2)

Ma bibliothèque de répondre à toutes ces différences, mais il y a plus de différences que j'ai besoin pour regarder dehors pour?

Modifier Une explication de ce que mon code ne.

Le système que je travail avec un filtre pour les documents que vous spécifiez comme ceci:

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

Pour le rendre plus facile à utiliser le filtre de mon code vous permet de spécifier le filtre en tant que Expression<Func<bool>> lambda.

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

Mon code puis parcourt l'arborescence d'expression et appelle le document les méthodes de filtrage comme indiqué ci-dessus. Le filtre n'ont pas de soutien pour tout ce que vous pouvez mettre dans une lambda. Les appels de méthode est la plus évidente.

Depuis VB.Net génère des appels de méthode, dans certains cas, où C# n'ai-je pas besoin de les intercepter et de les gérer différemment.

6voto

Guffa Points 308133

L'opérateur de division / fonctionne différemment en C # et en VB. En C #, il s’adapte aux types de données utilisés, alors que VB convertit toujours les opérandes en valeurs à virgule flottante:

() => 1 / 2 devient Expression.Divide(1, 2)
Function() 1 / 2 devient Expression.Divide(Expression.Convert(1, Double), Expression.Convert(2, Double))

En VB, vous devez utiliser l'opérateur \ pour la division entière et / pour la division à virgule flottante pour obtenir le même effet que l'opérateur / en C #.

2voto

Joymon Points 707

Je devais travailler avec C # et VB.Net fréquemment en relation avec mon projet et la plupart des différences que j'avais constatées lorsque VB.Net était en mode non sécurisé. C'est-à-dire que si nous faisons la typographie VB.Net (Option strict on, option explicite on ... option all on), cela fonctionnera comme C #.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X