クラスのプライマリコンストラクター
型のヘッダーでコンストラクターパラメーターを宣言します。
「クラスのプライマリコンストラクター」はCoddyKit上の無料C# Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC# Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C# Academyコースには全4レッスンが含まれています。
プライマリコンストラクターとは
プライマリコンストラクターを使うと、class Point(int x, int y) のように、クラスヘッダーでコンストラクターパラメーターを直接宣言できます。パラメーターはクラス本体全体で有効です。
using System;
class Point(int x, int y) {
public int X => x;
public int Y => y;
}
var p = new Point(3, 4);
Console.WriteLine(p.X + "," + p.Y); // 3,4定型コードをなくす
プライマリコンストラクターがなければ、パラメーターをフィールドにコピーするだけでもコンストラクター本体を記述する必要がありました。現在は、ヘッダーでパラメーターを宣言し、それらを直接参照できます。
using System;
class Greeter(string name) {
public string Greet() => "Hello, " + name + "!";
}
Console.WriteLine(new Greeter("Ada").Greet()); // Hello, Ada!パラメーターはどこでも有効
プライマリコンストラクターのパラメーターは、クラス内のプロパティ初期化子、メソッド本体、フィールド初期化子で使用できます。
using System;
class Circle(double radius) {
public double Area => Math.PI * radius * radius;
public double Circumference => 2 * Math.PI * radius;
}
var c = new Circle(2);
Console.WriteLine(Math.Round(c.Area, 2)); // 12.57フィールドとプロパティの初期化
プライマリコンストラクターのパラメーターを使って、宣言時にフィールドやプロパティを初期化できます。
using System;
class Account(decimal initial) {
public decimal Balance { get; private set; } = initial;
public void Deposit(decimal amount) => Balance += amount;
}
var a = new Account(100m);
a.Deposit(50m);
Console.WriteLine(a.Balance); // 150ヘッダーでの検証
フィールドへの代入時に throw 式を使うことで、プライマリコンストラクターのパラメーターをインラインで検証できます。
using System;
class Person(string name) {
public string Name { get; } =
string.IsNullOrWhiteSpace(name)
? throw new ArgumentException("name required")
: name;
}
Console.WriteLine(new Person("Lin").Name); // Lin追加のコンストラクターの定義
プライマリコンストラクターを持つクラスでも追加のコンストラクターを宣言できます。ただし、: this(...) を使ってプライマリコンストラクターに連鎖させる必要があります。
using System;
class Box(int width, int height) {
public int Width => width;
public int Height => height;
public Box(int size) : this(size, size) { }
}
var sq = new Box(5);
Console.WriteLine(sq.Width + "x" + sq.Height); // 5x5プライマリコンストラクター本体
プライマリコンストラクターには独自の本体がありません。構築時に実行する必要があるロジックは、フィールド初期化子または連鎖させた通常のコンストラクターに記述します。
using System;
class Logger(string prefix) {
private readonly string tag = "[" + prefix + "]";
public void Log(string msg) => Console.WriteLine(tag + " " + msg);
}
new Logger("INFO").Log("started"); // [INFO] started自動的にパブリックプロパティにはならない
レコードとは異なり、通常のクラスのプライマリコンストラクターはパブリックプロパティを作成しません。パラメーターは、明示的に公開しない限りクラス内でのみ使用できます。
using System;
class Temp(double celsius) {
// celsius is NOT a public property here
public double Fahrenheit => celsius * 9 / 5 + 32;
}
Console.WriteLine(new Temp(100).Fahrenheit); // 212キャプチャされたパラメーターはフィールドになる
プライマリコンストラクターのパラメーターを初期化子だけでなくメソッドでも使用すると、構築後も値を保持できるように、コンパイラがそのパラメーターを隠しフィールドにキャプチャします。
using System;
class Counter(int start) {
private int value = start;
public int Next() => value++;
}
var c = new Counter(10);
Console.WriteLine(c.Next()); // 10
Console.WriteLine(c.Next()); // 11依存性注入を簡潔にする
プライマリコンストラクターは DI でよく使われます。サービスをヘッダーで宣言してメソッドから使用できるため、手動でフィールドに代入する必要がありません。
using System;
interface IClock { string Now(); }
class FakeClock : IClock { public string Now() => "12:00"; }
class Service(IClock clock) {
public string Report() => "Time is " + clock.Now();
}
Console.WriteLine(new Service(new FakeClock()).Report()); // Time is 12:00総合例
このクラスは、依存関係にプライマリコンストラクターを使用し、明示的なコンストラクター本体なしで計算プロパティを公開しています。
using System;
class Rectangle(double w, double h) {
public double Area => w * h;
public double Perimeter => 2 * (w + h);
}
var r = new Rectangle(3, 4);
Console.WriteLine(r.Area + " " + r.Perimeter); // 12 14理解度チェック
クラスでのプライマリコンストラクターを理解できているか確認しましょう。
まとめ
クラスでのプライマリコンストラクターについて学びました。
class C(int x)で、ヘッダーにコンストラクターパラメーターを宣言できます。- パラメーターはクラス本体全体で有効です。
- 追加のコンストラクターは
: this(...)で連鎖させます。 - 通常のクラスでは、パラメーターが自動的にパブリックプロパティになることはありません。
よくある質問
「クラスのプライマリコンストラクター」レッスンは無料ですか?
はい。「クラスのプライマリコンストラクター」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- クラスのプライマリコンストラクター
- メンバーでのパラメーターのキャプチャ
- 構造体のプライマリコンストラクター
- プロパティと基底型との組み合わせ