0

重複の可能性:
C#の文字列比較メソッドの違い

C#では文字列がオブジェクトであることを知っています。2つの文字列を比較するときに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...

そして、それは私が望むように機能します。しかし、それは良いコーディングですか?この特定のトピックに関する情報が見つかりません。

4

2 に答える 2

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
}
于 2012-07-01T19:50:43.880 に答える
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

最初の3行は値の比較であり、文字列オブジェクトの値が同じである限り、結果はtrueになります。

最後の3行では、変数のコンパイル時タイプがオブジェクトであるため、これは参照比較です。

aとbは同じオブジェクトになるため、最初の比較ではtrueが返されます。ただし、oaとocは同じオブジェクトにはなりません。それらが実際に同じ文字列値であるとコンパイラが判断する方法はありません。最後の行もtrueを返します。これは、コンパイラがコンパイル時にaとdが同じ文字列値を持っていることを認識し、そのため1つの文字列オブジェクトのみを作成するためです。文字列はC#で不変であるため、これを安全に行うことができます

于 2012-07-01T19:44:09.720 に答える