C# 11 Preview 3公開
Microsoft社は4月18日(現地時間)に、C#11の最新プレビューであるPreview 3を公開しました。こちらはVisual Studio 2022のバージョン17.2 Preview 3 または、 .NET 7 Preview 3にて試すことが出来ます。
checkedとunchecked修飾子の追加
各種プレビュー機能の中で、私はcheckedとuncheckedという修飾子に興味を持ちました。これらの修飾子は、整数型の算術演算あるいは変換に対して、オーバーフローチェックをするかどうかを明示的に設定することが出来るものです。
C#の整数の仕様
C#で整数型の演算において非定数値が含まれる場合は、たとえ演算結果がオーバーフローしていても例外が発生しませんでした。以下の状況においても何も問題が発生せず処理が進みます。
C#
int ten = 10;
int overflow = 2147483647 + ten; // 例外は発生しない
Console.WriteLine(overflow); // この段階でも例外は発生せず、-2,147,483,639と表示される
今回のプレビューで公開されたchecked演算子を使用することで、その演算に対してオーバーフローチェックを強要することが出来ます。
C#
// オーバーフローを検知し、例外を発生させる
Console.WriteLine(checked(2147483647 + ten));
// ブロック内の全ての整数値オーバーフローを検知する
checked
{
int overflow = 2147483647 + ten; // ここで例外が発生する
Console.WriteLine(i3);
}
逆にオーバーフローチェックを行わないようにするunchecked修飾子というのもあります。
C#
// オーバーフローを検知しない
Console.WriteLine(unchecked(2147483647 + ten));
この二つの演算子を用いることで、整数値の演算結果に対してオーバーフローチェックを行うかどうかを、明示的に記述することが出来ます。
余談
実は私はこのプレビューを見るまで、今回話したオーバーフローが行われない仕様を知りませんでした。(数値を扱うときは大抵floatなど浮動小数点型を使っていたため)今回の使用のように明示的に機能の定義ができるものは、コードの読みやすさを向上させてくれるので、もし使うような状態になったときには積極的に使っていこうと思いました。