簡體   English   中英

C#和VB.Net字符串比較的區別

[英]Difference between C# and VB.Net string comparison

我實際上是在嘗試回答這個問題,但由於這非常復雜,而且不太可能很快得到很好的回應,我將嘗試自己制定實施方案。 基本問題似乎是我所遵循的 C# 示例沒有直接轉換為 VB。

在檢查 lambda 中的字符串比較BinaryExpression時,VB 報告Expression.Method.DeclaringTypeMicrosoft.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!="");

據我所知,2 應該在功能上相同

VB.NET 從以前版本的 Visual Basic 繼承了Option Compare語句。 為了實現這一點,VB.NET 中的所有字符串比較表達式都被轉換為一個輔助函數,該函數可以找出在編寫該語句的特定源代碼文件中所選的 Option Compare 值是什么。

Operators.CompareString(string, string, bool) 方法就是這個輔助函數。 最后一個參數被命名為“TextCompare”,如果選項比較文本有效,VB.NET 編譯器會自動傳遞 True,如果選項比較二進制有效,則 False 。

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# 更接近,但仍然存在這樣的差異。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM