回答:
ベストプラクティスは、最も適切なものを選択することです。
.Net Framework 4.0 Beta 2には、文字列用の新しいIsNullOrWhiteSpace()メソッドがあり、IsNullOrEmpty()メソッドを一般化して、空の文字列以外の空白も含めます。
「空白」という用語には、画面に表示されないすべての文字が含まれます。たとえば、スペース、改行、タブ、空の文字列は空白文字*です。
参照:ここに
パフォーマンスに関しては、IsNullOrWhiteSpaceは理想的ではありませんが、優れています。メソッドを呼び出すと、パフォーマンスが少し低下します。さらに、IsWhiteSpaceメソッド自体には、Unicodeデータを使用していない場合に削除できるいくつかの間接指定があります。いつものように、時期尚早の最適化は悪いかもしれませんが、それも楽しいです。
参照:ここに
ソースコードを確認する(Reference Source .NET Framework 4.6.2)
[Pure]
public static bool IsNullOrEmpty(String value) {
return (value == null || value.Length == 0);
}
[Pure]
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;
}
例
string nullString = null;
string emptyString = "";
string whitespaceString = " ";
string nonEmptyString = "abc123";
bool result;
result = String.IsNullOrEmpty(nullString); // true
result = String.IsNullOrEmpty(emptyString); // true
result = String.IsNullOrEmpty(whitespaceString); // false
result = String.IsNullOrEmpty(nonEmptyString); // false
result = String.IsNullOrWhiteSpace(nullString); // true
result = String.IsNullOrWhiteSpace(emptyString); // true
result = String.IsNullOrWhiteSpace(whitespaceString); // true
result = String.IsNullOrWhiteSpace(nonEmptyString); // false
return String.IsNullOrEmpty(value) || value.Trim().Length == 0;
。これには、新しい文字列の割り当てと2つの個別のチェックが含まれます。ほとんどの場合、IsNullOrWhitespaceの内部では、文字列の各文字が空白であることを確認することにより、割り当てなしでシングルパスを介して行われるため、パフォーマンスが向上します。実際に何を混乱させるのですか?
IsNullOrWhitespace()
空の文字列と一致するかどうかは知りませんでした。本質的にIsNullOrEmpty()
はのサブセットに一致しIsNullOrWhitespace()
ます。
実際の違い:
string testString = "";
Console.WriteLine(string.Format("IsNullOrEmpty : {0}", string.IsNullOrEmpty(testString)));
Console.WriteLine(string.Format("IsNullOrWhiteSpace : {0}", string.IsNullOrWhiteSpace(testString)));
Console.ReadKey();
Result :
IsNullOrEmpty : True
IsNullOrWhiteSpace : True
**************************************************************
string testString = " MDS ";
IsNullOrEmpty : False
IsNullOrWhiteSpace : False
**************************************************************
string testString = " ";
IsNullOrEmpty : False
IsNullOrWhiteSpace : True
**************************************************************
string testString = string.Empty;
IsNullOrEmpty : True
IsNullOrWhiteSpace : True
**************************************************************
string testString = null;
IsNullOrEmpty : True
IsNullOrWhiteSpace : True
それらは異なる機能です。状況に応じて、何が必要かを決定する必要があります。
私はそれらのいずれかを悪い習慣として使用することを考えていません。ほとんどの場合IsNullOrEmpty()
十分です。しかし、あなたには選択肢があります:)
Contains
。ユーザー名は、スペースで構成することができないようにしたい場合のみ - IsNullOrWhiteSpace
okです。IsNullOrEmpty
ユーザー名が何らかの方法で入力されたことのみを確認します。
以下は、両方のメソッドの実際の実装です(dotPeekを使用して逆コンパイル)。
[TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries")]
public static bool IsNullOrEmpty(string value)
{
if (value != null)
return value.Length == 0;
else
return true;
}
/// <summary>
/// Indicates whether a specified string is null, empty, or consists only of white-space characters.
/// </summary>
///
/// <returns>
/// true if the <paramref name="value"/> parameter is null or <see cref="F:System.String.Empty"/>, or if <paramref name="value"/> consists exclusively of white-space characters.
/// </returns>
/// <param name="value">The string to test.</param>
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;
}
IsNullOrWhiteSpace
は当てはまりstring.Empty
ます!それはボーナスだ:)
それはすべてIsNullOrEmpty()
が白いスペースを含んでいない間それを言いIsNullOrWhiteSpace()
ます!
IsNullOrEmpty()
文字列の場合:
-null
-empty
IsNullOrWhiteSpace()
文字列の場合:
-Null
-empty
のみ-containsホワイトスペース
IsNullOrEmptyとIsNullOrwhiteSpaceでこれを確認してください
string sTestes = "I like sweat peaches";
Stopwatch stopWatch = new Stopwatch();
stopWatch.Start();
for (int i = 0; i < 5000000; i++)
{
for (int z = 0; z < 500; z++)
{
var x = string.IsNullOrEmpty(sTestes);// OR string.IsNullOrWhiteSpace
}
}
stopWatch.Stop();
// Get the elapsed time as a TimeSpan value.
TimeSpan ts = stopWatch.Elapsed;
// Format and display the TimeSpan value.
string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}",
ts.Hours, ts.Minutes, ts.Seconds,
ts.Milliseconds / 10);
Console.WriteLine("RunTime " + elapsedTime);
Console.ReadLine();
IsNullOrWhiteSpaceの方がはるかに遅いことがわかります:/
キャッチオールのこれについては...
if (string.IsNullOrEmpty(x.Trim())
{
}
これにより、IsWhiteSpaceのパフォーマンスペナルティが回避され、すべてのスペースが削除されます。これにより、文字列がnullでない場合に「空」の条件を満たすことができます。
また、これはより明確であり、特にデータベースなどに文字列を配置する場合は、とにかく文字列をトリムすることをお勧めします。
.Net標準2.0の場合:
string.IsNullOrEmpty()
:指定された文字列がnullまたは空の文字列かどうかを示します。
Console.WriteLine(string.IsNullOrEmpty(null)); // True
Console.WriteLine(string.IsNullOrEmpty("")); // True
Console.WriteLine(string.IsNullOrEmpty(" ")); // False
Console.WriteLine(string.IsNullOrEmpty(" ")); // False
string.IsNullOrWhiteSpace()
:指定された文字列がnull、空、または空白文字のみで構成されているかどうかを示します。
Console.WriteLine(string.IsNullOrWhiteSpace(null)); // True
Console.WriteLine(string.IsNullOrWhiteSpace("")); // True
Console.WriteLine(string.IsNullOrWhiteSpace(" ")); // True
Console.WriteLine(string.IsNullOrWhiteSpace(" ")); // True