DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

文字列が空かどうか調べる

文字列(String)が空の文字列かを調べるには、「2つの文字列が等しいかを調べる」で紹介したように、等値演算子(VB.NETは=、C#は==)やEqualsメソッドを使って、空の文字列(""やString.Empty)と比較すればよいだけです。

VB.NET
コードを隠すコードを選択
Dim s As String = "こんにちは"

If s = "" Then
    Console.WriteLine("文字列は空です")
End If

If s = String.Empty Then
    Console.WriteLine("文字列は空です")
End If

If s.Equals("") Then
    Console.WriteLine("文字列は空です")
End If

If s.Equals(String.Empty) Then
    Console.WriteLine("文字列は空です")
End If
C#
コードを隠すコードを選択
string s = "こんにちは";

if (s == "")
{
    Console.WriteLine("文字列は空です");
}

if (s == string.Empty)
{
    Console.WriteLine("文字列は空です");
}

if (s.Equals(""))
{
    Console.WriteLine("文字列は空です");
}

if (s.Equals(string.Empty))
{
    Console.WriteLine("文字列は空です");
}

文字列はNULL(VB.NETではNothing、C#ではnull)になり得ますので、もし調べる文字列がNULLである可能性があるならば、空の文字列と比較する前に、NULLでないことを確認しておきます。

ただし、VB.NETの=演算子はNothingと空の文字列を等価と判断しますので、Nothingと空の文字列の両方を確認する必要はありません。

補足:VB.NETでは、IsNothing関数によってNothingかどうか調べることもできます。
VB.NET
コードを隠すコードを選択
Dim s As String = "こんにちは"

'sがNothingでもTrueとなる
If s = "" Then
    Console.WriteLine("文字列は空です")
End If

If s Is Nothing OrElse s.Equals("") Then
    Console.WriteLine("文字列は空です")
End If
C#
コードを隠すコードを選択
string s = "こんにちは";

if (s == null || s == "")
{
    Console.WriteLine("文字列は空です");
}

.NET Framework 2.0からは、文字列がNULLまたは空の文字列かを調べるために、String.IsNullOrEmptyメソッドの使用が推奨されています。

VB.NET
コードを隠すコードを選択
Dim s As String = "こんにちは"

If String.IsNullOrEmpty(s) Then
    Console.WriteLine("文字列は空です")
End If
C#
コードを隠すコードを選択
string s = "こんにちは";

if (string.IsNullOrEmpty(s))
{
    Console.WriteLine("文字列は空です");
}

以上はたぶん説明するまでも無い事でしょう。これ以降は、もう少し掘り下げてみます。

「String.Length = 0」が最速

文字列が空の文字列かを調べる方法としては、文字列のLengthプロパティが0かどうかを調べる方法が最速とされています。これは、文字列同士を比較するよりも、整数同士を比較する方が圧倒的に速いためです。この方法が最速ということはMSDNの「文字列長を使用して空の文字列をテストします」にも書かれているため、確かだと思われます。

VB.NET
コードを隠すコードを選択
Dim s As String = "こんにちは"

If s.Length = 0 Then
    Console.WriteLine("文字列は空です")
End If
C#
コードを隠すコードを選択
string s = "こんにちは";

if (s.Length == 0)
{
    Console.WriteLine("文字列は空です");
}

等値演算子とEqualsメソッド、""とString.Empty、どちらが速い?

2つの文字列が等しいかを調べる」で紹介したように、通常は等値演算子よりもEqualsメソッドの方が速いでしょう。

空の文字列を表す""とString.Emptyの違いは微々たる物で、両者はほぼ同じと思って良いでしょう。違いを知りたいという方は、GoogleなどでString.Emptyを検索してみてください。

補足:String.Empty(C#では、string.Empty)とSystem.String.Emptyは同じです。

これらの方法を使って速さを比べた結果が「String.Empty vs. ""」に掲載されています。これによると、やはり文字列のLengthプロパティが0かどうかを調べる方法が最速です。等値演算子とEqualsメソッドの比較では、比較する文字列が空のときは等値演算子の方が速いですが、それ以外ではEqualsメソッドが勝っています。""とString.Emptyでは、非常に差が小さいですが、ほんの少しだけString.Emptyの方が速いという結果になっています。

String.IsNullOrEmptyのバグ

.NET Framework 2.0以降ではString.IsNullOrEmptyメソッドを使うことが勧められていますが、実は.NET Framework 2.0のString.IsNullOrEmptyメソッドには、NullReferenceExceptionがスローされる可能性があるというバグがあります。これは、「フィードバック: Null Exemption caused by JIt optimisation around String.IsNullOrEmpty」で報告されています。このバグは、.NET Framework 3.5で修正されたようです。

この不具合は少々特別な状況で発生するようなので、あまり気にしなくても良いかもしれません。もし気になるという場合は、.NET Framework 3.5以上でなければ、IsNullOrEmptyを使わずに、次のようにして調べるのが良いでしょう。

VB.NET
コードを隠すコードを選択
Dim s As String = "こんにちは"

If s Is Nothing OrElse s.Length = 0 Then
    Console.WriteLine("文字列は空です")
End If
C#
コードを隠すコードを選択
string s = "こんにちは";

if (s == null || s.Length == 0)
{
    Console.WriteLine("文字列は空です");
}

実はIsNullOrEmptyメソッドもこれと同じように調べているため、IsNullOrEmptyメソッドよりもこのようにした方が速いようです。(こちらに測定例があります。)

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • .NET Tipsをご利用いただく際は、注意事項をお守りください。