フッターコンテンツにスキップ
Iron Academy Logo
C#を学ぶ
C#を学ぶ

その他のカテゴリー

C#プロパティを理解する

Tim Corey
9分50秒

.NET 7で導入されたC# 11では、プロパティに必須キーワードが追加されました。 この記事では、ティム・コーリーの簡潔なビデオチュートリアル".NET 7 Update:10分以内に必須のプロパティを学ぶ"の簡潔なビデオチュートリアルを例に、C# プロパティについて説明します。 プロパティの基本から、新しいrequiredキーワード、初期化ルールの強制に役立つ方法まで、すべてを説明します。

C# プロパティ

C# では、プロパティによって、フィールドをカプセル化し、オブジェクトのクラス・データ・メンバへのアクセスを管理することができます。 これらのツールは、外部からのアクセスを可能にしながら、データの整合性を確保するために一般的に使用されています。 プライベートフィールドは、プロパティを使用してカプセル化することができ、データへのアクセス方法や変更方法を制御することができます。 パブリック文字列プロパティは、多くの場合、クラスのメンバーを効率的に操作するために、アクセサ(getとset)と呼ばれる特別なメソッドを利用します。 C#の静的プロパティは、クラスをインスタンス化することなくアクセスすることができ、プロパティ値を管理するユニークな方法を提供します。

ここでは、Timがどのように簡単なプロパティの例を設定し、デモンストレーションを行うかを紹介します。

コンソール アプリケーションの作成

まず、ティムはC# 11を使用した基本的な.NET 7コンソールアプリケーションから始めます。このバージョンでは、以前のバージョン for .NETでは使用できなかった必須キーワードが導入されています。

シンプルなモデルの定義

ティムは、PersonModelクラスを作成します。

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値を招く危険があります。

初期化を確実にするためにコンストラクタを使用する

プロパティが常に初期化されるようにする一般的な方法は、コンストラクタです。 ティムの例では、彼はLastNameの両方を必要とします。

public PersonModel(string firstName, string lastName)
{
    FirstName = firstName;
    LastName = lastName;
}
public PersonModel(string firstName, string lastName)
{
    FirstName = firstName;
    LastName = lastName;
}

このアプローチにより、LastNameの両方が提供されなければならないことが強制されます。 これらの値を指定せずにPersonModelを作成しようとすると、コンパイラはそれをエラーとしてフラグします。

ヌル可能なコンテキスト

C# 10および.NET 6以降、C#はnull可能な参照型を導入しました。これはプロパティが初期化されるか、?を使って明示的にNullableとしてマークされる必要があることを意味します。 たとえば、LastNameがnullでありうる場合、次のように定義します。

public string? FirstName { get; set; }
public string? LastName { get; set; }
public string? FirstName { get; set; }
public string? LastName { get; set; }

しかし、ティムの例では、LastNameは常に非nullであると仮定します。 当初、nullabilityは、慎重な初期化またはnullableアノテーションで処理されていましたが、C# 11では、より堅牢なオプションがあります。

必要なキーワードの紹介

コンストラクタが初期化を強制する一方で、C# 11はrequiredキーワードを導入し、特定のプロパティが設定されることをより簡単に保証できるようにします。 requiredを使用すると、個々のプロパティを必須としてマークでき、オブジェクトの初期化時に値を割り当てる必要があります。

必須プロパティの設定

ティムは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を省略すると、コンパイラはエラーをフラグし、これらの必須プロパティを初期化するよう促します。

コンストラクタで必須を使用する

ティムは、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を追加することで、これらのプロパティがコンストラクタ内で設定されることをコンパイラに通知し、初期化エラーを回避します。 この機能は、プロパティがどのように初期化されるかについて柔軟性を持たせながら、偶発的な省略を防ぐのに役立ちます。

必須プロパティが便利な理由

ティムは新しいrequiredキーワードがプロパティが常に設定されることを保証するプロセスを簡素化することを説明します。 set メソッドのコンストラクタをあらゆるケースで必要としたり、プロパティが未設定のリスクを冒す代わりに、プロパティ宣言で直接特定の値を要求する簡単な方法があります。

この機能は、特定のフィールドが必須のデータモデルで輝きを放ち、実行時のNULLエラーを防ぐことで、開発プロセスの早い段階で問題を発見するのに役立ちます。

追加プロパティの例

その後ティムは、nullableにできるオプショナルなプロパティEmailを追加しました。

public string? Email { get; set; }
public string? Email { get; set; }

Emailプロパティはコンパイラエラーを引き起こさずに未設定のままにできます。 この例でTimは、必須とオプションのデータフィールドを明確に区別したクラスで、柔軟性があることを示しました。

結論

C# 11の必須プロパティの追加は、開発者にとって貴重な機能であり、必須プロパティが常に初期化されることを保証します。 Tim Corey の video は、この機能の優れた紹介と、コンソール アプリケーション内での動作の実演を提供しています。 requiredキーワードとオブジェクト初期化子、およびコンストラクタを組み合わせることで、C#でより堅牢で安全なデータモデルを作成できます。 その他の有益なチュートリアルについては、ティムのYouTubeチャンネルをご覧ください。

Hero Worlddot related to C#プロパティを理解する
Hero Affiliate related to C#プロパティを理解する

好きなことを共有することで収入を増やす

.NET、C#、Java、Python、またはNode.jsを使用する開発者向けのコンテンツを作成しますか?あなたの専門知識を副収入に変えましょう!

アイアンサポートチーム

私たちは週5日、24時間オンラインで対応しています。
チャット
メール
電話してね