文字列がnull(Nothing)か空文字列かを簡単に判定するには?[C#/VB、.NET 2.0]:.NET TIPS
文字列がnull(Nothing)あるいは空文字列であるかどうかを判定するには、StringクラスのIsNullOrEmptyメソッドなど、幾つかの方法がある。
本稿は2006/08/04に初版公開した記事を改訂し、Visual Studio 2017でコードの動作検証、Null&空白文字列チェックの方法とNull&文字列長チェックの方法の追加、図版の追加、全般的な構成の変更などを行ったものです。
文字列(=String型のオブジェクト)がnull(C#の場合。Visual BasicではNothing)かどうかをチェックし、さらにnull(Nothing)ではない場合にはそれが空文字列(=長さが0の文字列。「""」あるいは「String.Empty」)かどうかをチェックするというコードは、非常によくあるパターンだ(以降、この一連のチェックを「Null&空文字列チェック」と表現する)。
また、空文字での判定の他に、空白文字だけの文字列も除外したいとか、あるいは、文字列の長さが一定未満のものも除外したいといったニーズもあるだろう。改訂の機に追記しておく。特定のトピックをすぐに知りたいという方は以下のリンクを活用してほしい。
.NET Framework 1.xの場合
.NET Framework 1.xではこのNull&空文字列チェックを実装するには、次のようなコードを書くことが多かっただろう。
if ((checkString != null) && (checkString.Length != 0))
{
// nullではなく、かつ空文字列でもない
}
else
{
// null、もしくは空文字列である
}
If (checkString IsNot Nothing) AndAlso (checkString.Length <> 0) Then
' Nothingではなく、かつ空文字列でもない
Else
' Nothing、もしくは空文字列である
End If
.NET Framework 2.0以降の場合
しかし.NET Framework 2.0ではこの「Null&空文字列チェック」を容易に実現するための次のメソッドが追加された。
・String.IsNullOrEmptyメソッド(String)
String.IsNullOrEmptyメソッドは静的メソッドとして実装されており、パラメーターで受け取った文字列がnull(Nothing)もしくは空文字列の場合に戻り値としてTrueを返し、null(Nothing)でも空文字列でもなければFalseを返すという仕様になっている。
このメソッドを使って上記のコードを書き直したのが次のコードである。
if (!string.IsNullOrEmpty(checkString))
{
// nullではなく、かつ空文字列でもない
}
else
{
// null、もしくは空文字列である
}
If (Not String.IsNullOrEmpty(checkString)) Then
' Nothingではなく、かつ空文字列でもない
Else
' Nothing、もしくは空文字列である
End If
このようにString.IsNullOrEmptyメソッドを使うことで、Null&空文字列チェックをシンプルに記述できる。
Null&空白文字列チェック
文字列がnull(Nothing)ではなく、空文字列でもなく、さらに空白文字列(空白文字だけを含む文字列)でもないという「Null&空白文字列チェック」は、次のコードのように書ける。もしも空白文字列だった場合、String.Trimメソッドを使って文字列の前後から空白文字列を全て取り去ると、長さゼロの空文字列になる。String.Trimメソッドの結果の長さを判定するだけで、空文字列チェックと空白文字列チェックがいっぺんにできるのだ。
if ((checkString != null) && (checkString.Trim().Length != 0))
{
// nullではなく、かつ空文字列でもなく、かつ空白文字列でもない
}
else
{
// null、もしくは空文字列、もしくは空白文字列である
}
If ((checkString IsNot Nothing) AndAlso (checkString.Trim().Length <> 0)) Then
' Nothingではなく、かつ空文字列でもなく、かつ空白文字列でもない
Else
' Nothing、もしくは空文字列、もしくは空白文字列である
End If
Trimメソッドが削除する空白文字列には、スペースだけでなく、タブや全角空白なども含まれる。
.NET Framework 4.0ではこの「Null&空白文字列チェック」を容易に実現するためのString.IsNullOrWhiteSpaceメソッドが追加された。上のコードは、次のコードのように書き直せる。
if (!string.IsNullOrWhiteSpace(checkString))
{
// nullではなく、かつ空文字列でもなく、かつ空白文字列でもない
}
else
{
// null、もしくは空文字列、もしくは空白文字列である
}
If (Not String.IsNullOrWhiteSpace(checkString)) Then
' Nothingではなく、かつ空文字列でもなく、かつ空白文字列でもない
Else
' Nothing、もしくは空文字列、もしくは空白文字列である
End If
なお、このString.IsNullOrWhiteSpaceメソッドは「.NET TIPS:文字列がnull(Nothing)か空文字列か「空白か」を簡単に判定するには?[4.0以降、C#、VB]」でも紹介している。
Null&文字列長チェック
文字列がnull(Nothing)ではなく、空文字列でもなく、さらに指定の長さ未満ではない(=指定の長さ以上である)という「Null&文字列長チェック」もある。これは例えば、読み込んだ文字列は2桁以上の記号であるはずというようなチェックだ。例として2文字未満を除外する「Null&文字列長チェック」は次のコードのように書ける。
if ((checkString != null) && (checkString.Length >= 2))
{
// nullではなく、かつ2文字未満でもない
}
else
{
// null、もしくは2文字未満である
}
If ((checkString IsNot Nothing) AndAlso (checkString.Length >= 2)) Then
' Nothingではなく、かつ2文字未満でもない
Else
' Nothing、もしくは2文字未満である
End If
C# 6.0/VB 14で導入されたNull条件演算子を使うと、上のコードを簡潔に書き直せる(次のコード)。
if (checkString?.Length >= 2)
{
// nullではなく、かつ2文字未満でもない
}
else
{
// null、もしくは2文字未満である
}
If (checkString?.Length >= 2) Then
' Nothingではなく、かつ2文字未満でもない
Else
' Nothing、もしくは2文字未満である
End If
なお、「Null&空文字列チェック」/「Null&空白文字列チェック」もNull条件演算子を使って同じように書けるが、それぞれString.IsNullOrEmptyメソッド/String.IsNullOrWhiteSpaceメソッドを使った方が簡潔で分かりやすい。
カテゴリ:クラスライブラリ 処理対象:文字列
使用ライブラリ:Stringクラス(System名前空間)
関連TIPS:文字列がnull(Nothing)か空文字列か「空白か」を簡単に判定するには?[4.0以降、C#、VB]
関連TIPS:文字列に特定の文字列が含まれているかを調べるには?
関連TIPS:文字列に特定の文字列が含まれているかを調べるには?(Contains編)
関連TIPS:文字列の長さを取得するには?
関連TIPS:文字数を正確にカウントするには?(サロゲート文字対応)[C#、VB]
関連TIPS:文字列の前後にある余分な空白文字を取り除くには?
関連TIPS:構文:nullチェックを簡潔に記述するには?[C# 6.0]
更新履歴
【2018/09/26】Visual Studio 2017でコードの動作検証、DateTimeOffset構造体について追記、図版の追加、全般的な構成の変更などを行いました。
【2006/08/05】本記事の一部に以下のような誤りがありました。おわびして訂正させていただきます。
誤: String.IsNullOrEmptyメソッドは静的メソッドとして実装されており、パラメーターで受け取った文字列がnull(Nothing)もしくは空文字列の場合に戻り値としてFalseを返し、null(Nothing)でも空文字列でもなければTrueを返すという仕様になっている。
正: String.IsNullOrEmptyメソッドは静的メソッドとして実装されており、パラメーターで受け取った文字列がnull(Nothing)もしくは空文字列の場合に戻り値としてTrueを返し、null(Nothing)でも空文字列でもなければFalseを返すという仕様になっている。
【2006/08/04】初版公開。
Copyright© Digital Advantage Corp. All Rights Reserved.