C#でアプリケーションを作るとき、避けて通れないのがクラスの理解です。
クラスはオブジェクト指向の中心となる仕組みで、設計がわかるとコードが整理され、保守も楽になります。
本記事ではC#のクラスの作り方を「定義」「メンバーの書き方」「使い方」の順に、初心者でも迷わないよう丁寧に解説していきます。
C#におけるクラスとは何か
クラスのイメージと役割

クラスを理解する最初の一歩は、クラスは設計図、オブジェクトはその設計図から作られた実体というイメージを持つことです。
クラスには次のような情報がまとまっています。
- データ(状態) … フィールドやプロパティ
- 振る舞い(処理) … メソッド
たとえば、人を表すクラスであれば、名前や年齢などの情報と、自己紹介する処理などを1つにまとめることができます。
クラスとオブジェクトの関係

C#では、クラスからオブジェクトを生成することをインスタンス化と呼びます。
たとえばPersonというクラスを1つ定義しておけば、new Person()のように何度でも実体を生成できます。
1つのクラスから複数のオブジェクトを作れることが、クラス利用の大きなメリットです。
クラス定義の基本構文
最小限のクラス定義
C#でクラスを定義する最もシンプルな形は次の通りです。
// Personという名前のクラスを定義
public class Person
{
// ここにフィールド、プロパティ、メソッドなどを定義していきます
}
このように、アクセス修飾子 + class + クラス名 + 波かっこ{ }が基本形です。
クラス名の付け方
クラス名は先頭を大文字にする(PascalCase)のがC#の一般的な命名規則です。
- OK …
Person、CustomerInfo、OrderService - NG …
person、customer_info
クラス名は、そのクラスが何を表しているのかが一目でわかる名前にすると、あとからコードを読むときに理解しやすくなります。
クラスの中に書ける主な要素
主なメンバーの一覧
クラスの中にはさまざまな要素を書けますが、最初に押さえておきたいのは次の4つです。
| 要素 | 役割 | 例 |
|---|---|---|
| フィールド | 生のデータ(変数)を保持する | private int age; |
| プロパティ | フィールドを安全に公開する窓口 | public int Age { get; set; } |
| メソッド | 処理や操作をまとめる | public void Greet() |
| コンストラクタ | 生成時の初期化処理を行う | public Person(string name) |
これらを組み合わせることで、「データ」と「処理」を1つのまとまりとして扱えるようになります。
フィールドとプロパティの違い
フィールドとプロパティは似ているようで役割が違います。
- フィールド … クラス内部で使うための生の変数
- プロパティ … 外部から値を参照・変更するためのインターフェース
最近のC#では、外部公開用には基本的にプロパティを使い、フィールドは内部用に限定する書き方が主流です。
実例で学ぶクラスの作り方
シンプルなクラス定義の例
まずは、名前と年齢を持ち、自己紹介するクラスを作ってみます。
using System;
// Personクラスの定義ファイル
public class Person
{
// フィールド(クラス内部で使う変数)
// privateなのでクラスの外からは直接触れません
private string name;
private int age;
// コンストラクタ
// new Person("太郎", 20) のように呼び出されたときに実行されます
public Person(string name, int age)
{
this.name = name; // this.name はフィールド、nameは引数
this.age = age;
}
// プロパティ
// NameとAgeを外部から読み書きできるようにする
public string Name
{
get { return name; }
set { name = value; }
}
public int Age
{
get { return age; }
set
{
// 年齢がマイナスにならないように簡単なチェックを入れる
if (value < 0)
{
age = 0;
}
else
{
age = value;
}
}
}
// メソッド(振る舞い)
// 自己紹介を表示する処理
public void Introduce()
{
Console.WriteLine($"私は{Name}、{Age}歳です。");
}
}
// 実行用のクラス(エントリポイント)
public class Program
{
public static void Main()
{
// Personクラスからオブジェクト(インスタンス)を生成
Person person = new Person("太郎", 20);
// プロパティにアクセスして値を変更
person.Age = 25;
// メソッドを呼び出して自己紹介
person.Introduce();
}
}
私は太郎、25歳です。
この例のポイントは、フィールドをprivateにして外部から直接触らせず、プロパティ経由で制御しているところです。
年齢を設定するときにif (value < 0)でチェックしているように、プロパティを使うことで不正な値を防ぐことができます。
プロパティを使ったシンプルな書き方
自動実装プロパティで簡潔に書く
上の例ではフィールドとプロパティを分けて書きましたが、単純な場合は自動実装プロパティを使うともっと簡潔に書けます。
using System;
public class Person
{
// 自動実装プロパティ
// C#が内部的にフィールドを用意してくれます
public string Name { get; set; }
public int Age { get; set; }
// パラメータ付きコンストラクタ
public Person(string name, int age)
{
Name = name;
Age = age;
}
public void Introduce()
{
Console.WriteLine($"私は{Name}、{Age}歳です。");
}
}
public class Program
{
public static void Main()
{
// オブジェクト初期化子を使った書き方の例
Person person1 = new Person("花子", 22);
// 後からプロパティを書き換える
person1.Age = 23;
person1.Introduce();
}
}
私は花子、23歳です。
特に制御のいらない値なら、自動実装プロパティで十分です。
バリデーションが必要になったら、後から通常のプロパティ構文に書き換えることもできます。
アクセス修飾子とクラスの公開範囲
public / private の基本
クラスやそのメンバーにはアクセス修飾子を付けて、どこからアクセスできるかを制御します。
最初は次の2つを押さえておけば十分です。
| 修飾子 | 意味 | 主な用途 |
|---|---|---|
| public | どこからでもアクセス可能 | 外部に公開したいクラスやメンバー |
| private | 同じクラスの内部からのみアクセス可能 | 内部実装を隠したいとき |
クラスの設計では「外から触らせる必要のないものは基本的にprivateにする」ことが重要です。
これをカプセル化と呼びます。
アクセス修飾子付きの例
public class BankAccount
{
// 口座残高は外部から直接変更させたくないのでprivate
private int balance;
// コンストラクタ
public BankAccount(int initialBalance)
{
balance = initialBalance;
}
// 残高を取得するためのpublicメソッド
public int GetBalance()
{
return balance;
}
// 入金メソッド
public void Deposit(int amount)
{
if (amount > 0)
{
balance += amount;
}
}
// 出金メソッド
public void Withdraw(int amount)
{
if (amount > 0 && amount <= balance)
{
balance -= amount;
}
}
}
public class Program
{
public static void Main()
{
BankAccount account = new BankAccount(1000);
account.Deposit(500);
account.Withdraw(300);
// 残高を確認
int current = account.GetBalance();
Console.WriteLine($"現在の残高: {current}円");
}
}
現在の残高: 1200円
balanceフィールドをprivateにして、操作方法だけをpublicメソッドで提供している点が、クラス設計の重要な考え方です。
クラスの使い方(インスタンス化とメンバー呼び出し)
newキーワードでインスタンスを作る
クラスを定義しただけでは使えないので、newキーワードを使ってインスタンス(オブジェクト)を生成します。
// Personクラスのインスタンスを生成
Person p = new Person("次郎", 18);
// メンバーへのアクセス
p.Introduce(); // メソッド呼び出し
p.Age = 19; // プロパティへの代入
クラスは「型」、インスタンスは「その型の値」と考えると理解しやすくなります。
複数インスタンスを扱う例

