岩永さんの.NET 6 Preview 1 の配信に参加しています

2 min read読了の目安(約2500字

岩永さんの YouTube 配信に参加してきました!参加しながら自分が興味があったものを適当に書きなぐってみたメモです。

https://www.youtube.com/watch?v=y7kqEYov5ro

該当 Issue (岩永さんの配信リポジトリ)

当日の配信で触れたコードなどは、こちらの岩永さんのリポジトリの Issue に抜粋されています!

https://github.com/ufcpp-live/UfcppLiveAgenda/issues/26

内容

.NET 6 Preview 1 の SDK 公開!

.NET 6 Preview 1 が出ましたね! SDK もダウンロードできるけど Visual Studio は、まだ対応していないですね…。

https://dotnet.microsoft.com/download/dotnet/thank-you/sdk-6.0.100-preview.1-windows-x64-installer

C# 10.0 の一部機能が来てる

地味なところだけど、こんなのが書けるみたい。

int x;
(x, var y) = (1, "abc");

Visual Studio の .NET 化来る?

出来ない理由はなさそうだけど、やるかどうかは謎。

新しい Math 系のメソッド

Sin と Cos が同時に返ってくる Math.SinCos を試した。

using System;

var (sin, cos) = Math.SinCos(Math.PI);

初物としては BLC でタプルの戻り値になってるのがびっくり!!最近は out 引数よりもタプル戻り値のほうが早くなったらしい。
昔は out 引数のほうが早かったらしいです。

DivRem メソッドも戻り値と out 引数でそれぞれ値を返していたのがタプルになってる!
DivRem の定義がこんな感じになってます。nint はタプルのほうにしかない!

public static (nuint Quotient, nuint Remainder) DivRem(nuint left, nuint right);
public static (ulong Quotient, ulong Remainder) DivRem(ulong left, ulong right);
public static (uint Quotient, uint Remainder) DivRem(uint left, uint right);
public static (ushort Quotient, ushort Remainder) DivRem(ushort left, ushort right);
public static (sbyte Quotient, sbyte Remainder) DivRem(sbyte left, sbyte right);
public static (nint Quotient, nint Remainder) DivRem(nint left, nint right);
public static (short Quotient, short Remainder) DivRem(short left, short right);
public static (int Quotient, int Remainder) DivRem(int left, int right);
public static (byte Quotient, byte Remainder) DivRem(byte left, byte right);
public static long DivRem(long a, long b, out long result);
public static int DivRem(int a, int b, out int result);
public static (long Quotient, long Remainder) DivRem(long left, long right);

ここらへんの深い話に入っていったのでおとなしく聞いてた。

https://ufcpp.net/blog/2018/12/hdintrinsic/

Windows ACLs ????

なるほど…、わからん…。
.NET Framework からの移植みたい。

Windows でしか使えないので、他のプラットフォームから呼ぶと例外になりそう。
Analyzer でサポートされていないプラットフォームで呼び出す可能性がある場合には気づける。

MAUI とか

まだ無い。

Portable thread pool

.NET 6 でスレッド プールが再実装!?
古いのにも戻せる。

COMPlus_ThreadPool_UsePortableThreadPool=0

もしかしたら、スレッド系の潜在的バグが表面化するかも?注意。

Crossgen2

Ready to run で使われる AOT コンパイラもマネージドなコードになった。

AOT でビルドするときに使ってないクラスとかメソッドが消される?という話題から JSON シリアライズでコンストラクタが消えてしまっているという問題によくあうという話題から System.Text.Json が全角スペースを \U3000 とかにしてしまう問題の悩みを話した。
JSON シリアライザーをソースジェネレーター化するという話しとか出てるみたい。

まとめ

この岩永さんの配信聞いてるだけで超勉強になるので毎週チェックするのお勧め。