以下の3通りの方法でテキストファイルを作成しました。

StreamWriter sw = File.CreateText(@"d:\doc\utf8-a.txt");
sw.WriteLine("あいうえお");
sw.Close();

sw = new StreamWriter(@"d:\doc\utf8-b.txt", false);
sw.WriteLine("あいうえお");
sw.Close();

sw = new StreamWriter(@"d:\doc\utf8-c.txt", false, System.Text.Encoding.UTF8);
sw.WriteLine("あいうえお");
sw.Close();

どれもUTF-8で書き込まれるのですが上2つはバイナリレベルで同じ内容でしたが
3つめのファイルはファイルの先頭になにやら3バイト余分についていて
そのあとは上2つと同じ内容が書かれていました。
上2つのファイルはIEや秀丸で開くとShift-JISと判断され化けます。
3つめのファイルは、ちゃんとUTF-8と判断され正常に表示されました。
たぶん頭の3バイトで文字コードを判定しているのだと思うのですが
ぐぐりましたが、この辺の情報がみつかりませんでした。
UTF-8は頭に自分がUTF-8だという情報をつける、というのが正しいフォーマットなのでしょうか?
また上2つは、どういう意図でそれらの情報を欠落させて出力しているのでしょうか?
ちなみに
sr = File.OpenText(ファイル名)
sr = new StreamReader(ファイル名)
sr = new StreamReader(ファイル名, Encofing.UTF8)
いずれの方法でストリームを開いてReadLine()しても結果は「あいうえお」ときちんと読めました。