[英]Difference between C# and VB.Net string comparison
我實際上是在嘗試回答這個問題,但由於這非常復雜,而且不太可能很快得到很好的回應,我將嘗試自己制定實施方案。 基本問題似乎是我所遵循的 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!="");
據我所知,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.