55269


なぜ .NET の`System.Text.StringBuilder`クラスは
`System.Collections.Generic.IEnumerable<char>`インターフェースを実装していないのでしょうか。  
([.NET Core 3.0 Preview 5](https://docs.microsoft.com/ja-
jp/dotnet/api/system.text.stringbuilder?view=netcore-3.0)時点)

`string`との共通化を考えると、`IEnumerable<char>`インターフェースを実装することは自然だと思えますし、`System.Text.StringBuilder`クラスはインデクサーと`Length`プロパティがあるので、`IEnumerable<char>`インターフェースをできるという認識です。

Java言語の`java.lang.StringBuilder`クラスでは`java.lang.CharSequence`インターフェースを実装しています。

喫緊で困っているわけではなく、単に疑問に思っていたので質問させてもらいました。


CC BY-SA 4.0
2019-05-26T15:07:02.897
55267
2019-05-26T23:12:53.497
9113
question
c# .net
.NET の StringBuilder が IEnumerable<char> を実装しない理由を知りたい


明確な答えではありませんが、[ソースコード冒頭](https://github.com/microsoft/referencesource/blob/e0bf122d0e52a42688b92bb4be2cfd66ca3c2f07/mscorlib/system/text/stringbuilder.cs#L27-L30)に

>
[code]

>     // This class represents a mutable string.  It is convenient for
> situations in
>     // which it is desirable to modify a string, perhaps by removing,
> replacing, or
>     // inserting characters, without creating a new String subsequent to
>     // each modification.
>  
[/code]

と書かれています。つまり、不変型である`String`の代わりとしてstring builder;
高速に文字列を構築することを目的としたクラスだからだと思います。

「高速に」という部分が重要です。`Lists<T>`などの実装を参照するとわかりますが、`IEnumerable<T>`による列挙途中で文字列変更が行われると列挙結果が崩れます。そのため、バージョン管理を行い、列挙中に変更操作が発生していないか検出する必要が出てきます。当然そのような行為は文字列操作のオーバーヘッドとなります。  
対して、インデクサー、`Length`、`Equals`などは１メソッドで完結するため、文字列のバージョン管理は必要ありません。とはいえバージョン管理不要な`CompareTo`は実装されていないようです。

`IEnumerable<Char>`が実装されていないのは、string builderの目的を踏まえて提供する機能を取捨選択した結果によると思われます。


CC BY-SA 4.0
2019-05-26T20:36:41.110
55269
2019-05-26T23:12:53.497
2019-05-26T23:12:53.497
4236
4236
55267
answer