またはで使用ReadLine()
すると、ファイルまたは文字列が改行で終わる場合、その文字シーケンスが完全に失われることに気付きました。次の例を検討してください。StreamReader
StringReader
static void Main(string[] args)
{
string data = "First Line\r\nSecond Line\r\n\r\n\r\n";
List<string> lineData = new List<string>();
string[] splitData = data.Split(
new string[] { "\r\n" },
StringSplitOptions.None);
using (StringReader sr = new StringReader(data))
{
string line;
while ((line = sr.ReadLine()) != null)
lineData.Add(line);
}
Console.WriteLine("Raw Line Count: " + splitData.Length);
Console.WriteLine("StringReader Line Count: " + lineData.Count);
Console.WriteLine("Split Data: ");
foreach (string s in splitData)
Console.WriteLine(string.IsNullOrEmpty(s) ? "[blank line]" : s);
Console.WriteLine("StringReader Data: ");
foreach (string s in lineData)
Console.WriteLine(string.IsNullOrEmpty(s) ? "[blank line]" : s);
Console.ReadKey();
}
出力は次のとおりです。
Raw Line Count: 5
StringReader Line Count: 4
Split Data:
First Line
Second Line
[blank line]
[blank line]
[blank line]
StringReader Data:
First Line
Second Line
[blank line]
[blank line]
StringReader
/StreamReader
がこのように動作するのはなぜですか? 回避策はいくつか考えられますが、リーダーが予期しない動作をするためにコードを修正しなければならないのはばかげているように思えます。ストリームが最終的な改行を処理する方法に影響を与える .NET ライブラリの設定はありますか?
編集
別の例を次に示します。この例を最初に実行したときの結果"First Line\r\nSecond Line"
と、次に に対して実行したときの結果を比較します"First Line\r\nSecond Line\r\n"
。結果はまったく同じです (例の StringReader 部分に関する限り)。null
空の文字列ではなく、2 番目の例でStringReader が返されるのはなぜですか? から返される文字列に改行が含まれていないことは承知していますが、最後の行が ?の代わりにReadLine()
解釈されるのはなぜですか?null
""