C#和VB.Net字符串比较的区别

4
我实际上正在尝试回答this question,但由于这非常复杂且不太可能迅速获得良好的响应,我将尝试自己解决实现问题。根本问题似乎是我遵循的C#示例无法直接转换为VB。
当在lambda中检查字符串比较BinaryExpression时,VB报告Expression.Method.DeclaringType为Microsoft.VisualBasic.CompilerServices.Operators,并具有方法名CompareString。这显然是VB特定的。
表达式只是比较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!="");

据我所知,这两个应该在功能上是相同的。

你的VB和C#表达式的实际内容是什么? - Andrew Barber
5
也许是因为Option Compare语句。在VB.NET中,您可以进行大小写不敏感的比较(Option Compare Text)。默认情况下是Option Compare Binary,就像在C#中一样。 - Tim Schmelter
@AndrewBarber 我已经更新了我的问题,并提供了调用的详细信息。 - Basic
1
看看Hans的回答,但是C#的应该是query.Where(x=>x.Content_Type!="");吧? - Andrew Barber
@AndrewBarber,这就是我今天复制/粘贴失败的结果。你说得很对。 - Basic
2个回答

11

VB.NET继承了先前版本的Visual Basic的Option Compare语句。为使其生效,VB.NET中所有字符串比较表达式都会被转换为一个助手函数。该函数可以查找在编写该语句的特定源代码文件中所选Option Compare值是什么。

Operators.CompareString(string, string, bool)方法就是这个助手函数。最后一个参数名为"TextCompare",如果Option Compare Text生效,则VB.NET编译器会自动传递True,如果Option Compare Binary生效,则会传递False。

C#没有类似的功能。


谢谢 - 至少现在我明白发生了什么。我感觉到我的未来会有另一个 if 块... - Basic

6

反编译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上使用method而非比较operator会对你有所帮助。

至于为什么,好吧,VB(经典版)一直是一种更文化化的“做合理的事情”的语言,与C++ / Win32世界的“精确地按照我的指示去做,不多不少”哲学相反。VB.NET和C#更接近了,但这样的差异仍然存在。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接