オブジェクトとコレクションの初期化子
作成時にプロパティを簡潔に設定します。
「オブジェクトとコレクションの初期化子」はCoddyKit上の無料C# Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC# Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C# Academyコースには全4レッスンが含まれています。
オブジェクト初期化子とは
オブジェクト初期化子は、new の直後に { } の中でパブリックプロパティまたはフィールドを設定する仕組みです。組み合わせごとにコンストラクターを書く必要はありません。
using System;
class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
class Program
{
static void Main()
{
var p = new Person { Name = "Ada", Age = 36 };
Console.WriteLine(p.Name + ", " + p.Age);
}
}初期化子の構文
波かっこの中に、プロパティへの代入をコンマで区切って記述します。代入はコンストラクターの完了後に実行されます。
using System;
class Car
{
public string Make { get; set; }
public string Model { get; set; }
public int Year { get; set; }
}
class Program
{
static void Main()
{
var car = new Car
{
Make = "Toyota",
Model = "Corolla",
Year = 2022
};
Console.WriteLine(car.Year + " " + car.Make + " " + car.Model);
}
}コンストラクターと初期化子の組み合わせ
コンストラクターを呼び出すと同時に、初期化子も使用できます。先にコンストラクターが実行され、その後で初期化子に記述したプロパティが設定されます。
using System;
class Widget
{
public string Id { get; }
public string Label { get; set; }
public Widget(string id) { Id = id; }
}
class Program
{
static void Main()
{
var w = new Widget("w1") { Label = "Submit" };
Console.WriteLine(w.Id + ": " + w.Label);
}
}一部のプロパティだけを初期化する
必要なプロパティだけを記述し、それ以外は既定値のままにできます。これにより、初期化子を柔軟に使えます。
using System;
class Settings
{
public bool DarkMode { get; set; } = false;
public int Volume { get; set; } = 50;
public string Lang { get; set; } = "en";
}
class Program
{
static void Main()
{
var s = new Settings { DarkMode = true };
Console.WriteLine(s.DarkMode + ", " + s.Volume + ", " + s.Lang);
}
}コレクション初期化子
コレクション初期化子は、コンマで区切った要素を { } に記述し、リスト、セット、配列を作成時に初期化します。
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
var nums = new List<int> { 1, 2, 3, 4, 5 };
Console.WriteLine("Count: " + nums.Count);
Console.WriteLine("Sum: " + Sum(nums));
}
static int Sum(List<int> list)
{
int t = 0;
foreach (var n in list) t += n;
return t;
}
}コレクション初期化子の仕組み
コンパイラーは各要素を Add(...) の呼び出しに変換します。Add メソッドと IEnumerable を持つ型であれば、この構文を使用できます。
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
var names = new List<string> { "Ann", "Bob", "Cara" };
foreach (var n in names)
Console.WriteLine(n);
}
}ディクショナリ初期化子
ディクショナリは、波かっこの中にキーと値のペアを記述して初期化できます。検索テーブルにとても便利です。
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
var ages = new Dictionary<string, int>
{
["Ann"] = 30,
["Bob"] = 25
};
Console.WriteLine("Ann is " + ages["Ann"]);
}
}入れ子になったオブジェクト初期化子
オブジェクト初期化子では、入れ子になったオブジェクトも初期化でき、1つの式で小さなオブジェクトグラフを構築できます。
using System;
class Address
{
public string City { get; set; }
}
class Customer
{
public string Name { get; set; }
public Address Home { get; set; } = new Address();
}
class Program
{
static void Main()
{
var c = new Customer
{
Name = "Lin",
Home = new Address { City = "Tokyo" }
};
Console.WriteLine(c.Name + " in " + c.Home.City);
}
}オブジェクトのコレクション
2つの機能を組み合わせると、要素自体をオブジェクト初期化子で構築したリストを初期化できます。
using System;
using System.Collections.Generic;
class Item
{
public string Name { get; set; }
public decimal Price { get; set; }
}
class Program
{
static void Main()
{
var cart = new List<Item>
{
new Item { Name = "Pen", Price = 1.5m },
new Item { Name = "Book", Price = 9.0m }
};
decimal total = 0;
foreach (var i in cart) total += i.Price;
Console.WriteLine("Total: " + total);
}
}初期化子と init プロパティ
init 専用プロパティを設定するには、オブジェクト初期化子を使用します。これらのプロパティは初期化時にしか代入できないためです。
using System;
class Config
{
public string Env { get; init; }
public int Retries { get; init; }
}
class Program
{
static void Main()
{
var c = new Config { Env = "prod", Retries = 3 };
Console.WriteLine(c.Env + " / " + c.Retries);
}
}まとめてみましょう
初期化子を使うと、オブジェクトの構築を宣言的で読みやすく記述できます。特に構成用オブジェクトやテストデータで役立ちます。
using System;
using System.Collections.Generic;
class Team
{
public string Name { get; set; }
public List<string> Members { get; set; } = new List<string>();
}
class Program
{
static void Main()
{
var t = new Team
{
Name = "Alpha",
Members = { "Ann", "Bob", "Cara" }
};
Console.WriteLine(t.Name + " has " + t.Members.Count + " members");
}
}理解度チェック
初期化子についての理解度を確認しましょう。
まとめ
オブジェクト初期化子は、new の後に { } の中でパブリックメンバーを設定し、コンストラクターの後に実行されます。コレクション初期化子は暗黙的な Add 呼び出しによって要素を追加し、ディクショナリはキーと値のペアに対応します。どちらも入れ子にでき、init プロパティと組み合わせられるため、オブジェクトの構築を簡潔かつ宣言的に記述できます。
using System;
using System.Collections.Generic;
class Demo
{
public string Name { get; set; }
public List<int> Nums { get; set; } = new List<int>();
}
class Program
{
static void Main()
{
var d = new Demo { Name = "x", Nums = { 1, 2, 3 } };
Console.WriteLine(d.Name + " " + d.Nums.Count);
}
}よくある質問
「オブジェクトとコレクションの初期化子」レッスンは無料ですか?
はい。「オブジェクトとコレクションの初期化子」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- コンストラクターの定義
- thisによるコンストラクターの連鎖
- オブジェクトとコレクションの初期化子
- 静的コンストラクター