2017-07-25 115 views
2

如何通過引用比較字符串,如在Java中?我知道C#的字符串與==的值進行比較。C#字符串/字符串:像Java中的比較字符串(通過引用)

Object.ReferenceEquals也不能正常工作,因爲如果C#將現有地址的字符串分配給新字符串(如果其內容已存在於內部池中)。

我讀過這篇文章,他們認爲這樣的:

Comparing VALUE and REFERENCE of types

string str = "hello"; 
string str2 = new StringBuilder().Append("he").Append("llo").ToString(); 

我希望發生的事情就是這個效果:

string s1 = "a"; 
string s2 = "a"; 
Console.WriteLine(s1 == s2); //False 
//Or 
Console.WriteLine(Object.ReferenceEquals(s1,s2)); //False 

然而,這對於上面的兩個字符串不是這種情況。如何在不使用StringBuilder的情況下達到相同的效果?

+0

StringBuilder有什麼問題? – shmosel

+3

如果你真的想讓你的代碼做到這一點(而且你不只是試驗),我會建議你的設計出現嚴重錯誤。最終的結果將難以理解,我相信在不破壞某些東西的情況下維護將更加困難。如果你真的想建立一個概念,其中即使字符串值相同,兩個對象也可能不同,定義一個具有順序ID號的類作爲第二個字段,或類似的東西。 – ajb

+0

我正在嘗試爲TexBox創建填充文本,例如「在此輸入」。我想查看「Type Here」是否與我的字符串具有相同的引用,所以我區分用戶何時有意輸入「Type Here」。這樣,我不會將用戶字符串視爲填充文本。 @ajb –

回答

0

你可以簡單地使用new

char[] charArray = new char[3]; 
charArray[0] = 'a'; 
charArray[1] = 'b'; 
charArray[2] = 'c'; 

string s1 = new string(charArray); 
string s2 = new string(charArray); 
Console.WriteLine(Object.ReferenceEquals(s1, s2)); 

Runnable的例子:https://ideone.com/H1O16q

這部作品的原因是因爲new總是創建給定類型的新實例沒有做任何的內化。就我所知,每個主要的OOP語言都以這種方式表現。

1

您可以使用String.Copy創建一個新的實例:

string s1 = "a"; 
string s2 = String.Copy(s1); 
Console.WriteLine(Object.ReferenceEquals(s1,s2)); //False 
+0

請注意,這絕不會幫助OP來實現檢測用戶輸入以匹配幻影文本...... –

-2

在C#中,字符串是不可變的引用類型。因此,它具有與價值類型相似的行爲(例如:在此處爲您的示例)。但字符串生成器是純粹的引用類型。

所以,你不能使用字符串來比較引用,但你可以使用stringbuilder。

StringBuilder p = new StringBuilder("test"); 
     StringBuilder q = new StringBuilder("test"); 

     Console.WriteLine(p == q); //false 
+0

類型是不可變的,並且行爲像一個值之間絕對沒有關係......並且比較字符串作爲參考(如果有某些特定的原因 - 這似乎不是這個問題的情況)。 –

+0

@AlexeiLevenkov我從來沒有看到比較字符串作爲參考的好理由。也許有人會在某種程度上讓我感到驚訝,那就是最好的方法。但我懷疑它。 – ajb

+0

@AlexeiLevenkov在程序員的觀點上,字符串不應該作爲參考比較。 99%的時間,我們需要字符串作爲價值,它應該能夠比較容易。我完全同意ajb。 – Hiran