「マクロ欲しい」→「Source Generator 使え」→「むずい」→「ほら、作ったよ」
少し前に C# 言語仕様のディスカッションで、こんな提案が立ちました。 Compile-Time Inline Macros この手の提案は、ほぼ同様のものがたびたび出てきました。 そして毎回かなり高い確率で、「Source Generator を使ってくれ」が結論になります。 それでも同様の提案が繰り返し出るのは、つまりそれだけ Source Generator...
View ArticleC# 14 の破壊的変更点(First-class Span)
C# 14 で導入された First-class Span は破壊的変更を伴っています。 例えば標準ライブラリの範囲内の拡張メソッド呼び出しでも以下のような差が生じます。 int[] array = [1, 2, 3, 4]; // C# 13 まで: System.Linq.Enumerable.Contains (IEnumerable 引数) が呼ばれる // C# 14 から:...
View Articleファイナライザー
以下の ~Class1 のこと、(C# の言語機能名として)なんと呼びますか? class Class1 { public Class1() { } ~Class1() { } } すごく今更ながら、8年くらい前からこれの呼び名が変わってたらしいというのを最近気づいたという話になります。...
View Article文字列リテラルを data セクションに UTF-8 で書き込む案
ここ数回のブログ( その1、 その2、 その3 )、Language Feature Status に最近かかった更新のうち、すでに実装されたものの紹介をしていたわけですが。 「その Language Feature Status を見てると、何やら見慣れないものもちらほら増えてない?」みたいな話題も出ておりまして、今回からその辺りに触れていきたいと思います。 今日は「String...
View Articlenameof(T)
「Rosly の Language Feature Status に並んでいるもののうち、すでに preview 提供済みのものシリーズ第3段。 field キーワード First-class Span nameof(T<>) ← 今日はこれ すでに今、LangVersion に preview を指定すれば利用可能です。 今日は最後の1個の nameof(T<>)...
View ArticleFirst-class な Span 型
「Rosly の Language Feature Status に並んでいるもののうち、すでに preview 提供済みのものシリーズ第2段。 field キーワード First-class Span ← 今日はこれ nameof(T<>) すでに今、LangVersion に preview を指定すれば利用可能です。 今日は First-class Span。...
View Articlefield キーワード
「Rosly の Language Feature Status にこの1・2か月で結構更新かかったね」という話題もたびたびあり、その辺りの話を。 Language Feature Status に並んでいるもののうち、いくつかは preview として現時点でもうすでに取り込まれています。 field キーワード ← 今日はこれ First-class Span...
View ArticleUTF8 か Utf8 か
今日は C# 配信をやっててちょくちょく話題になるやつの話。 using System.Text; using System.Text.Unicode; var buffer = (stackalloc byte[3]); Utf8.FromUtf16("abc", buffer, out var r, out var w);...
View Article(没) 数学準拠な剰余演算子
こないだにつづき、C# 言語機能としては没ネタ。 最終的な結論が「ライブラリでやれ」 → 「.NET 10 でメソッド追加を検討」です。 剰余の利用例 剰余演算(C# だと % 演算子)の用途として、 「配列の範囲内に収めるために index % array.Length する」とかがあると思います。 例えば以下のような感じ。 var table = new Table([1, 2, 3, 4,...
View Article(没) UTF-8 文字列補間
今日のは、C# 言語機能としては否決されたものの、ほぼ同等のものがライブラリと JIT 時最適化で実現されたという話になります。 ちなみに今日のこの話は .NET 8 の頃の話で、「そういえば去年書いてなかった」ネタになります。 UTF-8 リテラルがあるなら C# 11 で UTF-8 リテラルが入って、 C# プログラム中に UTF-8 なバイト列を...
View Article.NET 9 の破壊的変更の1つを踏んだ話
かなりのレアケースを踏んだので酒の肴程度にその話を。 破壊的変更の内容: 浮動小数点数 → 整数の飽和変換 破壊的変更の告知ページ: Floating point-to-integer conversions are saturating 最小再現コードは以下の通り。 var x = int.MaxValue; var y = (float)x; var z = (int)y;...
View Articleref/ref struct 変数を非同期メソッド中で使えるように
前回の Lock クラスの話を見てから、とりあえず以下のコードを見てほしい。 using System.Runtime.Versioning; [module: RequiresPreviewFeatures] class MultiThreadCode { private static readonly object _syncObj = new(); private static...
View ArticleLock クラス
今日は、 .NET 9 で Lock クラスというのが入る予定で、 それに伴って C# コンパイラーにも対応が必要そうという話。 一応雰囲気的には C# 13 に入りそう。 任意のオブジェクトを lock C# はなぜか任意のオブジェクト インスタンスを使って排他制御ができます。 ロックを掛けるために以下のようなコードを書くことになります。 class MultiThreadCode {...
View ArticleExtensions (拡張型)
C# 3.0 から拡張メソッドが使えるわけですが、 もうちょっといろんな「拡張」をしたいという話が前々からあります。 例えば以下のような要求。 既存の型に静的メンバーも足したい プロパティや演算子も足したい インターフェイスの後付けもしたい 今では Extensions とか呼ばれていまして、以下の issue でトラッキング中。 Exploration: Shapes and...
View ArticleC# 13 でのコレクション式 - ディクショナリ式
C# 13でのコレクション式関連、量が多いのでちょっとずつ取り上げシリーズ。 [Proposal]: Collection Expressions Next (C#13 and beyond) 今日はディクショナリ式の話を。 ディクショナリ式 ← 今日はこれ 自然な型 インラインなコレクション式 コレクションに対する拡張メソッド 現状でコレクション式に対応してない型...
View ArticleC# 13 でのコレクション式 - 制限の緩和の話
C# 13 でのコレクション式 - 制限の緩和の話 C# 12 でコレクション式が入ったわけですが、 スケジュールの都合で「C# 12 後に改めて検討する」ということになった機能がたくさんあります。 C# 12 リリース(2023/11)直後から再検討が始まっていて、先月にはある程度まとまった計画が出ています。 [Proposal]: Collection Expressions Next...
View ArticleIList とかを IReadOnlyList とかから派生させたい
.NET が長らく抱えている「なぜ IList<T> は IReadOnlyList<T> ではないのか」問題、 .NET 9 で解消するかもしれないみたい。 ちなみに、問題を抱えるに至った原因は IReadOnlyList<T> が後付けということです。 1から作り直すのであれば、誰がどう考えても IList<T> は...
View Articleparams コレクション
ほぼ1年ぶりの params の話。 params を配列以外のコレクションに対して使えるようにするという話ですが、 雰囲気的に C# 13 でついに 入りそうです。 なので、最近そこそこ高頻度で Language Design Meeting の議題に上がっています。 Params Collection C# Language Design Meeting November 15th, 2023...
View Articleラムダ式の引数で、型名を省略して ref, out などだけを指定
ラムダ式で、ref 引数などに対して ref x => { } みたいに書けるようにしたいという話が出ています。 ラムダ式での ref 引数、out 引数 ラムダ式は、状況が許すなら、x => { } などといったように非常に簡素に書けます。 ところが、ref や out が絡むとそうもいかなくて、型推論が効く状況でも型名を省略できません。 //...
View Articlefield, value を文脈キーワード化
C# 13 向けに検討されている機能の一つに、 「半自動プロパティ」とか「field キーワード」と呼ばれているものがあります。 元々は C# 12 向けに考えられていて、去年、うちのブログでも書いているやつです。 【C# 12 候補】半自動プロパティ 簡単におさらいすると、 プロパティの get/set アクセサー内で、field を使って バッキング...
View Article