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

Bas*_*sic 4 c# vb.net string-comparison

我实际上是想回答这个问题,但由于这个问题非常复杂,而且不太可能很快得到很好的回应,我将尝试自己完成实施.基本问题似乎是我所遵循的C#示例不直接转换为VB.

当检查字符串比较BinaryExpression的拉姆达,VB报告Expression.Method.DeclaringTypeMicrosoft.VisualBasic.CompilerServices.Operators用的方法名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应该在功能上相同

Han*_*ant 10

VB.NET继承了Option Compare以前版本的Visual Basic中的语句.为了实现这一目的,VB.NET中的所有字符串比较表达式都转换为辅助函数,该函数可以找出所选择的选项比较值在写入语句的特定源代码文件中的内容.

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

C#没有那样的东西.


Aak*_*shM 5

反编译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;
  }
}
Run Code Online (Sandbox Code Playgroud)

从中可以看出,有一个自定义逻辑null(" Nothing在Visual Basic中,作为副词)处理,更重要的是,一个模式切换参数TextCompare,它从有效Option Compare设置中获取其值.

也许,明确使用方法string,而不是一个比较运营商,将帮助你.

至于"为什么",嗯,VB(经典)在文化上总是更"做出明智的事"语言,而不是"完全按照我所说的那样,仅此而已,"C++/Win32的哲学世界.VB.NET和C#更接近,但仍然存在这样的差异.