C#プロパティを理解する
.NET 7で導入されたC# 11では、プロパティに必須キーワードが追加されました。 この記事では、ティム・コーリーの簡潔なビデオチュートリアル".NET 7 Update:10分以内に必須のプロパティを学ぶ"の簡潔なビデオチュートリアルを例に、C# プロパティについて説明します。 プロパティの基本から、新しいrequiredキーワード、初期化ルールの強制に役立つ方法まで、すべてを説明します。
C#プロパティ
C# では、プロパティによって、フィールドをカプセル化し、オブジェクトのクラス・データ・メンバへのアクセスを管理することができます。 これらのツールは、外部からのアクセスを可能にしながら、データの整合性を確保するために一般的に使用されています。 プライベートフィールドは、プロパティを使用してカプセル化することができ、データへのアクセス方法や変更方法を制御することができます。 パブリック文字列プロパティは、多くの場合、クラスのメンバーを効率的に操作するために、アクセサ(getとset)と呼ばれる特別なメソッドを利用します。 C#の静的プロパティは、クラスをインスタンス化することなくアクセスすることができ、プロパティ値を管理するユニークな方法を提供します。
ここでは、Timがどのように簡単なプロパティの例を設定し、デモンストレーションを行うかを紹介します。
コンソール アプリケーションの作成
まず、ティムはC# 11を使用した基本的な.NET 7コンソールアプリケーションから始めます。このバージョンでは、以前のバージョン for .NETでは使用できなかった必須キーワードが導入されています。
シンプルなモデルの定義
Timは、LastNameのプロパティで作成します。
public class PersonModel
{
public string FirstName { get; set; }
public string LastName { get; set; }
}public class PersonModel
{
public string FirstName { get; set; }
public string LastName { get; set; }
}これらのプロパティにより、PersonModelは名前を保存できます。 ただし、追加の設定がない場合、LastNameが初期化されず、nullの値となる可能性があります。
初期化を確実にするためにコンストラクタを使用する
プロパティが常に初期化されるようにする一般的な方法は、コンストラクタです。 Timの例では、LastNameの両方を必要とします。
public PersonModel(string firstName, string lastName)
{
FirstName = firstName;
LastName = lastName;
}public PersonModel(string firstName, string lastName)
{
FirstName = firstName;
LastName = lastName;
}このアプローチでは、LastNameの両方を提供する必要があります。 これらの値を指定せずにPersonModelを作成しようとすると、コンパイラーはエラーとして警告します。
ヌル可能なコンテキスト
.NET 6とC# 10から、C#はnullable参照型を導入しました。これは、プロパティを初期化するか、?を使ってnullableとして明示的にマークする必要があることを意味します。 例えば、LastNameがnullの可能性がある場合、次のように定義します。
public string? FirstName { get; set; }
public string? LastName { get; set; }public string? FirstName { get; set; }
public string? LastName { get; set; }しかし、Timの例では、LastNameは常に非nullであるべきだと仮定します。 当初、nullabilityは、慎重な初期化またはnullableアノテーションで処理されていましたが、C# 11では、より堅牢なオプションがあります。
必要なキーワードの紹介
コンストラクターによる初期化の強制にもかかわらず、C# 11では特定のプロパティが設定されていることを保証するrequiredキーワードを導入します。 requiredを使用すると、個々のプロパティを必須としてマークでき、オブジェクトの初期化時に値が割り当てられる必要があります。
必須プロパティの設定
Timは4:15に、PersonModelクラスを次のように変更しました。
public class PersonModel
{
public required string FirstName { get; set; }
public required string LastName { get; set; }
}public class PersonModel
{
public required string FirstName { get; set; }
public required string LastName { get; set; }
}これらのプロパティをrequiredでマークすることにより、コンパイラーはオブジェクトの初期化子やコンストラクターを通じて設定することを強制します。 これは、コンストラクタを作成しなくても特定のプロパティを要求できるので便利です。
必須プロパティを含む使用例
ここで、PersonModelを次のように作成および初期化できます。
PersonModel person = new() { FirstName = "Tim", LastName = "Corey" };PersonModel person = new() { FirstName = "Tim", LastName = "Corey" };LastNameを省略すると、コンパイラーはエラーを警告し、これらの必須プロパティを初期化するよう促します。
コンストラクタで必須を使用する
Timは、requiredプロパティとコンストラクターの両方を使用するケースを示しています。 必要なプロパティを設定するコンストラクタがある場合、C#は、コンストラクタが呼び出されたときに、それらのプロパティが初期化されていることを確認する必要があります。
そのような場合、SetsRequiredMembers属性を使用して、コンストラクターが要求された条件を満たすことを示せます。 ティムがどのように適用したかを紹介します:
[SetsRequiredMembers]
public PersonModel()
{
FirstName = "Test";
LastName = "Test";
}
[SetsRequiredMembers]
public PersonModel(string firstName, string lastName)
{
FirstName = firstName;
LastName = lastName;
}[SetsRequiredMembers]
public PersonModel()
{
FirstName = "Test";
LastName = "Test";
}
[SetsRequiredMembers]
public PersonModel(string firstName, string lastName)
{
FirstName = firstName;
LastName = lastName;
}SetsRequiredMembersを追加することで、これらのプロパティがコンストラクター内で設定されることをコンパイラーに通知し、初期化エラーを回避します。 この機能は、プロパティがどのように初期化されるかについて柔軟性を持たせながら、偶発的な省略を防ぐのに役立ちます。
必須プロパティが便利な理由
Timは、新しいrequiredキーワードがプロパティが常に設定されることを保証するプロセスを簡素化することを説明します。 set メソッドのコンストラクタをあらゆるケースで必要としたり、プロパティが未設定のリスクを冒す代わりに、プロパティ宣言で直接特定の値を要求する簡単な方法があります。
この機能は、特定のフィールドが必須のデータモデルで輝きを放ち、実行時のNULLエラーを防ぐことで、開発プロセスの早い段階で問題を発見するのに役立ちます。
追加プロパティの例
その後、TimはEmailというオプションプロパティを追加し、nullableにすることができました。
public string? Email { get; set; }public string? Email { get; set; }Emailプロパティは設定されなくてもコンパイラーエラーを引き起こしません。 この例でTimは、必須とオプションのデータフィールドを明確に区別したクラスで、柔軟性があることを示しました。
結論
C# 11の必須プロパティの追加は、開発者にとって貴重な機能であり、必須プロパティが常に初期化されることを保証します。 Tim Corey の video は、この機能の優れた紹介と、コンソール アプリケーション内での動作の実演を提供しています。 requiredキーワードをオブジェクト初期化子とコンストラクターと組み合わせることで、C#のより堅牢で安全なデータモデルを作成できます。 その他の有益なチュートリアルについては、ティムのYouTubeチャンネルをご覧ください。

