Start Debugging

csharp

345 件 · ページ1/35

yield return イテレーターと List<T> を返す方法の比較: C# で IEnumerable を返すメソッドの本当のコスト

yield return メソッドは、生成する要素数に関係なく、呼び出しごとに 40 バイトのステートマシンオブジェクト 1 つ分のコストがかかります。List<T> は内部配列全体を先に確保します。.NET 10.0.10 で計測した結果、メモリと早期終了ではイテレーターが有利で、呼び出し側が複数回列挙する場合、Count が必要な場合、ToList() を呼ぶ場合は List<T> が有利でした。

.NET における FileSystemInfo.LastWriteTime セッターと File.SetLastWriteTime の違い

どちらも最終的には同じ OS 呼び出しに行き着くため、書き込まれるタイムスタンプは同一です。違いはその周辺にあります。どのキャッシュが無効化されるか、Windows でディレクトリを扱えるか、UTC 以外の DateTime がどう変換されるか、開いているハンドルを対象にできるか、です。File.SetLastWriteTimeUtc を使い、ファイルが開いている場合はハンドル経由で設定してください。.NET 10.0.10 で検証済みです。

C# の ref T ループと Span<T> インデックスの比較: .NET 10 で Span 版が同等以上に速い理由

.NET 10 では、span.Length を上限にした単純な for ループ span[i] は、境界チェックなし、ストレングスリダクション済み、カウントダウン形式のループにコンパイルされます。int インデックスで手書きした Unsafe.Add(ref r, i) ループは符号拡張と加算方向の比較が残り、計測では 2 から 5% 遅くなりました。.NET 10.0.10 の arm64 と x64 のベンチマークと JIT 逆アセンブルを紹介します。

C# でヒープ割り当てなしに 2 つのコレクションを並行して反復処理する方法

Enumerable.Zip は呼び出しごとに 144-208 バイトを割り当て、単純なループより約 10 倍遅く動作します。配列やリストであれば、同じ長さにスライスした 2 つの span に対する for ループが割り当てゼロで最速の選択肢です。foreach 構文を使いたい場合は、小さな ref struct の zip 列挙子でその 25% 以内に収まります。.NET 10.0.10 と .NET 11 RC 3 で計測しました。

Polly 8.8.1: サーキットブレーカーが最初の呼び出し元の AsyncLocal 値を保持し続けなくなりました

Polly.Core 8.8.1 はサーキットブレーカーのバックグラウンドループを ExecutionContext.SuppressFlow の下で開始するため、長寿命のパイプラインがそれを構築した側の AsyncLocal 値を保持しなくなりました。15 行の再現コードで 8.8.0 のリークと 8.8.1 の修正を示します。
2026-10-26 dotnetcsharplogging

appsettings.json でログレベルごとに異なる Serilog の出力テンプレートを使う方法

outputTemplate はシンクごとに固定のため、レベル別の書式には {#if @l ...} ブロックを使った ExpressionTemplate か、ByIncludingOnly / ByExcluding フィルターを持つ 2 つの Logger サブロガーのどちらかが必要です。どちらも appsettings.json だけで設定でき、Serilog 4.4、Serilog.Settings.Configuration 10.0.1、Serilog.Expressions 5.0 で検証しています。
次へ