6

皆さん、私はstring.IsNullOrWhiteSpaceの実装を見ていました:

http://typedescriptor.net/browse/types/9331-System.String

実装は次のとおりです。

public static bool IsNullOrWhiteSpace(string value)
{
    if (value == null)
    {
        return true;
    }
    for (int i = 0; i < value.Length; i++)
    {
        if (char.IsWhiteSpace(value[i]))
        {
        }
        else
        {
            goto Block_2;
        }
    }
    goto Block_3;
    Block_2:
    return false;
    Block_3:
    return true;
}

質問:これは複雑すぎませんか?次の実装は同じ仕事をすることができず、目には簡単です:

bool IsNullOrWhiteSpace(string value)
{
    if(value == null)
    {
        return true;
    }   
    for(int i = 0; i < value.Length;i++)
    {
        if(!char.IsWhiteSpace(value[i]))
        {
            return false;
        }
    }
    return true;
}

この実装は正しくありませんか?パフォーマンスの低下はありますか?

4

4 に答える 4

19

元のコード(参照ソースから)は

public static bool IsNullOrWhiteSpace(String value) {
    if (value == null) return true; 

    for(int i = 0; i < value.Length; i++) { 
        if(!Char.IsWhiteSpace(value[i])) return false; 
    }

    return true;
}

貧弱な逆コンパイラの出力が表示されています。

于 2012-04-20T17:58:09.507 に答える
8

分解されたILから再作成されたC#を見ています。実際の実装はあなたの例に近く、ラベルを使用していないと確信しています。

于 2012-04-20T17:57:10.413 に答える
3

それを行うのはtypedescriptorの逆アセンブラでなければなりません。

JetBrainのdotPeekで同じ関数を見ると、次のようになります。

 public static bool IsNullOrWhiteSpace(string value)
    {
      if (value == null)
        return true;
      for (int index = 0; index < value.Length; ++index)
      {
        if (!char.IsWhiteSpace(value[index]))
          return false;
      }
      return true;
    }
于 2012-04-20T18:02:37.817 に答える
2

以下に示すのは、古いバージョンに必要な拡張メソッドです。コードをどこから入手したかわかりません:

public static class StringExtensions
    {
        // This is only need for versions before 4.0
        public static bool IsNullOrWhiteSpace(this string value)
        {
            if (value == null) return true;
            return string.IsNullOrEmpty(value.Trim());
        }
    }
于 2012-04-20T18:11:00.373 に答える