0Pricing
C# Academy · レッスン

メンバーでのパラメーターのキャプチャ

型全体でプライマリコンストラクターのパラメーターを使います。

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

メンバーでのパラメーターの使用

プライマリコンストラクターの力は、パラメーターをメンバー、つまりメソッド、プロパティ、フィールド初期化子で使用できる点にあります。コンパイラが必要に応じて保存領域を用意します。

using System;

class Multiplier(int factor) {
    public int Apply(int n) => n * factor;
}

Console.WriteLine(new Multiplier(3).Apply(5)); // 15

キャプチャと初期化子だけでの使用

パラメーターをフィールドやプロパティの初期化子でのみ使用する場合、追加の保存領域は必要ありません。メソッドで使用すると、コンパイラがそのパラメーターを隠しフィールドにキャプチャします。

using System;

class A(int x) {
    public int Stored = x;     // initializer only
}
class B(int x) {
    public int Get() => x;     // captured into a field
}

Console.WriteLine(new A(7).Stored); // 7
Console.WriteLine(new B(9).Get());  // 9

パラメーターは変更可能

プライマリコンストラクターのパラメーターは通常のパラメーターと同じように動作します。読み取り専用として扱わない限り、インスタンス内で変更できます。変更すると、キャプチャされたフィールドも変わります。

using System;

class Toggle(bool on) {
    public void Flip() => on = !on;
    public bool State => on;
}

var t = new Toggle(false);
t.Flip();
Console.WriteLine(t.State); // True

読み取り専用プロパティとして公開する

よく使われるパターンは、get のみのプロパティを通してパラメーターを公開する方法です。これにより、パラメーターを内部に保持したまま、すっきりしたパブリックインターフェイスを提供できます。

using System;

class User(string email) {
    public string Email { get; } = email;
}

Console.WriteLine(new User("a@b.com").Email); // a@b.com

パラメーターから計算プロパティを作る

パラメーターは、式形式の計算プロパティに自然に利用できます。

using System;

class Money(decimal amount, string currency) {
    public string Display => amount.ToString("0.00") + " " + currency;
}

Console.WriteLine(new Money(9.5m, "USD").Display); // 9.50 USD

複数のメソッドでパラメーターを使う

同じキャプチャされたパラメーターを複数のメソッドで共有できます。これは、構築時に初期化されたプライベートフィールドのように機能します。

using System;

class Range2(int lo, int hi) {
    public bool Contains(int n) => n >= lo && n <= hi;
    public int Clamp(int n) => Math.Max(lo, Math.Min(hi, n));
}

var r = new Range2(0, 10);
Console.WriteLine(r.Contains(5)); // True
Console.WriteLine(r.Clamp(15));   // 10

参照型のキャプチャ

キャプチャされた参照型パラメーターを使うと、注入された依存関係を格納し、任意のメソッドから呼び出せます。

using System;
using System.Collections.Generic;

class Repo(List<string> store) {
    public void Add(string item) => store.Add(item);
    public int Count => store.Count;
}

var list = new List<string>();
var repo = new Repo(list);
repo.Add("x");
Console.WriteLine(repo.Count); // 1

意図しない二重格納を避ける

パラメーターをフィールドに代入し、かつメソッドでもそのパラメーターを使うと、値を二重に格納することになります。明確さを保つため、どちらか一方の方法を選んでください。

using System;

class Clean(int x) {
    // expose once via property, reference property in methods
    public int Value { get; } = x;
    public int Doubled() => Value * 2;
}

Console.WriteLine(new Clean(4).Doubled()); // 8

ラムダ式でのパラメーター

クラス内で定義したラムダ式からは、フィールドと同じようにパラメーターをキャプチャできます。

using System;
using System.Collections.Generic;
using System.Linq;

class Filter(int threshold) {
    public IEnumerable<int> KeepAbove(IEnumerable<int> xs) =>
        xs.Where(n => n > threshold);
}

var f = new Filter(3);
Console.WriteLine(string.Join(",", f.KeepAbove(new[]{1,2,3,4,5}))); // 4,5

スコープの有効期間

キャプチャされたパラメーターは、オブジェクトが存続する限り有効です。実質的にはインスタンスの状態なので、メソッド呼び出しのたびにリセットされると考えないでください。

using System;

class Accumulator(int seed) {
    private int total = seed;
    public int Add(int n) { total += n; return total; }
}

var a = new Accumulator(100);
Console.WriteLine(a.Add(1)); // 101
Console.WriteLine(a.Add(1)); // 102

まとめて実装する

このサービスは2つの依存関係をキャプチャし、複数のメソッドで使っています。実際の開発でよくある構成を示しています。

using System;

class PriceService(decimal taxRate, string currency) {
    public decimal WithTax(decimal net) => net * (1 + taxRate);
    public string Format(decimal v) => v.ToString("0.00") + " " + currency;
}

var s = new PriceService(0.2m, "EUR");
Console.WriteLine(s.Format(s.WithTax(100m))); // 120.00 EUR

簡単な確認

プライマリコンストラクターのパラメーターがどのように格納されるかを確認してください。

まとめ

プライマリコンストラクターのパラメーターをメンバーで使う方法を学びました。

  • メソッドで使うと、パラメーターは隠しフィールドにキャプチャされます。
  • 初期化子でのみ使う場合、追加の格納領域は必要ありません。
  • 読み取り専用プロパティとして公開すると、すっきりしたインターフェイスになります。
  • オブジェクトの有効期間中は、インスタンスの状態として振る舞います。

よくある質問

「メンバーでのパラメーターのキャプチャ」レッスンは無料ですか?

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

「メンバーでのパラメーターのキャプチャ」で何を学びますか?

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

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

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

「メンバーでのパラメーターのキャプチャ」レッスンにはどのくらい時間がかかりますか?

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

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

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

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

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