物語で学ぶオブジェクト指向 〜配列だけで恋愛パーティーをシミュレーション〜

ある日あなたは、友人から突然「10 名限定の恋愛パーティーを手伝ってほしい」と頼まれます。

  • 会場には 10 席しかない。
  • 参加者からは 名前 と 趣味 しか聞かない。
  • パーティー開始時に 名札を配って自己紹介 をしてもらう。

プログラマーのあなたは「せっかくだから C# でシミュレーションしてみよう」と思い立ちます。まだ List やコンストラクタは学び途中。でも 配列・for・if なら使えます。――さぁ、コードで会場を準備しましょう。


第0章 物語の作成

  • 恋愛パーティー題材であることが一目で分かるソリューション名OOPLovePartyArrayで作成しましょう

第 1 章 受付表という“受付リスト”を用意する

受付スタッフの陽子さんが、長机の上に 10 行分の受付リスト用意します。

string[] names   = new string[10];   // 受付リストの左列:名前
string[] hobbies = new string[10];   // 受付リストの右列:趣味

// 事前申し込み 2 名が到着
names[0] = "田中"; hobbies[0] = "登山";
names[1] = "佐藤"; hobbies[1] = "ゲーム";

ここでは 受付リスト=配列。10 行は定員そのもの。空欄はまだ来ていない席です。


第 2 章 何人来た? 〜カウント係・健太の作業〜

健太(カウント係)は受付リストを名前が書いてある行だけ数えます。

int count = 0;
for (int i = 0; i < names.Length; i++)
{
    if (names[i] != null) count++; // 名前が書かれた行だけ数える
}
Console.WriteLine($"受付完了:{count} 名\n");

ポイント: 配列は 10 行あっても、実際の参加者は書かれている行数だけ。


第 3 章 名札作成ブースとオブジェクト誕生の儀

会場奥にある“名札作成エリア”。ここで初めて Participant という記述する内容から名札が作られ、参加者の胸に貼られます。

Participant.cs

ポイントParticipant クラスはあくまで“設計図”であり、プログラム実行前にはメモリ上に実体は存在しません。Visual Studio の 「開始」▶ ボタンでコードが動き、new Participant() が呼ばれた瞬間に初めて「参加者インスタンス」が誕生します。クラス(設計図)とオブジェクト(実体)を明確に区別しましょう。

public class Participant
{
    public string Name;   // 名札
    public string Hobby;  // 趣味

    public void Introduce()
    {
        if (string.IsNullOrWhiteSpace(Hobby))
            Console.WriteLine($"こんにちは、{Name}です。趣味は特にありません。");
        else
            Console.WriteLine($"こんにちは、{Name}です。趣味は{Hobby}です。");
    }
}

控え室での作業手順

Participant[] members = new Participant[count];
int idx = 0;
for (int i = 0; i < names.Length; i++)
{
    if (names[i] == null) continue;  // 空席はスルー

    members[idx] = new Participant(); // 参加者を生成(new)
    members[idx].Name  = names[i];    // 名札に名前を書く
    members[idx].Hobby = hobbies[i];  // 名札に趣味を書く
    idx++;
}

ここが物語のクライマックスnew を呼んだ瞬間、参加者オブジェクトが生成されメモリ上に実体が誕生します。同時にプログラムはそのオブジェクトに名前と趣味を貼り付け、名札が完成 します。Visual Studio の 「開始」▶ ボタンでコードを走らせるまでは、参加者オブジェクトも名札もメモリ上に存在しません。


第 4 章 自己紹介を始めてもらいます

司会の玲奈さんがマイクを持って宣言します。

Console.WriteLine("パーティーを開始します。自己紹介どうぞ!\n");
foreach (var p in members)
{
    p.Introduce();
}

コンソールには次々と挨拶が流れ、会場が温まります。――ここで「これがオブジェクトがメソッドを動かす瞬間なんだ」と実感できるはずです。


第 5 章 デバッグでエラーを解決する

C# で最初につまずくのは例外メッセージ。本編のコードを題材に、3 大エラーをデバッグで解決する手順を体験します。

  1. NullReferenceException — ブレークポイントで members[idx] が null か確認し、生成条件を修正。
  2. IndexOutOfRangeException — ループ条件を i < names.Length に統一。
  3. 文字化け — Console.OutputEncoding = Encoding.UTF8; を Main() に追加。

値・フロー・メモリの 3 つを見れば 99% のバグは退治できます。


第 6 章 List 版に書き換えて可変人数に対応

var members = new List<Participant>();
for (int i = 0; i < names.Length; i++)
{
    if (names[i] == null) continue;
    members.Add(new Participant { Name = names[i], Hobby = hobbies[i] });
}
members.ForEach(p => p.Introduce());

Add 1 行で受付完了。Count も自動管理されます。


第 7 章 Dictionary で名前検索を高速化

var book = members.ToDictionary(p => p.Name);
if (book.TryGetValue("佐藤", out var satou))
{
    satou.Introduce();
}

キー検索は O(1)。名前から瞬時にオブジェクトを取得できます。


第 8 章 GUI への一歩 — WinForms で可視化

  1. TextBox(名前・趣味)を置く。
  2. [受付] ボタンで List に追加し、ListBox に表示。
  3. [開始] ボタンで各 Introduce() を MessageBox か ListBox に流す。

コンソール版と同じ Participant クラスを流用できるため、学んだロジックをそのまま GUI へ移植できます。


次のステップへ

デバッグ → List → Dictionary → GUI と進むことで、“動かす→不便→改善” の学習サイクルが身に付きました。次は コンストラクタ、LINQ、ファイル保存 へ挑戦し、あなた自身のアプリを改良してみてください。

訪問数 1 回, 今日の訪問数 3回