2020-04-01から1ヶ月間の記事一覧
タイトル通りですが本記事執筆時点 (2020/4/15) の最新である .NET Core 3.1 ではList<T>のAddRangeメソッドにダイレクトにSpan<T>およびReadOnlySpan<T>を突っ込むことはできません。というのもList<T>のAddRangeメソッドは public void AddRange(IEnumerable<T> items); </t></t></t></t></t>…
List<T>はGetEnumerator()を実装しているため当然foreachで回せる。foreachの速度を落とさないために具象型のEnumeratorを返したりEnumeratorを構造体実装していたりと工夫は凝らされているが、それでもSpan<T>やT[]には数倍~10倍程度遅い。この点に関しては、List<T></t></t></t>…
ラムダ式による外部変数のキャプチャは、コンパイラによって暗黙的に匿名クラスが作られ、コールされるたびに匿名クラスのインスタンスがnewされるため、ヒープアロケーションが発生する。 using System; public class Class { public Action Method(int num…
int型の整数の引数の範囲チェックで、0 から Size の範囲外だったら例外を投げる、のような範囲チェックはする機会が多いが、 int valueとint Sizeに対して if(value < 0 || value >= Size) throw new ArgumentOutOfRangeException(); よりも if((uint)value…
Linq のCount()、つまりint Enumerable.Count(IEnumerable<T>)は原理的には全列挙による数え上げだが、配列ライクなものは初めから要素数を持っているのでO(N)を回す必要はない。そのため、配列ライクなものについては直接要素数を取るよう最適化が施されている</t>…
C# の配列は共変性 (covariance) があり、以下のコードはコンパイルできます。 object[] array = new int[10]; array[2] = 5; そして困ったことに、次のコードもコンパイルできます。 object[] array = new int[10]; array[2] = "hello"; // ← 代入できる!…