using System;
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
public Person(string name, int age)
{
Name = name;
Age = age;
}
public void Introduce()
{
Console.WriteLine($"私は{Name}、{Age}歳です。");
}
}
public class Program
{
public static void Main()
{
// 3人分のPersonインスタンスを作成
Person person1 = new Person("太郎", 20);
Person person2 = new Person("花子", 22);
Person person3 = new Person("次郎", 18);
// それぞれのメソッドを呼び出す
person1.Introduce();
person2.Introduce();
person3.Introduce();
}
}
私は太郎、20歳です。
私は花子、22歳です。
私は次郎、18歳です。
同じクラスから複数のインスタンスを作れるので、似たようなデータと処理を繰り返し扱う場面でクラスが威力を発揮します。
クラスを使うと何がうれしいか
コードの見通しが良くなる
クラスを使ってデータと処理をまとめると、プログラム全体の構造がはっきりします。
たとえば、Personに関する処理はPersonクラスの中に集約されるため、「どこを見れば何がわかるか」が明確になります。
再利用性が高まる
一度よく設計されたクラスを作っておけば、別のプロジェクトでも同じクラスを使い回すことができます。
同じような処理を何度も書かずに済むため、開発効率が上がり、バグも減らせます。
拡張や変更に強い設計になる
振る舞いをクラスの中に閉じ込めておくことで、仕様変更があっても影響範囲をクラス内部に限定しやすくなります。
たとえば、年齢の扱い方を変えたい場合、Personクラス内部のコードだけ修正すれば済むように設計できます。
まとめ
クラスはC#の基礎でありながら、アプリケーション全体の設計に直結する非常に重要な要素です。
本記事ではクラスの基本構文、フィールド・プロパティ・メソッド・コンストラクタなどの主要メンバー、インスタンス化とメンバー呼び出しの流れを、具体的なコード例を通して解説しました。
最初はシンプルなクラスから始めて、徐々にプロパティやアクセス修飾子を使いこなしていくことで、自然とオブジェクト指向的な書き方に慣れていけます。
ぜひ自分のプロジェクトで実際にクラスを定義し、手を動かしながら理解を深めてみてください。
