Listなどのコレクションを返すメソッドを作るとき、nullを返さないこと
Before: nullを返す場合
void Start()
{
List<string> names = GetNames();
names.ForEach(obj => /* do something */ );
}
List<string> GetNames()
{
if (/* something */)
return null;
List<string> names = new List<string>();
/* add names */
return names;
}
こんなふうになってると、GetNames()からnullかえってきたときにエラーになります。
当然ですが。
After1: 呼び出し側でハンドリングする
たとえば、以下のように直すと動きます。
void Start()
{
List<string> names = GetNames();
if (names != null)
names.ForEach(obj => /* do something */ );
}
List<string> GetNames()
{
if (/* something */)
return null;
List<string> names = new List<string>();
/* add names */
return names;
}
これだと、呼び出す度にチェックしなければなりません。
実装するときにチェックを忘れてしまって、nullが返ってくるケースを
考慮し忘れた、なんてことがよくあります。
After2: nullじゃなく、空リストを返す
一方、以下のとおり直しても、動きます。
void Start()
{
List<string> names = GetNames();
names.ForEach(obj => /* do something */ );
}
List<string> GetNames()
{
List<string> names = new List<string>();
if (/* something */)
return names;
/* add names */
return names;
}
空リストなど、コレクションで値を何も入れず初期化した状態は、
空なので、後続でforeachなどのループ処理をしても
処理されずスルーされます。
この方が呼び出し元でのミスもなくなり、幸せになれます。
ちょっとした一手間が大事、という良い例です。