0Pricing
C# Academy · レッスン

クラスのプライマリコンストラクター

型のヘッダーでコンストラクターパラメーターを宣言します。

「クラスのプライマリコンストラクター」は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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. クラスのプライマリコンストラクター
  2. メンバーでのパラメーターのキャプチャ
  3. 構造体のプライマリコンストラクター
  4. プロパティと基底型との組み合わせ
← C# Academyに戻る