8

文字列が空かどうかを確認するには、使用します

var test = string.Empty; 
if (test.Length == 0) Console.WriteLine("String is empty!");
if (!(test.Any())) Console.WriteLine("String is empty!");
if (test.Count() == 0) Console.WriteLine("String is empty!");
if (String.IsNullOrWhiteSpace(test)) Console.WriteLine("String is empty!");
  1. 上記のステートメントはすべて同じ出力を生成します。使用する最適な方法は何ですか?

    var s = Convert.ToString(test);    
    s = test.ToString(CultureInfo.InvariantCulture);
    
  2. 繰り返しますが、どちらのステートメントも同じことを行います。使用する最良の方法は何ですか?

デバッグを試みましたが、C# ステートメントのパフォーマンスをベンチマークする方法は?

4

4 に答える 4

10

まず、4 つのステートメンがすべての入力に対して同じ出力を提供していません。null を試すと、最初の 3 つで例外がスローされます。そして、最後のスペースを試してみると、失敗した結果が得られます。ですから、自分が何を望んでいるのかを真剣に考える必要があります。通常、最善の方法は次のとおりです。

string.IsNullOrEmpty
string.IsNullOrWhiteSpace

これを数百万回実行している場合にのみ、コードをさらに最適化する方法を検討する必要があります。

ここにいくつかのテスト結果がありますが、これは .net バージョンによって異なる場合があります。

1 億回の反復のテスト結果:

Equality operator ==:   796 ms 
string.Equals:          811 ms 
string.IsNullOrEmpty:   312 ms 
Length:                 140 ms  [fastest]
Instance Equals:       1077 ms 

ソース

于 2012-11-07T09:19:46.057 に答える
3

I would go for String.IsNullOrWhiteSpace or String.IsNullOrEmpty.

Length, Count and Any could fail if test is null with object null reference]

Update

文字列がnullにならないことが確実でない限り、変数の長さや数をテストしたり、メソッドを呼び出したりする前に、文字列がnullかどうかを確認する必要があります。

これらのシナリオで.Lengthは、と同じではありませんString.IsNullOrWhiteSpace

string test = "    ";
test.Length == 0;  //false
String.IsNullOrWhiteSpace(test); //true
于 2012-11-07T09:18:57.353 に答える
1

私の知る限り:

.Any():配列内にオブジェクトが存在するかどうかをチェックする目的があります。文字列はcharの配列であるため、これは機能します。そして、Linqの一部です

.Length:charの配列の長さを指定することを目的としています。

したがって、はい、同じ動作ですが、意図が少し異なります。

ところで、String.IsNullOrWhitespace文字列が空であることを確認するために実際に使用する必要があります。少なくともそれが私の好みなので、空白文字の文字列が多い場合は、最初にトリミングする必要はありません。

于 2012-11-07T09:12:08.740 に答える
1

1 つの変数の場合、結果は次のようになります。

  1. String.IsNullOrEmpty(test)< String.IsNullOrWhiteSpace(test)<< test.Length==0<<< !(test.Any())≡<コード>test.Count() == 0
  2. test.ToString(CultureInfo.InvariantCulture)< Convert.ToString(test)(10回のオーダー)

上記をテストするために、次のコード スニペットを使用しました。

static void Main(string[] args)
    {
        var test = string.Empty;
        System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
        sw.Start();
        if (test.Length == 0)
        {
            sw.Stop();
            Console.WriteLine("String is empty!  " + sw.ElapsedTicks);
        }
        sw.Restart();
        if (!(test.Any()))
        {
            sw.Stop();
            Console.WriteLine("String is empty!  " + sw.ElapsedTicks);
        }
        sw.Restart();
        if (String.IsNullOrWhiteSpace(test))
        {
            sw.Stop();
            Console.WriteLine("String is empty!  " + sw.ElapsedTicks);
        }
        sw.Restart();
        if (String.IsNullOrEmpty(test))
        {
            sw.Stop();
            Console.WriteLine("String is empty!  " + sw.ElapsedTicks);
        }
        sw.Restart();
        if (test.Count() == 0)
        {
            sw.Stop();
            Console.WriteLine("String is empty!  " + sw.ElapsedTicks);
        }
        sw.Restart();
        var s = Convert.ToString(test);
        sw.Stop();
        Console.WriteLine("String is empty!  " + sw.ElapsedTicks);
        sw.Restart();
        s = test.ToString(CultureInfo.InvariantCulture);
        sw.Stop();
        Console.WriteLine("String is empty!  " + sw.ElapsedTicks);
        Console.ReadKey();
    }

String.IsNullOrEmpty(test)上記のコメントで誰かが指摘したように、事実は最高です... :)

于 2012-11-07T09:32:33.867 に答える