0Pricing
C# Academy · レッスン

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); // 5

init と 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); // 2

init による検証

バッキングフィールドを使って明示的な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 / Oslo

init と継承

派生クラスでは、オブジェクト初期化子を使って基底クラスの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フィードバックを取得できます。ローカル設定は不要です。

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

  1. init専用setter
  2. required修飾子
  3. 不変オブジェクトのパターン
  4. レコードのwith式
← C# Academyに戻る