init専用setter
初期化時にのみ設定できるプロパティを作成します。
「init専用setter」はCoddyKit上の無料C# Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC# Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C# Academyコースには全4レッスンが含まれています。
init 専用セッター
initアクセサーを使うと、オブジェクトの構築時(オブジェクト初期化子を含む)にプロパティを設定できますが、その後は読み取り専用になります。形式は{ get; init; }です。
using System;
class Point {
public int X { get; init; }
public int Y { get; init; }
}
var p = new Point { X = 3, Y = 4 };
Console.WriteLine(p.X + "," + p.Y); // 3,4初期化時だけ設定する
オブジェクトの構築後にinitプロパティへ代入するとコンパイルエラーになるため、構築後の不変性が保証されます。
using System;
class Config {
public string Name { get; init; }
}
var c = new Config { Name = "prod" };
// c.Name = "dev"; // compile error
Console.WriteLine(c.Name); // prodオブジェクト初期化子も使用できる
読み取り専用の get 専用プロパティに対する大きな利点は、initがオブジェクト初期化子構文をサポートすることです。そのため、プロパティごとにコンストラクターを用意する必要がありません。
using System;
class Settings {
public bool DarkMode { get; init; }
public int FontSize { get; init; }
}
var s = new Settings { DarkMode = true, FontSize = 14 };
Console.WriteLine(s.DarkMode + " " + s.FontSize); // True 14コンストラクターとの組み合わせ
initプロパティをコンストラクターから設定し、さらに初期化子で上書きできるようにすることもできます。
using System;
class User {
public string Role { get; init; } = "guest";
public User() { }
}
var u = new User { Role = "admin" };
Console.WriteLine(u.Role); // admin既定値
initプロパティには既定の初期化子を設定できます。構築時に上書きされない限り、その値が適用されます。
using System;
class Options {
public int Retries { get; init; } = 3;
}
Console.WriteLine(new Options().Retries); // 3
Console.WriteLine(new Options { Retries = 5 }.Retries); // 5init と set の違い
setアクセサーではいつでも値を変更できますが、initでは構築時に限って代入できます。作成後に変更しないデータにはinitを選んでください。
using System;
class Mutable { public int V { get; set; } }
class Frozen { public int V { get; init; } }
var m = new Mutable { V = 1 };
m.V = 2; // allowed
Console.WriteLine(m.V); // 2init による検証
バッキングフィールドを使って明示的なinit本体を実装し、代入された値を検証できます。
using System;
class Percentage {
private int _value;
public int Value {
get => _value;
init => _value = (value < 0 || value > 100)
? throw new ArgumentOutOfRangeException()
: value;
}
}
Console.WriteLine(new Percentage { Value = 80 }.Value); // 80レコードでの init
位置指定レコードのプロパティは既定でinit専用です。そのため、レコードは不変でありながらwithによるコピーをサポートします。
using System;
record Account(string Id, decimal Balance);
var a = new Account("A1", 100m);
Console.WriteLine(a.Balance); // 100入れ子になったオブジェクト初期化子
initは入れ子になったオブジェクト初期化子でも使えるため、複雑な不変オブジェクトのグラフを1つの式で構築できます。
using System;
class Address { public string City { get; init; } }
class Person { public string Name { get; init; } public Address Home { get; init; } }
var p = new Person { Name = "Lin", Home = new Address { City = "Oslo" } };
Console.WriteLine(p.Name + " / " + p.Home.City); // Lin / Osloinit と継承
派生クラスでは、オブジェクト初期化子を使って基底クラスのinitプロパティを設定できます。構築フェーズはオブジェクト全体に及ぶためです。
using System;
class Base { public int Id { get; init; } }
class Item : Base { public string Name { get; init; } }
var i = new Item { Id = 1, Name = "Pen" };
Console.WriteLine(i.Id + " " + i.Name); // 1 Penまとめて実装する
initプロパティとオブジェクト初期化子だけで構築した不変 DTO です。
using System;
class OrderDto {
public int Id { get; init; }
public string Customer { get; init; }
public decimal Amount { get; init; }
}
var o = new OrderDto { Id = 7, Customer = "Ada", Amount = 49.9m };
Console.WriteLine(o.Id + " " + o.Customer + " " + o.Amount); // 7 Ada 49.9簡単な確認
init 専用セッターについて理解できているか確認してください。
まとめ
init 専用セッターについて学びました。
{ get; init; }では、構築時に限って代入できます。- オブジェクト初期化子は
initプロパティと組み合わせて使えます。 - 明示的な
init本体を使って検証を追加できます。 - レコードの位置指定プロパティは、既定で
init専用です。
よくある質問
「init専用setter」レッスンは無料ですか?
はい。「init専用setter」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C# Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C# Academyコースには全4レッスンが含まれています。
「init専用setter」で何を学びますか?
初期化時にのみ設定できるプロパティを作成します。 ブラウザで直接実行するハンズオンコードでC# Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
C# Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのC# Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「init専用setter」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このC# Academyレッスンでコードを書いて実行できますか?
はい。すべてのC# Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- init専用setter
- required修飾子
- 不変オブジェクトのパターン
- レコードのwith式