自動実装プロパティ
簡潔な自動実装構文でプロパティを宣言します。
「自動実装プロパティ」はCoddyKit上の無料C# Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC# Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C# Academyコースには全4レッスンが含まれています。
プロパティとは
プロパティは外部からはフィールドのように見えますが、アクセサーメソッド(get と set)によって実装されています。プロパティを使うと、データの読み取りと書き込み方法を制御しながらデータを公開できます。
using System;
class Program
{
public string Name { get; set; }
static void Main()
{
var p = new Program();
p.Name = "Coddy";
Console.WriteLine(p.Name);
}
}自動実装プロパティの構文
自動実装プロパティでは { get; set; } を使用します。コンパイラーが非表示のバッキングフィールドを自動生成するため、自分で記述する必要はありません。
using System;
class Person
{
public string FirstName { get; set; }
public int Age { get; set; }
}
class Program
{
static void Main()
{
var person = new Person { FirstName = "Ada", Age = 36 };
Console.WriteLine(person.FirstName + " is " + person.Age);
}
}フィールドではなくプロパティを使う理由
パブリックプロパティは安定した API になります。後から検証を追加したり、保存方法を変更したりしても、呼び出し元を壊さずに済みます。パブリックフィールドではこのような変更に対応できません。
using System;
class Account
{
public decimal Balance { get; set; }
}
class Program
{
static void Main()
{
var a = new Account();
a.Balance = 100.50m;
Console.WriteLine("Balance: " + a.Balance);
}
}読み取り専用の自動実装プロパティ
set を省略すると、プロパティを読み取り専用にできます。コンストラクターまたは初期化子でのみ値を設定できるため、デフォルトで変更できない値にできます。
using System;
class Circle
{
public double Radius { get; }
public Circle(double radius)
{
Radius = radius;
}
}
class Program
{
static void Main()
{
var c = new Circle(5.0);
Console.WriteLine("Radius: " + c.Radius);
}
}プロパティの既定値
= value; を使うと、自動実装プロパティに初期値を指定できます。これはオブジェクトの作成時に、コンストラクター本体より前に実行されます。
using System;
class Settings
{
public bool DarkMode { get; set; } = true;
public int Volume { get; set; } = 50;
}
class Program
{
static void Main()
{
var s = new Settings();
Console.WriteLine("DarkMode: " + s.DarkMode + ", Volume: " + s.Volume);
}
}private setter
private set を使うと、クラス内部では値を変更しつつ、外部コードからの変更を防止できます。これは一般的なカプセル化のパターンです。
using System;
class Counter
{
public int Count { get; private set; }
public void Increment()
{
Count++;
}
}
class Program
{
static void Main()
{
var counter = new Counter();
counter.Increment();
counter.Increment();
Console.WriteLine("Count: " + counter.Count);
}
}init 専用 setter
init アクセサー(C# 9 以降)を使うと、オブジェクトの初期化中にのみ値を設定できます。構築後は値が固定されます。
using System;
class Product
{
public string Name { get; init; }
public decimal Price { get; init; }
}
class Program
{
static void Main()
{
var p = new Product { Name = "Book", Price = 12.99m };
Console.WriteLine(p.Name + ": " + p.Price);
}
}異なるアクセスレベルのプロパティ
プロパティには通常のアクセス修飾子を指定できます。レベルを組み合わせて、パブリックな getter と private な setter にしたり、完全に internal なプロパティにしたりできます。
using System;
class User
{
public string Id { get; private set; }
public User(string id)
{
Id = id;
}
}
class Program
{
static void Main()
{
var u = new User("u-001");
Console.WriteLine("User Id: " + u.Id);
}
}計算されるように見える自動実装プロパティ
自動実装プロパティはデータを保存するだけで、計算は行いません。計算値が必要な場合は、完全なプロパティを使用します(後で説明します)。ここでは、自動実装プロパティを単純な保存領域として扱ってください。
using System;
class Rectangle
{
public double Width { get; set; }
public double Height { get; set; }
}
class Program
{
static void Main()
{
var r = new Rectangle { Width = 4, Height = 3 };
double area = r.Width * r.Height;
Console.WriteLine("Area: " + area);
}
}自動実装プロパティの更新
set 可能な自動実装プロパティは、変数と同じように何度でも読み取りや再代入ができます。
using System;
class Player
{
public int Score { get; set; }
}
class Program
{
static void Main()
{
var player = new Player();
player.Score = 10;
player.Score += 5;
player.Score *= 2;
Console.WriteLine("Score: " + player.Score);
}
}全体を組み立てる
一般的なモデルクラスの大部分は自動実装プロパティで構成されます。set 可能なもの、init 専用のもの、private setter を持つものを組み合わせることで、クラスを簡潔でわかりやすく保てます。
using System;
class BankAccount
{
public string Owner { get; init; }
public decimal Balance { get; private set; }
public void Deposit(decimal amount)
{
Balance += amount;
}
}
class Program
{
static void Main()
{
var acct = new BankAccount { Owner = "Lin" };
acct.Deposit(250m);
Console.WriteLine(acct.Owner + ": " + acct.Balance);
}
}理解度チェック
自動実装プロパティについて理解できているか確認しましょう。
まとめ
自動実装プロパティでは { get; set; } を使用し、コンパイラーがバッキングフィールドを生成します。読み取り専用の { get; }、変更を制御する private set、一度だけ値を設定する init などの形式があります。クラスでデータを公開する際のデフォルトの方法です。
using System;
class Demo
{
public string A { get; set; } = "settable";
public string B { get; } = "read-only";
public string C { get; init; } = "init-only";
}
class Program
{
static void Main()
{
var d = new Demo { C = "changed-at-init" };
Console.WriteLine(d.A + ", " + d.B + ", " + d.C);
}
}よくある質問
「自動実装プロパティ」レッスンは無料ですか?
はい。「自動実装プロパティ」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C# Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C# Academyコースには全4レッスンが含まれています。
「自動実装プロパティ」で何を学びますか?
簡潔な自動実装構文でプロパティを宣言します。 ブラウザで直接実行するハンズオンコードでC# Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
C# Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのC# Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「自動実装プロパティ」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このC# Academyレッスンでコードを書いて実行できますか?
はい。すべてのC# Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- 自動実装プロパティ
- バッキングフィールドを持つ完全なプロパティ
- 式形式のメンバー
- インデクサー