2012-07-01 39 views
0

可能重複:
Differences in string compare methods in C#如何以正確的方式將字符串與文本進行比較?

我知道,在C#字符串對象,比較兩個字符串時,我剛剛瞭解CompareTo方法。但是如果我需要將字符串與特定文本值進行比較呢?

現在我這樣做:

private string choice; 

[...some code...] 

if (choice == "1") 
     { 
      Console.WriteLine("You choose 1"); 
      Console.ReadLine(); 
     } 
     else if (choice == "2") 
     { 
      Console.WriteLine("You choose 2"); 
      Console.ReadLine(); 
     } 
etc... 

和它的作品只是因爲我想要的。但它是好的編碼嗎?無法找到關於此特定主題的任何信息。

+0

考慮使用'之開關語句。 –

+1

你可能想在第一種情況下輸出「你選擇了1」:) –

+0

thx符文。 Metro Smurf:我看到了這個問題,但我的情況並沒有出現在這個話題中。 – Christoffer

回答

1

您可以安全地將字符串引用與字符串文字進行比較。

有一些邊緣的情況下編譯時事項

string a = "this is a"; 
string b = a; 
string c = "this is " + x; //x has the value of 'a' 
string d = "this is a"; 
object oa = a; 
object ob = b; 
object oc = c; 
object od = d; 

console.WriteLine(a == b); //will print true 
console.WriteLine(a == c); //will print true 
console.WriteLine(c == b); //will print true 

console.WriteLine(oa == ob); //will print true 
console.WriteLine(oa == oc); //will print false 
console.WriteLine(oa == od); //will print true 

在福斯特三行是一個值比較,並且只要該字符串對象的值是相同的,結果將是正確的。

在最後三行中,它是一個引用比較,因爲變量的編譯時間類型是對象。

a和b將成爲相同的對象,所以第一次比較將返回true。然而oa和oc不會是同一個對象。編譯器無法確定它們實際上是相同的字符串值。最後一行也將返回true。這是因爲編譯器會在編譯時意識到a和d具有相同的字符串值,因此只會創建一個字符串對象。它可以安全地執行此操作,因爲字符串在C中是不可變的。

+0

在你的例子中,x沒有賦值,特別是不是 –

+0

@MareInfinitus因此評論指出值是「a」它如何變得與示例無關 –

+0

爲什麼你不提供一個完整的例子?它甚至不會寫。我仍然認爲,即使它可能在特殊情況下工作,「==」在C#中也不是一種很好的比較方式。 –

4

通常比使用內置比較機制 比較字符串更好,因爲它們對您正在執行的操作做出明確聲明。

例如:

public void Compare() 
{ 
    string s1 = "2"; 
    string s2 = "" + 2; 
    string.Equals(s1, s2, StringComparison.InvariantCultureIgnoreCase); 
} 

大家可以看到這裏,你會忽略的情況下,文化這個比較是不 相關。

在你的特殊情況,我會考慮使用的TryParse,作爲 你會在這裏有一個整數:

int result; 

if (Int32.TryParse(s1, out result)) 
{ 
    // choice is valid 
} 
+0

我相當確定TryParse會比OP所使用的字符串比較慢得多。可能在這裏沒有太大的區別,因爲它看起來只比較了一次,但總的來說。 –

+0

它可能會比較慢,但代碼不會被執行那麼多,OP顯然是在這裏搜索整數值,而不是字符串,因此是插件提示。 –

相關問題