C#与VB.Net字符串比较的区别
我实际上是想回答这个问题,但由于这个问题非常复杂,并且不太可能很快得到很好的反应,我将尝试自己完成实施。 基本问题似乎是我跟随的C#示例没有直接转换为VB。
当检查lambda中的String比较BinaryExpression
时,VB将Expression.Method.DeclaringType
报告为具有CompareString
方法名称的CompareString
。 这显然是VB特有的。
Expression只是比较x.Content_Type ""
并在其上调用ToString返回{(CompareString(x.Content_Type, "", False) != 0)}
– 这似乎很合乎逻辑(CompareString docs here )。
有人可以向我解释VB和C#如何(甚至更好,为什么)处理字符串比较的方式不同。
我想如果我能得到答案,我应该能够解决另一个问题。
编辑:为了澄清,我正在实现一个自定义LINQ提供程序,它正在检查以下Where
调用:
Query.Where(function(x) x.Content_Type "")
或C#等价物……
query.Where(x=>x.Content_Type!="");
据我所知,2应该在function上相同
VB.NETinheritance了以前版本的Visual Basic中的Option Compare
语句。 为了实现这一目的,VB.NET中的所有字符串比较表达式都转换为辅助函数,该函数可以找出所选择的选项比较值在写入语句的特定源代码文件中的含义。
Operators.CompareString(string,string,bool)方法就是帮助函数。 最后一个参数名为“TextCompare”,如果Option Compare Text生效,VB.NET编译器会自动传递True,如果Option Compare Binary生效则自动传递。
C#没有那样的东西。
反编译CompareString
给出
public static int CompareString(string Left, string Right, bool TextCompare) { if (Left == Right) return 0; if (Left == null) return Right.Length == 0 ? 0 : -1; else if (Right == null) { return Left.Length == 0 ? 0 : 1; } else { int num = !TextCompare ? string.CompareOrdinal(Left, Right) : Utils.GetCultureInfo().CompareInfo .Compare(Left, Right, CompareOptions.IgnoreCase | CompareOptions.IgnoreKanaType | CompareOptions.IgnoreWidth); if (num == 0) return 0; return num > 0 ? 1 : -1; } }
从中可以看出,有一个自定义逻辑围绕null
(“在Visual Basic中Nothing
”,如副歌所说)处理,更重要的是,模式切换参数TextCompare
,它从有效的Option Compare
设置中获取其值。
也许明确地使用string
上的方法而不是比较运算符会帮助你。
关于’为什么’,好吧,VB(经典)在文化上总是更“做出明智的事”语言,而不是“完全按照我的意思告诉你,没有更多,没有更少”的C ++ / Win32哲学世界。 VB.NET和C#更接近,但仍然存在这样的差异。