自動的に実装されるプロパティ
自動的に実装されるプロパティは、プロパティ アクセサーで他のロジックが必要ない場合に、プロパティ宣言をより簡潔にします。 これにより、クライアント コードでオブジェクトを作成することも可能になります。 次の例に示すようにプロパティを宣言する場合、コンパイラによって、プロパティの get
および set
アクセサーを介してのみアクセスできる、プライベートの匿名バッキング フィールドが作成されます。 init
アクセサーは、自動的に実装されるプロパティとして宣言することもできます。
次の例は、自動的に実装されるプロパティを持つ単純なクラスを示しています。
// This class is mutable. Its data can be modified from
// outside the class.
public class Customer
{
// Auto-implemented properties for trivial get and set
public double TotalPurchases { get; set; }
public string Name { get; set; }
public int CustomerId { get; set; }
// Constructor
public Customer(double purchases, string name, int id)
{
TotalPurchases = purchases;
Name = name;
CustomerId = id;
}
// Methods
public string GetContactInfo() { return "ContactInfo"; }
public string GetTransactionHistory() { return "History"; }
// .. Additional methods, events, etc.
}
class Program
{
static void Main()
{
// Initialize a new object.
Customer cust1 = new Customer(4987.63, "Northwind", 90108);
// Modify a property.
cust1.TotalPurchases += 499.99;
}
}
インターフェイスで自動的に実装されるプロパティを宣言することはできません。 自動的に実装され、フィールドに基づくプロパティはプライベート インスタンス バッキング フィールドを宣言し、インターフェイスはインスタンス フィールドを宣言できません。 本体を定義せずにインターフェイスでプロパティを宣言すると、アクセサーを使用してプロパティが宣言されます。 そのインターフェイスを実装する各型は、そのプロパティを実装する必要があります。
フィールドと同様に、自動的に実装されるプロパティを初期化できます。
public string FirstName { get; set; } = "Jane";
前の例に示したクラスは、変更可能です。 クライアント コードでは、作成後、オブジェクト内の値を変更できます。 データだけでなく、重要な動作 (メソッド) も含まれる複雑なクラスでは、多くの場合、パブリック プロパティが必要です。 ただし、値のセット (データ) をカプセル化するだけで動作がほとんどまたはまったくない小さなクラスまたは構造体の場合は、次のいずれかのオプションを使用して、オブジェクトを変更不可にする必要があります。
get
アクセサーのみを宣言します (コンストラクター以外のすべての場所で変更できません)。get
アクセサーとinit
アクセサーを宣言します (オブジェクトの構築時を除き、すべての場所で変更できません)。set
アクセサーをプライベートとして宣言します (コンシューマーには変更できません)。
詳細については、「 自動的に実装されるプロパティを使用して軽量クラスを実装する方法を参照してください。
自動的に実装されるプロパティに検証を追加することが必要な場合があります。 C# 13 では、プレビュー機能としてフィールドに基づくプロパティが追加されます。 field
キーワードを使用して、自動的に実装されるプロパティのコンパイラ合成バッキング フィールドにアクセスします。 たとえば、前の例の FirstName
プロパティを null
または空の文字列に設定できないようにすることができます。
public string FirstName
{
get;
set
{
field = (string.IsNullOrWhiteSpace(value) is false
? value
: throw new ArgumentException(nameof(value), "First name can't be whitespace or null"));
}
} = "Jane";
この機能を使用すると、バッキング フィールドを明示的に宣言しなくても、アクセサーにロジックを追加できます。 field
キーワードを使用して、コンパイラによって生成されたバッキング フィールドにアクセスします。
重要
field
キーワードは、C# 13 のプレビュー機能です。 field
コンテキスト キーワードを使用するには、.NET 9 を使用し、<LangVersion>
要素をプロジェクト ファイルにpreview
するように設定する必要があります。
field
という名前のフィールドがあるクラスでは、field
キーワード機能を使用する場合は注意が必要です。 新しい field
キーワードは、プロパティ アクセサーのスコープ内の field
という名前のフィールドをシャドウします。 field
変数の名前を変更するか、@
トークンを使用してfield
識別子を@field
として参照できます。 詳細については、field
キーワード機能の仕様を参照してください。
関連項目
.NET