非常に今更感のある話ですが。ReadToEnd メソッドはほとんど使ったことがなかったので、改めて調べてみました。
ReadToEnd メソッドの戻り値 §
ReadLineメソッドはEOFの場合nullを返します。ドキュメントにもそう書いてあります。
しかし、ReadToEnd メソッドは「nullを返す」とは書かれていません。「現在位置から TextReader の末尾までのすべての文字を含む文字列」と書かれているだけです。
ならば、現在位置がEOFなら空文字列を返してくれる?
検証ソース §
using System;
using System.IO;
class Program
{
static void Main(string[] args)
{
var reader = new StringReader("a\r\n");
Console.WriteLine(reader.ReadLine() == null);
Console.WriteLine(reader.ReadLine() == null);
string s = reader.ReadToEnd();
Console.WriteLine(s == null);
Console.WriteLine(s.Length);
}
}
実行結果 §
結果 §
というわけで、ReadLineメソッドがnullを返すケースでも、ReadToEndメソッドは実体のある空文字列オブジェクトを返してきたのでした。
感想 §
.NET Framework 1.0からサポートされたメソッドでも、知らないことは多い!
油断禁物!! (自戒の言葉)