C#和VB.Net之间的expression式树的区别
我有一个图书馆工作expression树。 该库需要使用C#和VB.Net
注意到语言之间在如何构buildexpression式树的一些区别
-
string比较
() => "a" == "b"
变成Expression.Equals("a", "b")
Function() "a" = "b"
变成Expression.Equals(Expression.Call(CompareString, "a", "b"), 0)
(我明白为什么VB.Net在这里使用CompareString) -
string连接
() => "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)
我的图书馆处理所有这些差异,但有更多的差异,我需要注意的?
编辑我的代码的一些解释。
我使用的系统有一个你指定的文件filter,如下所示:
var filter = document.Filter; filter.LeftParanthesis(); filter.Column(columnNumber); filter.Equals(); filter.Value("abc"); filter.RightParanthesis(); filter.And(); filter.LeftParanthesis(); ... document.Refresh();
为了更容易使用filter,我的代码允许您将filter指定为Expression<Func<bool>>
lambda。
Expression<Func<bool>> filter = () => (123.AsStringColumn() == "abc") && (...); filter.Apply(document);
然后,我的代码迭代expression式树并调用上面指定的文档filter方法。 filter不支持您可以放入lambda的所有内容。 方法调用是最明显的。
由于VB.Net在某些情况下生成方法调用,C#不需要拦截它们并以不同的方式处理它们。
/
division运算符在C#和VB中的工作方式不同。 在C#中,它适应所使用的数据types,而VB总是将操作数转换为浮点值:
() => 1 / 2
变成Expression.Divide(1, 2)
Function() 1 / 2
变成Expression.Divide(Expression.Convert(1, Double), Expression.Convert(2, Double))
在VB中,您将需要使用\
运算符进行整数除法和/
浮点除法以得到与C#中的/
运算符相同的值。
我不得不使用经常和我的项目相关的C#和VB.Net,以及当VB.Net处于不安全模式时我所看到的大部分差异。 即如果我们使VB.Nettypes安全(选项严格,选项显示在…选项全部)它将像C#一样工作。