簡體   English   中英

為什么String.Equals返回false?

[英]Why String.Equals is returning false?

我有以下C#代碼(來自我正在使用的庫),試圖查找比較指紋的證書。 請注意,在以下代碼中, mycert.ThumbprintcertificateThumbprint都是字符串。

var certificateThumbprint = AppSettings.CertificateThumbprint;

var cert =
    myStore.Certificates.OfType<X509Certificate2>().FirstOrDefault(
      mycert => 
      mycert.Thumbprint != null && mycert.Thumbprint.Equals(certificateThumbprint)
      );

這無法找到帶有指紋的證書,因為即使字符串相等, mycert.Thumbprint.Equals(certificateThumbprint)也為false mycert.Thumbprint == certificateThumbprint也返回false ,而mycert.Thumbprint.CompareTo(certificateThumbprint)返回0。

在此處輸入圖片說明

我可能會遺漏一些顯而易見的東西,但是我無法弄清楚為什么Equals方法失敗了。 有想法嗎?

CompareTo忽略某些字符:

static void Main(string[] args)
{
    var a = "asdas"+(char)847;//add a hidden character
    var b = "asdas";
    Console.WriteLine(a.Equals(b)); //false
    Console.WriteLine(a.CompareTo(b)); //0
    Console.WriteLine(a.Length); //6
    Console.WriteLine(b.Length); //5

   //watch window shows both a and b as "asdas"
}

(在這里,添加到a的字符是U+034F ,組合字素連接。)

調試模式

因此,CompareTo的結果不能很好地表明Equals中存在錯誤。 您出現問題的最可能原因是隱藏字符。 您可以檢查長度以確保。

請參閱以獲取更多信息。

您可能希望嘗試使用String.Equals的重載,該重載接受StringComparison類型的參數。

例如:

myCert.Thumbprint.Equals(certificateThumbprint, StringComparison.[SomeEnumeration])


[SomeEnumeration]被以下枚舉常量之一替換的地方:

 - CurrentCulture
 - CurrentCultureIgnoreCase
 - InvariantCulture
 - InvariantCultureIgnoreCase
 - Ordinal
 - OrdinalIgnoreCase


參考在此處找到的MSDN文檔。 在此處輸入圖片說明

有時,當我們在數據庫中插入數據時,它會存儲一些空間,例如“問題” 並且當您嘗試將其與“問題”進行比較時,它將返回false。 所以我的建議是:請檢查數據庫中的值或使用Trim()方法。

在您的情況下,請嘗試: mycert.Thumbprint!= null && mycert.Thumbprint.trim()。equals(certificateThumbprint.trim())

我認為如果存在任何記錄,它將返回true。

暫無
暫無

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

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