ひでぼ~blog

C#ときどきゲーム

C#11のrequiredメンバーを試す

.NET7のRC版がリリースされてC#11を試せるようになったみたいなので新しく使えるようになったrequiredメンバーを触ってみます。

準備

.NET 7をインストールしておきます。この記事を書いてる時点では7.0.100-rc.1というバージョンでした。

dotnet.microsoft.com

VS2022でコンソールアプリを作成し、ターゲットフレームワークを.NET 7にします。 csprojはこんな感じになります。 また、requiredメンバーの良さを実感するためにnull許容参照型を使うようにしています。

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net7.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
  </PropertyGroup>

  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
    <LangVersion>preview</LangVersion>
  </PropertyGroup>

  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
    <LangVersion>preview</LangVersion>
  </PropertyGroup>

</Project>

クラスを準備する

こんなクラスを用意しました。

internal class Weapon
{
    public string Main { get; set; }

    public string Sub { get; set; }

    public string Special { get; set; }
}

ここで、null許容参照型のプロパティの初期化を行っていないためこのような警告が出ます。初期化をしろと怒られています。

コンストラクタを作成してプロパティを初期化したり、プロパティ初期化子(public string Main {get; set;} = null;)とかで初期化しておけば解決はできますがちょっとめんどいですね。 プロパティにrequiredというキーワードを付けるとこんな感じになります。

internal class Weapon
{
    public required string Main { get; set; }

    public required string Sub { get; set; }

    public required string Special { get; set; }
}

requiredと書いておくことでこのメンバーはオブジェクト初期化子で初期化しないといけなくなります。

// OK
var myWeapon1 = new Weapon
{
    Main = "カーボンローラー",
    Sub = "ロボットボム",
    Special = "ショクワンダー"
};

// Sub, Specialの初期化が足りてない
var myWeapon2 = new Weapon
{
    Main = "カーボンローラー",
};

// Main, Sub, Specialの初期化が足りてない
var myWeapon3 = new Weapon();

requiredを使うとオブジェクトをnewするときに必ずプロパティを初期化させるようにすることができました。

null許容参照型を使っているとクラス側で初期化が足りてないメンバーで警告が出ていましたがこれを回避できるようになったようです。良いですね。