配列を返すメソッドでは、null
/Nothing
よりも空の配列を返したほうがよい場合があります。 配列を返すメソッドがnullを返す場合、呼び出し側は戻り値がnullかどうかの判定を行った上で列挙などの操作を行う必要がありますが、空の配列を返すようにすれば呼び出し側はnull判定を行わずに戻り値の配列に操作を行うことができます。
戻り値として空の配列を返す
using System;
using System.IO;
class Sample {
// ファイルから複数の値を読み込むメソッド
static int[] ReadValuesFromFile(string file)
{
if (File.Exists(file)) {
int[] values;
// ファイルを開いて読み込んだが、読み込み対象の値が無かった場合を想定する
// 値が無かったことを表すため、nullではなく空の配列を返す
values = new int[0];
return values;
}
else {
throw new FileNotFoundException("ファイルがありません", file);
}
}
static void Main()
{
// ファイルから読み込んだ値を列挙する
// (ファイルに目的の値がなかった場合でもメソッドは空の配列を返すため、
// null判定を行うことなく列挙を行うことができる)
foreach (var val in ReadValuesFromFile("data.txt")) {
Console.WriteLine(val);
}
}
}
上記の例では、ファイルが無かった場合にもnullや空の配列を返すようにすることもできますが、推奨できません。 例えば、上記のメソッドにエラー処理を追加してファイルの内容が異常だった場合にもnullを返すような実装にした場合、メソッドの呼び出し側は戻り値がnullとなった原因が何なのかを知ることができません。
このため、なんらかのエラーがあった場合には、nullや空の配列を返すよりも、ファイルが無かった場合はFileNotFoundException、ファイルの内容やフォーマットが異常だった場合はInvalidDataExceptionをスローするというように、状況にあった例外をスローして呼び出し側に原因を通知すべきです。