ブログ 2024/02/13 ファーストクラスな Span 型 今日は「Span<T>、ReadOnlySpan<T> をコンパイラーで特別扱いしたい」という話。 C# 7.2 の頃、Span<T> 型が追加されて、 安全性を損なわずに unsafe コード並みにパフォーマンスのよいコードが書けるようになりました。 それ以来、.NET の標準ライブラリでもいろんな場面でSpan<T> 型が活用されています。 いまや結構重要なポジションを担う型なわけですが、 現状の扱いはあくまで「普通の構造体の1つ」で… 続きを読む 2024/02/11 インターセプター 「最近動きがあったもの」ブログをいくつか書いてて、 「続報」みたいなものも書いてるわけですが。 今日のも「まあ、去年から動く実装すでにあるんだけど」という意味では続報なものの、 今日のインターセプターはあまりうちのサイトで取り上げておらず、初めて説明を書く話。 (ライブ配信では時々話に出てるんですが。) インターセプター 今日話すインターセプターは、まあ、Source Generator向けの機能です。 既存の Source Generator でも、 クラスを丸ごと生成するとか… 続きを読む 2024/02/11 ref 構造体のインターフェイス実装 / 型引数での使用 ref 構造体で説明しているように、 Span<T> 型など一部の型は「スタック上にないといけない」という強い制約があります。 この制約を守るため、これまで、ref 構造体は インターフェイスを実装できなかった ジェネリック型引数に使えなかった という制限が掛かっていました。 C# 13 では、この制限を緩和するため、 ジェネリック型引数に「allows ref struct」という「アンチ制約」を追加する予定です。 こういう案自体は ref フィールドが追加… 続きを読む 2024/02/10 C# での破壊的変更の今後の扱い (続報) 去年の3月にブログに書いたものの続報。 C# でも限定的に破壊的変更を許していこうかという話だったわけですが、 ちょっと具体化しました。 ある機能を実現するにあたって破壊的変更の原則と進め方についての話をしています。 破壊的変更の候補 C# 13 で導入したい field アクセス(自動プロパティのバッキングフィールドにアクセスするための field キーワード)と、 これまでに破壊的変更を避けるためにちょっと変な設計になっている var (型推論変数宣言)、_ (discard)が… 続きを読む 2024/02/08 オブジェクト初期化子中の ^ 演算子 今日の C# 話はちょこっとした修正の話になります。 これまで new C { [^1] = 1 }; がコンパイル通らなかったみたいで、これが最近修正されました。 (Visual Studio 17.9 Preview 3 (1月17日リリース済み)の時点で実装されていました。 気づいてはいたけども、小さすぎてブログにするかどうか迷ってるうちに3週間ほど経過。) 以下のコードで示すような修正内容です。 // これがコンパイル エラーを起こす。 // (Visual Studio… 続きを読む 新しい投稿へ 過去の投稿へ
2024/02/13 ファーストクラスな Span 型 今日は「Span<T>、ReadOnlySpan<T> をコンパイラーで特別扱いしたい」という話。 C# 7.2 の頃、Span<T> 型が追加されて、 安全性を損なわずに unsafe コード並みにパフォーマンスのよいコードが書けるようになりました。 それ以来、.NET の標準ライブラリでもいろんな場面でSpan<T> 型が活用されています。 いまや結構重要なポジションを担う型なわけですが、 現状の扱いはあくまで「普通の構造体の1つ」で… 続きを読む
2024/02/11 インターセプター 「最近動きがあったもの」ブログをいくつか書いてて、 「続報」みたいなものも書いてるわけですが。 今日のも「まあ、去年から動く実装すでにあるんだけど」という意味では続報なものの、 今日のインターセプターはあまりうちのサイトで取り上げておらず、初めて説明を書く話。 (ライブ配信では時々話に出てるんですが。) インターセプター 今日話すインターセプターは、まあ、Source Generator向けの機能です。 既存の Source Generator でも、 クラスを丸ごと生成するとか… 続きを読む
2024/02/11 ref 構造体のインターフェイス実装 / 型引数での使用 ref 構造体で説明しているように、 Span<T> 型など一部の型は「スタック上にないといけない」という強い制約があります。 この制約を守るため、これまで、ref 構造体は インターフェイスを実装できなかった ジェネリック型引数に使えなかった という制限が掛かっていました。 C# 13 では、この制限を緩和するため、 ジェネリック型引数に「allows ref struct」という「アンチ制約」を追加する予定です。 こういう案自体は ref フィールドが追加… 続きを読む
2024/02/10 C# での破壊的変更の今後の扱い (続報) 去年の3月にブログに書いたものの続報。 C# でも限定的に破壊的変更を許していこうかという話だったわけですが、 ちょっと具体化しました。 ある機能を実現するにあたって破壊的変更の原則と進め方についての話をしています。 破壊的変更の候補 C# 13 で導入したい field アクセス(自動プロパティのバッキングフィールドにアクセスするための field キーワード)と、 これまでに破壊的変更を避けるためにちょっと変な設計になっている var (型推論変数宣言)、_ (discard)が… 続きを読む
2024/02/08 オブジェクト初期化子中の ^ 演算子 今日の C# 話はちょこっとした修正の話になります。 これまで new C { [^1] = 1 }; がコンパイル通らなかったみたいで、これが最近修正されました。 (Visual Studio 17.9 Preview 3 (1月17日リリース済み)の時点で実装されていました。 気づいてはいたけども、小さすぎてブログにするかどうか迷ってるうちに3週間ほど経過。) 以下のコードで示すような修正内容です。 // これがコンパイル エラーを起こす。 // (Visual Studio… 続きを読む