Start Debugging

csharp

345 件 · ページ2/35

C# の Lazy<T>、LazyInitializer.EnsureInitialized、ダブルチェックロッキングの比較

基本は Lazy<T> を使ってください。ファクトリを 1 回だけ実行し、例外をキャッシュし、初期化後の読み取りは計測できないほど軽量です。多数のフィールドや配列スロットを遅延初期化していて、値ごとの追加オブジェクトを避けたい場合は LazyInitializer.EnsureInitialized を使います。手書きのダブルチェックロッキングは、.NET 10 ではほとんど割に合いません。
2026-10-21 mcpdotnetcsharp

MCP C# SDK 2.3: McpClient.ServerInfo が null 許容になりました。ビルドに影響する可能性があります

2026年10月20日にリリースされた ModelContextProtocol 2.3.0 では、2026-07-28 のサーバーが server/discover で自身の識別情報を省略できるため、McpClient.ServerInfo が Implementation から Implementation? に変わりました。その理由、警告をエラー扱いにしている場合に何が壊れるか、1 行で済む修正方法を解説します。

.NET でインドのラーク/クロール方式の桁区切りで数値をフォーマットする方法 (NumberGroupSizes)

en-IN カルチャを使うか NumberFormatInfo.NumberGroupSizes を [3, 2] に設定すると、C# で 123,456,789 ではなく 12,34,56,789 と出力できます。.NET 10 と .NET 11 RC1 で検証し、配列の仕組み、CurrencyGroupSizes が別である理由、欧米式の桁区切りが黙って出力されるインバリアントグローバリゼーションの落とし穴、ラーク/クロールの単位表記ヘルパーを解説します。

.NET Extensions 10.11: バッファーされたログがついにスコープを保持できるようになりました

2026-10-15 にリリースされた Microsoft.Extensions.Telemetry 10.11.0 は、グローバルおよびリクエスト単位のログ バッファリングに実験的な IncludeScopes オプションを追加しました。これにより BeginScope の OrderId や TenantId が、黙って失われることなく Flush() 後も残ります。

C# の `with` 式は実際に何をコピーするのか、そしてレコードの計算プロパティが再計算されないのはなぜか

with 式はレコードのコンパイラー生成メソッド <Clone>$ を呼び出し、そこでコピーコンストラクターが全インスタンスフィールドをコピーし、すべての初期化子をスキップします。そのため、他のプロパティから初期化されるプロパティ、キャッシュされた値、Guid の ID は古いまま残ります。.NET 10 と C# 14 で計測し、実際に有効な対処法を紹介します。

FileSystemWatcher とポーリングの比較: .NET でネットワーク共有上のファイル変更を検出する

SMB や NFS の共有では、ポーリングが信頼できる情報源であり、FileSystemWatcher はせいぜいヒントにすぎません。FileSystemWatcher は Linux と macOS ではリモートの変更を見逃し、ネットワーク上の 64 KB バッファーであふれ、接続が切れると完全に停止します。定期的なスナップショットの差分を使い、ウォッチャーは早めのスキャンを促すだけにしてください。.NET 10.0.10 で検証済みです。

C# で待機するときの Thread.Sleep と Task.Delay と SpinWait の違い

非同期コードでの時間指定の待機には await Task.Delay を使い、Thread.Sleep は自分が所有する専用スレッドでのみ使い、SpinWait はロックフリーのコード内でのマイクロ秒未満の待機にだけ使います。条件を待つ場合は、この 3 つではなくシグナル (ManualResetEventSlim、SemaphoreSlim、TaskCompletionSource) を使ってください。.NET 10.0.10 で計測しています。

修正: Windows で書き込み中のファイルに対して FileInfo.Length が古いサイズを返す

FileInfo はサイズをキャッシュし、列挙では NTFS が遅延更新するディレクトリエントリを読み、さらに書き込み側が自前のバッファーにバイトを保持していることもあります。Refresh() を呼ぶか、より確実には共有ハンドルから RandomAccess.GetLength で長さを読み取ってください。
前へ 次へ