“写経”から卒業! ライブで学ぶ C# オブジェクト指向コーディング術

2025年7月17日

教科書を使った学習では、つい「写経」や「丸暗記」に偏りがちです。

もちろん、コードを書き写すこと自体は決して悪いわけではありません。

しかし「著者は一度もミスをせず、上から順に完璧なコードを書いている」と思い込むと、かえってスキル向上の妨げになります。

実際のコーディング風景を見れば、

「プロでも最初から完璧に書けるわけではない」

「自分も間違えながら作って良い」

と気づき、学習へのハードルが下がります。これはとても大切な感覚です。


効率よくコーディングするには

サンプルコードを入力するときは、コードブロックを意識して、なるべくエラー(赤い波線)が出ないように進めることを心がけます

インテリセンス(自動補完)を最大限に活用しよう

  • ミスを減らすだけでなく、学習効率を飛躍的に高めるツールです。
  • 自分がどれくらいインテリセンスに頼れているか、一度振り返ってみてください。

図でコードを可視化する

  • クラス図やシーケンス図で動作イメージをつかむと、理解が深まります。
  • かつては手作業が主流でしたが、現在は AI による自動生成も利用できます。時間を有効活用しましょう。

コーディング手順に「唯一の正解」はない

今回のサンプルでは、インテリセンスを使ってクラスを生成しましたが、

  • 先にクラスを手書きしても構いません。
  • 方法は人それぞれであり、状況によって最適解も変わります。

「これしか正解がない」と思い込むと、他のサンプルコードを見たときに混乱し、

「何が正解か分からない」「プログラミングは難しい」と感じてしまいがちです。

正解は一つではありません。
多様な考え方や手順を許容することで、学習はより柔軟で前向きなものになります。

目的

  • クラスとインスタンスの基本を理解する
  • プロパティとメソッドで「オブジェクトの動き」を体験する
  • UMLで構造と流れを可視化する
  • 拡張性を意識して「作りっぱなし」にしない

企画

Playerが1人、敵(Enemy)が1匹でPlayerが敵に攻撃を仕掛けます
敵の名前は「スライム」です
Playerが敵を攻撃すると「スライムに攻撃した」とコンソール画面に表示します

ライブ

コンソールアプリでオブジェクト指向プログラミングのライブをしてみます
未編集です
なので、間違えたり、それを修正したりしています
教科書は最終的に完成したものを掲載していますが、実際はタイプミスやスペルミスがあるものです

新規でソリューションを作成します

今回はトップレベルステートメントを使います

トップレベルステートメントが正式に導入されたのは C# 9.0(.NET 5 と同時リリース、2020 年 11 月)。それ以前のバージョンでは利用できません

トップレベルステートメントは、C# 9.0(2020 年、.NET 5 と同時)から使える新しい書き方です。

従来は必ず

class Program
{
    static void Main(string[] args)
    {
        // ここに処理
    }
}

という形が必要でしたが、トップレベルステートメントではファイル先頭にコードをそのまま書くだけで OK です。

// Program.cs
Console.WriteLine("Hello, World!");

コンパイラが裏で自動的に Main メソッドと Program クラスを補完してくれるため、スクリプト感覚で短いサンプルや学習用のコードを素早く書ける――これが最大の利点です。

ソリューション名は、OopLiveCodingDemoとしておきましょう

  1. Oop – 記事の主題「オブジェクト指向」を即座に連想できる
  2. LiveCoding – “実演(ライブでのコーディング)” という本稿の学習スタイルを明示
  3. Demo – 練習用・サンプル用であることを示し、本番プロジェクトと区別できる

名付けのガイドライン(Visual Studio 向け)

ポイント説明
PascalCaseアルファベットの先頭を大文字に。- や空白は使わない
目的が伝わる将来一覧で見たときに内容を思い出せるキーワードを入れる
汎用語は避けるTest, Sample だけでは曖昧。具体語を 1 つ加える
長すぎない25 文字以内を目安(パスが長くなるとビルド時に不利)

初期テンプレート画面で次のコードが出てきますが、削除して構いません

// See https://aka.ms/new-console-template for more information
Console.WriteLine("Hello, World!");

ライブコーディング(クラスを後ほど作成する手順バージョン)

ライブコーディング(クラスを先に作成する手順バージョン)

出来上がったコード

Player player = new Player();
Enemy enemy = new Enemy();
enemy.Name = "スライム";

player.Atack(enemy);

internal class Enemy
{
    public Enemy()
    {
    }

    public string Name { get; internal set; }
}

internal class Player
{
    internal void Atack(Enemy enemy)
    {
        Console.WriteLine($"{enemy.Name}に攻撃した");
    }
}

