0Pricing
C# Academy · レッスン

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

値型にプライマリコンストラクターを適用します。

「構造体のプライマリコンストラクター」はCoddyKit上の無料C# Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC# Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C# Academyコースには全4レッスンが含まれています。

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

構造体もプライマリコンストラクターをサポートしています。struct Point(int x, int y)のように、クラスと同じくヘッダーでパラメーターを宣言します。

using System;

struct 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;

struct Vec(int x, int y) {
    public int X => x;
    public int Y => y;
}

var zero = new Vec(); // default: x=0, y=0
Console.WriteLine(zero.X + "," + zero.Y); // 0,0

プロパティによるパラメーターの公開

クラスの場合と同様に、構造体のプライマリコンストラクターのパラメーターが自動的にパブリックプロパティになることはありません。明示的に公開してください。

using System;

struct Size(int w, int h) {
    public int Width { get; } = w;
    public int Height { get; } = h;
}

var s = new Size(10, 20);
Console.WriteLine(s.Width * s.Height); // 200

計算されるメンバー

構造体のプライマリコンストラクターは、計算結果を返す式形式のメンバーと組み合わせると便利です。

using System;

struct Complex(double re, double im) {
    public double Magnitude => Math.Sqrt(re * re + im * im);
}

Console.WriteLine(new Complex(3, 4).Magnitude); // 5

読み取り専用構造体

readonly structとプライマリコンストラクターを組み合わせると、不変性を保証できます。すべてのメンバーが状態を変更できないため、読み取り専用プロパティと特に相性がよい構成です。

using System;

readonly struct Money(decimal amount, string currency) {
    public decimal Amount { get; } = amount;
    public string Currency { get; } = currency;
    public string Display => Amount.ToString("0.00") + " " + Currency;
}

Console.WriteLine(new Money(5m, "USD").Display); // 5.00 USD

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

追加の構造体コンストラクターでは、クラスと同様に: this(...)を使ってプライマリコンストラクターを呼び出す必要があります。

using System;

struct Square(int side) {
    public int Side => side;
    public int Area => side * side;
    public Square() : this(1) { } // explicit default side
}

Console.WriteLine(new Square(4).Area); // 16

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

new Square()では、暗黙のゼロ初期化と、宣言したパラメーターなしコンストラクターのどちらも使用できる点に注意してください。委譲するコンストラクターを定義した場合は、そのロジックが実行されます。

using System;

struct Pct(double value) {
    public double Value { get; } = value;
    public Pct() : this(100) { }
}

Console.WriteLine(new Pct().Value); // 100

値セマンティクスは維持される

構造体は引き続き値によってコピーされます。プライマリコンストラクターを使ってもこの点は変わりません。構造体を代入すると、すべてのフィールドがコピーされます。

using System;

struct Counter(int n) {
    public int N { get; set; } = n;
}

var a = new Counter(1);
var b = a;       // copy
b.N = 99;
Console.WriteLine(a.N + " " + b.N); // 1 99

変更可能なフィールドの初期化

パラメーターから、set 可能なプロパティやフィールドを初期化できます。ただし、通常は不変な構造体のほうが望ましいでしょう。

using System;

struct Bag(int capacity) {
    public int Capacity { get; set; } = capacity;
    public int Used { get; set; } = 0;
}

var bag = new Bag(10);
bag.Used = 3;
Console.WriteLine(bag.Capacity - bag.Used); // 7

分解

プライマリコンストラクターとDeconstructメソッドを組み合わせると、タプルのようにアンパックできます。

using System;

struct Point(int x, int y) {
    public int X => x;
    public int Y => y;
    public void Deconstruct(out int a, out int b) { a = x; b = y; }
}

var (px, py) = new Point(7, 8);
Console.WriteLine(px + "," + py); // 7,8

まとめて実装する

readonly struct とプライマリコンストラクターを使って構築した、小さな不変の値型です。

using System;

readonly struct Temperature(double celsius) {
    public double Celsius { get; } = celsius;
    public double Fahrenheit => Celsius * 9 / 5 + 32;
}

var t = new Temperature(25);
Console.WriteLine(t.Fahrenheit); // 77

簡単な確認

構造体のプライマリコンストラクターについて理解できているか確認してください。

まとめ

構造体でのプライマリコンストラクターについて学びました。

  • struct P(int x, int y)のように、ヘッダーでパラメーターを宣言します。
  • 暗黙のパラメーターなしコンストラクターも引き続き存在します。
  • readonly structと組み合わせると、不変の値型を作成できます。
  • 追加のコンストラクターは: this(...)で委譲します。

よくある質問

「構造体のプライマリコンストラクター」レッスンは無料ですか?

はい。「構造体のプライマリコンストラクター」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C# Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C# Academyコースには全4レッスンが含まれています。

「構造体のプライマリコンストラクター」で何を学びますか?

値型にプライマリコンストラクターを適用します。 ブラウザで直接実行するハンズオンコードでC# Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

C# Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのC# Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「構造体のプライマリコンストラクター」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このC# Academyレッスンでコードを書いて実行できますか?

はい。すべてのC# Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

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

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