rksoftware

Visual Studio とか C# とかが好きです

C# 9.0 の確認「ターゲット型の新しい式」

C# 9.0 の確認の目次はこちら

■ ターゲット型の新しい式

ドキュメントはこちら
適合性と完成度の機能 という項目の一つ目のブロックです。

機能の名前だけを見ても想像しづらいですが、 new 式 という式が追加されました。雑にいうと型がわかっているところで new するときに型を書く必要がなくなりました。最近流行りの言語でよくあるやつですね。

公式ドキュメントだけで十分という気がしますが試してみましょう。

■ 検証コードと結果

■ 変数

変数は宣言時に型を書いていれば、これからは new で型を書く必要はありません。変数の型を書いているので var で書くのと長さはあまり変わりませんが *1。

System.Collections.Generic.List<int> hoge = new();
Console.WriteLine(hoge.GetType().FullName);

結果

System.Collections.Generic.List`1[[System.Int32,......

*1 都市伝説として語られる var 禁止の現場でこの式が受け入れられるか注目したいです。

■ フィールド

フィールドは宣言で型を絶対に書くので、常に new で型を書く必要はありません。フィールドを書く機会自体がそれほどはない方も多いかもしれませんが *2。

static System.Collections.Generic.List<int> Hoge = new();

static void Main(string[] args)
{
    Console.WriteLine(Hoge.GetType().FullName);
}

結果

System.Collections.Generic.List`1[[System.Int32,......

*2 都市伝説として語られる var 禁止の現場ではプロパティよりフィールドが主流かもしれないので、フィールドでのこの式の使用が流行るか注目したいです。

■ プロパティ

プロパティでも、これからは new だけで OK です *3。

static System.Collections.Generic.List<int> Hoge { get; set; } = new();

static void Main(string[] args)
{
    Console.WriteLine(Hoge.GetType().FullName);
}

結果

System.Collections.Generic.List`1[[System.Int32,......

*3 都市伝説として語られる var 禁止の現場は自動実装プロパティが禁止されているかもしれないので、この式が受け入れられるかと共にそろそろ自動実装プロパティが許されるか注目したいです。

■ 引数

メソッドの引数でも、new だけで引数の型で作られます。これは今後基本になりそうですね *4。

static void Fuga(System.Collections.Generic.List<int> hoge)
    => Console.WriteLine(hoge.GetType().FullName);

static void Main(string[] args)
{
    Fuga(new());
}

4 都市伝説として語られる var 禁止の現場で、禁止の理由のマイナーな方に「ソースコードを紙に印刷したときに型がわからない」というのがあると聞いています。それが理由ならこの式も何気に厳しそうです。ソースコードを紙に印刷して確認している現場でこの式が受け入れられるか注目したいです 5。

■ 初期化子

new() の後ろに初期化子も書けます。これは少し気持ち悪い気もしますが。

System.Collections.Generic.List<int> hoge = new (){ 0, 1, 2 };
Console.WriteLine(string.Join(", ", hoge));
0, 1, 2

何となく気持ち悪いのは、残念ながらこうは書けなかったところですね。

List<int> hoge = new { 0, 1, 2 };

よく考えたらこれは別の意味になってしまうから仕方ないですね。

■ まとめ

タイプ数が短くなるのでいいと思います。慣れないと気持ち悪いという方もいるかもしれませんが、ほかの言語では大体こうなっているので時代ですね。
これから急激に主流になってくるはずです *6。備えましょう。

5 var 禁止の理由のメジャーな方は「var で宣言した変数には型がない」と言語仕様を誤って認識していることのようです。
6 都市伝説として語られる var 禁止の現場はずっと .NET Framework 4.8 で .NET に移行しない可能性もありますが、.NET に移行できて主流になれるのか注目したいです。