メンバーでのパラメーターのキャプチャ
型全体でプライマリコンストラクターのパラメーターを使います。
「メンバーでのパラメーターのキャプチャ」は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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- クラスのプライマリコンストラクター
- メンバーでのパラメーターのキャプチャ
- 構造体のプライマリコンストラクター
- プロパティと基底型との組み合わせ