目次

Ver. 12.0

※ 2024/7/6 現在、プレビュー版です。

リリース時期 2024/11
同世代技術
  • .NET 9.0

執筆予定: C# 13.0 トラッキング issue

Lock クラスに対する lock

.NET 9 で Lock クラス(System.Threading 名前空間)という新しい lock 用の型が追加されたことに伴って、 lock ステートメントでこの Lock クラスを特別扱いするようになりました。 既存の lock (Monitor.Enter に展開される)と異なり、以下のようなコードに展開されます。

var syncObject = new Lock();

// lock (syncObject)
using (syncObject.EnterScope())
{
}

詳しくは「Lock クラス」で説明しています。

\e (エスケープ文字のエスケープ シーケンス)

文字・文字列リテラル中のエスケープ シーケンス\e (U+001B、エスケープ文字)が追加されました。

例えば、コンソール アプリで以下のように書くことで、文字列の色を変えたり装飾したりできます。

Console.WriteLine("\e[31mred text");
Console.WriteLine("\e[4munderlined text");
Console.WriteLine("\e[0mreset style");

\e エスケープ シーケンス

機能追加の背景などについてはブログ記事「\e (エスケープ文字のエスケープ シーケンス)」で説明しています。

その他

その他、ほぼバグ修正レベルの機能がいくつかあります。

オブジェクト初期化子中の ^ 演算子

以下のように、オブジェクト初期化子中の [] の中でインデックスの ^ 演算子を使えるようになりました。

// これが C# 12 以前はコンパイル エラーを起こしてた。
var c = new C { [^1] = 1 };

// これなら昔からコンパイルできる。
// (オブジェクト初期化子はこれと同じコードに展開されるはずなのに。)
c[^1] = 1;

class C
{
    // インデクサーと Length さえ持っていれば c[^i] と書けるようになる。
    // c[c.Length - i] 扱い。
    public int Length => 1;
    public int this[int i] { get => i; set { } }
}

デリゲートの自然な型の改善

デリゲートの自然な型の決定の際、 メソッド グループに対する型決定がちょっと賢くなったそうです。 同名のインスタンス メソッドと拡張メソッドがあるとき、インスタンス メソッドを優先的に見るようになりました。

例えば以下のようなクラスがあったとします。

public class C
{
    public void M() { } // インスタンス メソッド M と、
}

public static class E
{
    public static void M(this C c, object o) { } // 同名の拡張メソッド。
}

この C 型のインスタンス x に対して x.M と書いたとき、 C# 12 までは自然な型を決定できなかったのに対して、 C# 13 ではインスタンスメソッドを優先的に見ます。

var x = new C();

// オーバーロード解決ではインスタンスメソッド優先。
x.M();      // C.M()
x.M(""); // E.M(C, object)

// 型の明示があると昔から大丈夫だった。
Action a = x.M;         // C.M()
Action<object> b = x.M; // E.M(C, object)

// var を使う。
// これが C# 13 から行けるように。
// インスタンス メソッド優先で、Action 型になる。
var z = x.M;

更新履歴

ブログ