整理すると・・・・

Player player = new Player();
Enemy enemy = new Enemy();
enemy.Name = "スライム";

player.Attack(enemy);
internal class Enemy
{
    public string Name { get; set; }
}

internal class Player
{
    internal void Attack(Enemy enemy)
    {
        Console.WriteLine($"{enemy.Name}に攻撃した");
    }
}

Mainメソッド版への変更もできます!!

インテリセンスで自動的に変更してもらうこともできます

参考のために従来のMainメソッド版を掲載しておきます
これでも同じようにインテリセンスを活用できます

using System;

namespace SampleOop
{
    /// <summary>
    /// エントリーポイント。ここからプログラムが始まる
    /// </summary>
    public class Program
    {
        public static void Main(string[] args)
        {
            // プレイヤーと敵を生成
            var player = new Player("勇者");
            var enemy  = new Enemy("スライム");

            // プレイヤーが敵を攻撃
            player.Attack(enemy);
        }
    }

    /// <summary>
    /// 敵キャラクターを表すクラス
    /// </summary>
    public class Enemy
    {
        // 名前は読み書きできるプロパティ
        public string Name { get; }

        // コンストラクタで名前を一度に設定
        public Enemy(string name)
        {
            Name = name;
        }
    }

    /// <summary>
    /// プレイヤーキャラクターを表すクラス
    /// </summary>
    public class Player
    {
        public string Name { get; }

        public Player(string name)
        {
            Name = name;
        }

        /// <summary>
        /// 敵を攻撃する
        /// </summary>
        public void Attack(Enemy target)
        {
            Console.WriteLine($"{Name} は {target.Name} を攻撃した!");
        }
    }
}

UML図のAI自動生成

PlantUML図サンプル

Regenerateの度に違ったものができますので、各自判断しましょう

クラス図

シーケンス図

PlantUML作成ページ

リファクタリングしてもらった

リファクタリングの指示をすることもできます
ただし、必ずしも正しいとは限りませんので、自分の実力をアップさせて、判断するスキルをつける必要があります

おまけ

C#のオブジェクト指向?

ねえ、オブジェクト指向って、プログラムをする時に、物事を考える方法の一つなんだよ。これを考えると、プログラムを書くのが簡単になることがあるんだよ。

  1. オブジェクト(物):まず、何か物事を考えてみよう。例えば、動物や果物があるよね。それぞれの動物や果物は、特有の性質や行動を持っているでしょ?犬は吠えるし、リンゴは赤いことが多いよね。この物事をプログラムの中で表現するのがオブジェクトなんだ。
  2. クラス(種類):オブジェクトがたくさんあると思うけど、似たような性質や行動を持つオブジェクトはグループに分けられるよ。例えば、犬のオブジェクトと猫のオブジェクトは、どちらも動物クラスに属するよ。クラスは、同じ種類のオブジェクトを作るための設計図みたいなものだよ。
  3. メソッド(動作):オブジェクトができることも考えてみよう。例えば、犬は吠えることができるし、猫は鳴くことができるよね。これらの動作をメソッドと呼ぶんだ。メソッドは、オブジェクトが何かをする方法を教えてくれるんだ。
  4. プロパティ(性質):オブジェクトが持つ性質も大切だよ。例えば、犬は色が茶色か黒か白か、猫は毛の長さが長いか短いか、という性質があるでしょ?これをプロパティと呼ぶんだ。プロパティはオブジェクトの特徴を表すんだ。

だから、C#のオブジェクト指向は、プログラムを作るときに、物事をオブジェクトとして考え、それらをクラスにまとめて、メソッドで動作を定義し、プロパティで性質を表現する方法なんだよ。これによって、プログラムが整理されて、理解しやすくなるんだ。楽しいプログラム作りを始めてみてね!

new キーワード?

ねえ、"new"っていうのは、新しいものを作る魔法の言葉みたいなものなんだよ。例えば、おもちゃがあると思ってみて。それを使いたい時、新しいおもちゃを作ることができるんだ。これをプログラムの中でやるときに、"new"って言葉を使うんだ。

たとえば、おもちゃの名前を指定して、新しいおもちゃを作るときは、こんな感じだよ:

Toy myToy = new Toy("ロボット");

これで、"ロボット"っていう名前の新しいおもちゃができるんだ。"new"は、新しいものを作るための特別な命令って思ってね。

だから、"new"はプログラムの中で新しいものを作るための魔法の言葉みたいなもので、何か新しいものが必要なときに使うんだよ。

訪問数 35 回, 今日の訪問数 25回