C#のクラスとは?初心者向けに書き方・使い方・インスタンス化までわかりやすく解説

はじめに

C#を学び始めると、早い段階で「クラス」という言葉が出てきます。

しかし、初心者にとっては「クラスとは何か」「インスタンスとは何が違うのか」「newはなぜ必要なのか」がわかりにくいポイントです。

C#のクラスは、データと処理をひとまとまりにして扱うための重要な仕組みです。クラスを理解すると、プログラムを整理しやすくなり、同じような処理を何度も書かずに済むようになります。

この記事では、C#のクラスについて、初心者向けに書き方・使い方・インスタンス化・コンストラクタ・プロパティ・メソッドまで順番に解説します。

1. C#のクラスとは?初心者向けに意味をわかりやすく解説

C#のクラスとは、データや処理をまとめるための仕組みです。

C#はオブジェクト指向プログラミングを中心に設計されている言語であり、クラスはその基本となる考え方です。

たとえば、「人」をプログラムで表したい場合、名前、年齢、あいさつする処理などをまとめて管理したくなります。

そのようなときに使うのがクラスです。

C#
class Person
{
public string Name { get; set; }
public int Age { get; set; }

public void SayHello()
{
Console.WriteLine("こんにちは");
}
}

このように、クラスの中には「データ」と「処理」をまとめて書くことができます。

1-1. クラスは「オブジェクトの設計図」

C#のクラスは、よく「オブジェクトの設計図」と説明されます。

たとえば、家を建てるときには設計図があります。設計図そのものに住むことはできませんが、設計図をもとに実際の家を作ることができます。

C#のクラスも同じです。

C#
class Car
{
public string Color { get; set; }

public void Drive()
{
Console.WriteLine("車が走ります");
}
}

このCarクラスは、車を作るための設計図です。実際に使うには、このクラスをもとにオブジェクトを作成します。

C#
Car car = new Car();
car.Color = "赤";
car.Drive();

このように、クラスから作られた実体を「インスタンス」または「オブジェクト」と呼びます。

1-2. クラスを使うと何が便利になるのか

クラスを使うと、関連するデータと処理をひとまとまりにできます。

たとえば、名前と年齢を別々の変数で管理すると、人数が増えるほどコードが複雑になります。

C#
string name1 = "田中";
int age1 = 20;

string name2 = "佐藤";
int age2 = 25;

人数が増えるたびに変数を増やす必要があり、管理が大変です。

クラスを使えば、次のように整理できます。

C#
Person person1 = new Person();
person1.Name = "田中";
person1.Age = 20;

Person person2 = new Person();
person2.Name = "佐藤";
person2.Age = 25;

さらに、Personに関連する処理もクラスの中にまとめられます。

C#
person1.SayHello();
person2.SayHello();

クラスを使うことで、コードの見通しがよくなり、修正や再利用もしやすくなります。

1-3. C#でクラスが重要な理由

C#では、多くのプログラムがクラスを中心に作られます。

コンソールアプリ、Windowsアプリ、Webアプリ、ゲーム開発など、さまざまな場面でクラスが使われます。

たとえば、C#では次のようなものもクラスとして表現できます。

人を表すPersonクラス、商品を表すProductクラス、注文を表すOrderクラス、キャラクターを表すPlayerクラス、計算処理をまとめるCalculatorクラスなどです。

クラスを理解すると、C#のコード全体の構造が見えやすくなります。逆に、クラスがよくわからないままだと、プロパティ、メソッド、コンストラクタ、継承、staticなどの理解も難しくなります。

そのため、C#を学ぶうえでクラスの理解はとても重要です。

1-4. クラス・オブジェクト・インスタンスの違い

初心者が混乱しやすいのが、クラス、オブジェクト、インスタンスの違いです。

クラスは設計図です。オブジェクトやインスタンスは、その設計図から作られた実体です。

たとえば、Personクラスがあるとします。

C#
class Person
{
public string Name { get; set; }
}

この時点では、まだ具体的な人は存在していません。これはあくまで「人を作るための設計図」です。

実際に使うには、次のようにnewを使います。

C#
Person person = new Person();
person.Name = "田中";

このpersonがインスタンスです。

厳密には「オブジェクト」と「インスタンス」は使い分けられることもありますが、初心者の段階では「クラスから作られた実体」と理解しておけば問題ありません。

2. C#のクラスの基本構造

C#のクラスは、基本的にclassキーワードを使って定義します。

C#
class クラス名
{
// フィールド
// プロパティ
// メソッド
}

クラスの中には、データを表すフィールドやプロパティ、処理を表すメソッドを書きます。

2-1. classキーワードの役割

classキーワードは、「これからクラスを定義します」という意味を持ちます。

C#
class Person
{
}

このコードでは、Personという名前のクラスを定義しています。

クラス名の後ろには波かっこ{ }を書き、その中にクラスの内容を記述します。

何も書かれていないクラスでも、クラスとしては成立します。

C#
class EmptyClass
{
}

ただし、実際の開発では、クラスの中にプロパティやメソッドなどを定義して使うことが一般的です。

2-2. クラス名の付け方と命名規則

C#のクラス名は、一般的にパスカルケースで書きます。

パスカルケースとは、単語の先頭を大文字にする書き方です。

C#
class Person
{
}

class ProductItem
{
}

class OrderManager
{
}

personproductItemのように小文字から始める書き方は、変数名やフィールド名で使われることが多いです。

クラス名は、そのクラスが何を表しているのかがわかる名前にすることが大切です。

悪い例は次のような名前です。

C#
class Data
{
}

class Manager
{
}

class A
{
}

これだけでは、何を表すクラスなのかがわかりません。

良い例は次のような名前です。

C#
class Customer
{
}

class Order
{
}

class ProductService
{
}

クラス名を見ただけで役割がわかるようにすると、コードが読みやすくなります。

2-3. フィールド・プロパティ・メソッドとは

クラスの中には、主にフィールド、プロパティ、メソッドを書きます。

フィールドは、クラスが持つデータを保存する変数です。

C#
private string name;

プロパティは、外部からデータを読み書きするための入口です。

C#
public string Name { get; set; }

メソッドは、クラスが持つ処理です。

C#
public void SayHello()
{
Console.WriteLine("こんにちは");
}

たとえば、Personクラスなら、名前や年齢はデータなのでプロパティ、あいさつする動作はメソッドとして表現できます。

C#
class Person
{
public string Name { get; set; }
public int Age { get; set; }

public void SayHello()
{
Console.WriteLine($"{Name}です。よろしくお願いします。");
}
}

2-4. アクセス修飾子(public / private)の基本

アクセス修飾子とは、クラスやメンバーにどこからアクセスできるかを指定するものです。

初心者がまず覚えるべきアクセス修飾子は、publicprivateです。

publicは、クラスの外からアクセスできます。

C#
public string Name { get; set; }

privateは、クラスの中からしかアクセスできません。

C#
private int age;

たとえば、次のようにprivateフィールドを定義すると、クラスの外から直接変更できません。

C#
class Person
{
private int age;

public void SetAge(int value)
{
if (value >= 0)
{
age = value;
}
}
}

このように、privateを使うと不正な値が入るのを防ぎやすくなります。

2-5. namespaceとの関係

namespaceは、クラスを整理するための入れ物です。

C#
namespace MyApp
{
class Person
{
}
}

大きなプログラムでは、たくさんのクラスを作ります。そのとき、すべてのクラスが同じ場所にあると管理しにくくなります。

そこで、namespaceを使ってクラスを分類します。

C#
namespace MyApp.Models
{
class Person
{
}
}

namespace MyApp.Services
{
class PersonService
{
}
}

namespaceはフォルダのようなものだと考えるとわかりやすいです。

なお、最近のC#では次のようにファイルスコープnamespaceを書くこともできます。

C#
namespace MyApp.Models;

class Person
{
}

3. C#でクラスを作成する書き方

ここからは、実際にC#でクラスを作成する書き方を見ていきます。

クラスの基本は、classキーワード、クラス名、波かっこの3つです。

3-1. 最小構成のクラスを作る

最小構成のクラスは次のように書きます。

C#
class Person
{
}

これだけでもPersonというクラスは作成されています。

ただし、このままではデータも処理も持っていないため、実用的ではありません。

次に、フィールドやプロパティ、メソッドを追加していきます。

3-2. フィールドを定義する

フィールドは、クラスの中で使う変数です。

C#
class Person
{
private string name;
private int age;
}

この例では、nameageというフィールドを定義しています。

privateを付けているため、これらのフィールドはPersonクラスの中からしか直接アクセスできません。

フィールドは、クラスの内部状態を保持するために使います。ただし、外部から値を読み書きしたい場合は、直接フィールドを公開するのではなく、プロパティを使うのが一般的です。

3-3. プロパティを定義する

プロパティは、クラスの外から値を取得したり設定したりするための仕組みです。

C#
class Person
{
public string Name { get; set; }
public int Age { get; set; }
}

このような書き方を自動実装プロパティと呼びます。

getは値を取得するための処理、setは値を設定するための処理です。

C#
Person person = new Person();
person.Name = "田中";
person.Age = 20;

Console.WriteLine(person.Name);
Console.WriteLine(person.Age);

プロパティを使うことで、クラスの外から安全にデータを扱いやすくなります。

3-4. メソッドを定義する

メソッドは、クラスに処理を持たせるために使います。

C#
class Person
{
public string Name { get; set; }

public void SayHello()
{
Console.WriteLine($"こんにちは、{Name}です。");
}
}

この例では、SayHelloというメソッドを定義しています。

voidは戻り値がないことを表します。メソッドを呼び出すと、コンソールにメッセージが表示されます。

C#
Person person = new Person();
person.Name = "田中";
person.SayHello();

実行結果は次のようになります。

こんにちは、田中です。

3-5. サンプルコードでクラスの形を確認する

ここまでの内容をまとめると、C#のクラスは次のような形になります。

C#
class Person
{
private int age;

public string Name { get; set; }

public int Age
{
get { return age; }
set
{
if (value >= 0)
{
age = value;
}
}
}

public void SayHello()
{
Console.WriteLine($"こんにちは、{Name}です。{Age}歳です。");
}
}

このクラスには、次の要素があります。

ageはprivateフィールドです。Nameは自動実装プロパティです。Ageは値のチェックを行うプロパティです。SayHelloはメソッドです。

このように、クラスはデータと処理をまとめるために使います。

4. C#のクラスを使う方法

クラスは定義しただけでは、まだ実際には使われていません。

クラスを使うには、基本的にインスタンス化が必要です。

4-1. クラスは作っただけでは使えない

次のようにクラスを定義しただけでは、まだ具体的なデータは存在しません。

C#
class Person
{
public string Name { get; set; }
}

これはあくまで設計図です。

実際にNameに値を入れたり、メソッドを呼び出したりするには、クラスからインスタンスを作る必要があります。

4-2. newキーワードでインスタンス化する

C#でクラスのインスタンスを作るには、newキーワードを使います。

C#
Person person = new Person();

このコードは、Personクラスから新しいインスタンスを作成し、それをpersonという変数に代入しています。

分解して考えると、次のようになります。

C#
new Person()

この部分で新しいインスタンスを作成しています。

C#
Person person

この部分で、Person型の変数personを用意しています。

C#
Person person = new Person();

全体としては、「Personクラスのインスタンスを作って、person変数に入れる」という意味です。

4-3. 変数にインスタンスを代入する

作成したインスタンスは、変数に代入して使います。

C#
Person person = new Person();

このperson変数を通して、プロパティやメソッドにアクセスします。

C#
person.Name = "田中";
Console.WriteLine(person.Name);

C#では、クラス型の変数にはインスタンスそのものではなく、インスタンスへの参照が入ります。

そのため、同じインスタンスを複数の変数で参照することもできます。

C#
Person person1 = new Person();
person1.Name = "田中";

Person person2 = person1;
person2.Name = "佐藤";

Console.WriteLine(person1.Name);

この場合、表示されるのは佐藤です。person1person2は同じインスタンスを参照しているためです。

4-4. ドット演算子でメンバーにアクセスする

クラスのプロパティやメソッドにアクセスするには、ドット演算子.を使います。

C#
person.Name = "田中";
person.SayHello();

person.Nameは、personインスタンスのNameプロパティを表します。

person.SayHello()は、personインスタンスのSayHelloメソッドを呼び出しています。

例を見てみましょう。

C#
class Person
{
public string Name { get; set; }

public void SayHello()
{
Console.WriteLine($"こんにちは、{Name}です。");
}
}

class Program
{
static void Main()
{
Person person = new Person();
person.Name = "田中";
person.SayHello();
}
}

実行結果は次のようになります。

こんにちは、田中です。

4-5. インスタンスを複数作るとどうなるのか

クラスからは、複数のインスタンスを作ることができます。

C#
Person person1 = new Person();
person1.Name = "田中";

Person person2 = new Person();
person2.Name = "佐藤";

person1person2は、同じPersonクラスから作られていますが、別々のインスタンスです。

そのため、それぞれ異なる値を持てます。

C#
Console.WriteLine(person1.Name);
Console.WriteLine(person2.Name);

実行結果は次のようになります。

田中
佐藤

同じ設計図から作られていても、それぞれ独立したデータを持つのがインスタンスの特徴です。

5. コンストラクタとは?インスタンス生成時の初期化を理解する

コンストラクタとは、クラスのインスタンスが作られるときに自動的に実行される特別なメソッドです。

主に、初期値を設定するために使います。

5-1. コンストラクタの役割

コンストラクタは、インスタンス生成時の初期化処理を行います。

たとえば、Personクラスのインスタンスを作るときに、最初から名前や年齢を設定したい場合があります。

C#
class Person
{
public string Name { get; set; }
public int Age { get; set; }

public Person()
{
Name = "未設定";
Age = 0;
}
}

このPerson()がコンストラクタです。

コンストラクタは、クラス名と同じ名前で定義します。また、戻り値の型を書かないのが特徴です。

5-2. デフォルトコンストラクタとは

引数のないコンストラクタをデフォルトコンストラクタと呼びます。

C#
class Person
{
public Person()
{
Console.WriteLine("Personが作成されました");
}
}

次のようにインスタンス化すると、コンストラクタが自動的に呼び出されます。

C#
Person person = new Person();

実行結果は次のようになります。

Personが作成されました

なお、クラスにコンストラクタを1つも定義しない場合、C#では引数なしのコンストラクタが自動的に用意されます。

C#
class Person
{
public string Name { get; set; }
}

この場合でも、次のようにインスタンス化できます。

C#
Person person = new Person();

5-3. 引数ありコンストラクタの書き方

コンストラクタには引数を持たせることもできます。

C#
class Person
{
public string Name { get; set; }
public int Age { get; set; }

public Person(string name, int age)
{
Name = name;
Age = age;
}
}

このように書くと、インスタンスを作るときに名前と年齢を渡せます。

C#
Person person = new Person("田中", 20);

これにより、作成直後からNameには田中Ageには20が設定されます。

5-4. コンストラクタで初期値を設定する

コンストラクタは、初期値を確実に設定したいときに便利です。

C#
class Product
{
public string Name { get; set; }
public int Price { get; set; }

public Product(string name, int price)
{
Name = name;
Price = price;
}
}

このクラスでは、商品名と価格を必ず指定してインスタンスを作ります。

C#
Product product = new Product("ノート", 120);

コンストラクタを使うことで、「必要な値が設定されていない状態」を防ぎやすくなります。

5-5. オブジェクト初期化子との違い

C#では、オブジェクト初期化子を使ってプロパティに値を設定することもできます。

C#
Person person = new Person
{
Name = "田中",
Age = 20
};

これは、インスタンスを作成したあとにプロパティへ値を設定する書き方です。

一方、コンストラクタはインスタンス作成時に必要な値を渡します。

C#
Person person = new Person("田中", 20);

コンストラクタは「この値がないと正しいインスタンスにならない」という場合に向いています。

オブジェクト初期化子は、任意の値をわかりやすく設定したい場合に向いています。

6. プロパティとフィールドの違い

C#のクラスを学ぶうえで、フィールドとプロパティの違いは重要です。

どちらもデータを扱いますが、役割が異なります。

6-1. フィールドとは

フィールドとは、クラス内に直接定義する変数です。

C#
class Person
{
private string name;
}

このnameがフィールドです。

フィールドは、クラスの内部で状態を保持するために使います。

C#
class Counter
{
private int count;

public void Increment()
{
count++;
}
}

この例では、countフィールドに回数を保存しています。

6-2. プロパティとは

プロパティとは、クラスの外から値を読み書きするための仕組みです。

C#
class Person
{
public string Name { get; set; }
}

このNameがプロパティです。

プロパティは、見た目はフィールドのように扱えます。

C#
Person person = new Person();
person.Name = "田中";
Console.WriteLine(person.Name);

しかし、内部的にはgetsetによって値の取得や設定を制御できます。

6-3. get / setの基本

getは値を取得するときに使われます。

setは値を設定するときに使われます。

C#
class Person
{
private int age;

public int Age
{
get
{
return age;
}
set
{
age = value;
}
}
}

このコードでは、Ageプロパティを通してageフィールドの値を読み書きしています。

valueは、プロパティに代入された値を表す特別なキーワードです。

C#
person.Age = 20;

この場合、valueには20が入ります。

値をチェックすることもできます。

C#
class Person
{
private int age;

public int Age
{
get
{
return age;
}
set
{
if (value >= 0)
{
age = value;
}
}
}
}

これにより、年齢にマイナスの値が設定されるのを防げます。

6-4. privateフィールドとpublicプロパティを使い分ける理由

C#では、フィールドを直接publicにするのではなく、privateフィールドとpublicプロパティを組み合わせることがあります。

C#
class Person
{
private int age;

public int Age
{
get { return age; }
set
{
if (value >= 0)
{
age = value;
}
}
}
}

この書き方には、値のチェックや制限を入れられるというメリットがあります。

もしフィールドを直接公開すると、外部から自由に値を変更できてしまいます。

C#
public int age;

この場合、次のような不自然な値も設定できてしまいます。

C#
person.age = -10;

プロパティを使えば、このような不正な値を防ぎやすくなります。

6-5. 初心者が迷いやすい使い分けのポイント

初心者のうちは、次のように考えるとわかりやすいです。

クラスの外から使いたい値はプロパティにします。

C#
public string Name { get; set; }

クラスの中だけで使う値はprivateフィールドにします。

C#
private int count;

単純に値を持たせたいだけなら、自動実装プロパティを使えば十分です。

C#
public int Age { get; set; }

値のチェックや加工が必要になったら、privateフィールドとプロパティを組み合わせます。

C#
private int age;

public int Age
{
get { return age; }
set
{
if (value >= 0)
{
age = value;
}
}
}

7. メソッドを使ってクラスに処理を持たせる

クラスはデータだけでなく、処理も持てます。

その処理を表すのがメソッドです。

7-1. メソッドの基本構文

メソッドの基本構文は次のとおりです。

C#
アクセス修飾子 戻り値の型 メソッド名(引数)
{
処理
}

たとえば、戻り値がなく、引数もないメソッドは次のように書きます。

C#
public void SayHello()
{
Console.WriteLine("こんにちは");
}

publicは外部から呼び出せることを表します。

voidは戻り値がないことを表します。

SayHelloはメソッド名です。

7-2. 戻り値あり・戻り値なしの違い

戻り値なしのメソッドは、voidを使います。

C#
public void ShowMessage()
{
Console.WriteLine("メッセージを表示します");
}

このメソッドは、呼び出すと表示処理を行いますが、値は返しません。

戻り値ありのメソッドは、戻す値の型を書きます。

C#
public int Add(int a, int b)
{
return a + b;
}

このメソッドは、int型の値を返します。

C#
int result = Add(3, 5);
Console.WriteLine(result);

実行結果は次のようになります。

8

戻り値があるメソッドでは、returnを使って値を返します。

7-3. 引数を受け取るメソッド

メソッドには引数を渡せます。

C#
public void SayHello(string name)
{
Console.WriteLine($"こんにちは、{name}さん");
}

このメソッドは、nameという文字列を受け取ります。

C#
SayHello("田中");

実行結果は次のようになります。

こんにちは、田中さん

クラスの中でも同じように引数を使えます。

C#
class Calculator
{
public int Add(int a, int b)
{
return a + b;
}
}

使うときは次のようにします。

C#
Calculator calculator = new Calculator();
int result = calculator.Add(10, 20);

Console.WriteLine(result);

7-4. クラス内のフィールドやプロパティを使う方法

メソッドの中では、同じクラス内のフィールドやプロパティを使えます。

C#
class Person
{
public string Name { get; set; }
public int Age { get; set; }

public void ShowProfile()
{
Console.WriteLine($"名前: {Name}");
Console.WriteLine($"年齢: {Age}");
}
}

ShowProfileメソッドの中で、NameプロパティとAgeプロパティを使っています。

C#
Person person = new Person();
person.Name = "田中";
person.Age = 20;

person.ShowProfile();

実行結果は次のようになります。

名前: 田中
年齢: 20

このように、クラスの中にデータと処理をまとめることで、そのクラス自身に関係する処理を自然に書けます。

7-5. 実用的なメソッドのサンプルコード

商品の税込価格を計算するクラスを例にします。

C#
class Product
{
public string Name { get; set; }
public int Price { get; set; }

public int GetPriceWithTax()
{
return (int)(Price * 1.1);
}

public void ShowInfo()
{
Console.WriteLine($"商品名: {Name}");
Console.WriteLine($"税抜価格: {Price}円");
Console.WriteLine($"税込価格: {GetPriceWithTax()}円");
}
}

使い方は次のとおりです。

C#
Product product = new Product();
product.Name = "ノート";
product.Price = 100;

product.ShowInfo();

実行結果は次のようになります。

商品名: ノート
税抜価格: 100円
税込価格: 110円

この例では、税込価格の計算処理をGetPriceWithTaxメソッドにまとめています。

計算処理をメソッドにしておくと、必要なときに何度でも呼び出せます。

8. staticクラス・staticメンバーとの違い

C#のクラスを学んでいると、staticというキーワードが出てきます。

staticは、インスタンスを作らずに使えるメンバーを定義するときに使います。

8-1. staticとは何か

staticは、クラスそのものに属することを表します。

通常のメソッドやプロパティは、インスタンスを作ってから使います。

C#
Person person = new Person();
person.Name = "田中";

一方、staticメソッドは、インスタンスを作らずにクラス名から直接呼び出せます。

C#
Math.Abs(-10);

Math.Absは、絶対値を求めるstaticメソッドです。

8-2. インスタンスメンバーとstaticメンバーの違い

インスタンスメンバーは、インスタンスごとに別々の値を持ちます。

C#
class Person
{
public string Name { get; set; }
}
C#
Person person1 = new Person();
person1.Name = "田中";

Person person2 = new Person();
person2.Name = "佐藤";

person1person2は、それぞれ別のNameを持ちます。

一方、staticメンバーはクラスに1つだけ存在します。

C#
class Counter
{
public static int Count { get; set; }
}
C#
Counter.Count = 10;
Console.WriteLine(Counter.Count);

staticメンバーは、クラス名を使ってアクセスします。

8-3. staticメソッドの使いどころ

staticメソッドは、特定のインスタンスの状態に依存しない処理に向いています。

たとえば、計算処理や文字列の変換処理などです。

C#
class Calculator
{
public static int Add(int a, int b)
{
return a + b;
}
}

このメソッドは、特定のCalculatorインスタンスの状態を使っていません。

そのため、次のようにクラス名から直接呼び出せます。

C#
int result = Calculator.Add(3, 5);
Console.WriteLine(result);

staticメソッドは便利ですが、何でもstaticにすればよいわけではありません。

インスタンスごとの状態を扱う場合は、通常のインスタンスメソッドを使います。

8-4. staticクラスを使う場面

staticクラスは、すべてのメンバーがstaticであるクラスです。

C#
static class MathHelper
{
public static int Square(int value)
{
return value * value;
}
}

staticクラスはインスタンス化できません。

C#
// これはできない
// MathHelper helper = new MathHelper();

使うときはクラス名から直接呼び出します。

C#
int result = MathHelper.Square(5);
Console.WriteLine(result);

staticクラスは、共通処理や便利な関数をまとめるときに使われます。

8-5. 初心者が混乱しやすいポイント

初心者がよく混乱するのは、staticメンバーと非staticメンバーの呼び出し方です。

非staticメンバーはインスタンスから呼び出します。

C#
Person person = new Person();
person.SayHello();

staticメンバーはクラス名から呼び出します。

C#
Calculator.Add(1, 2);

また、staticメソッドの中から、直接インスタンスメンバーを使うことはできません。

C#
class Person
{
public string Name { get; set; }

public static void Show()
{
// Console.WriteLine(Name); // エラー
}
}

Nameはインスタンスごとに異なる値なので、staticメソッドからはどのインスタンスのNameを使えばよいかわからないためです。

9. C#のクラスでよく使う機能

C#のクラスには、基本以外にもよく使う機能があります。

ここでは、初心者が次に学ぶべき機能を簡単に紹介します。

9-1. 継承の基本

継承とは、あるクラスの機能を別のクラスに引き継ぐ仕組みです。

C#
class Animal
{
public void Eat()
{
Console.WriteLine("食べます");
}
}

class Dog : Animal
{
public void Bark()
{
Console.WriteLine("ワン");
}
}

DogクラスはAnimalクラスを継承しています。

そのため、DogのインスタンスからEatメソッドを呼び出せます。

C#
Dog dog = new Dog();
dog.Eat();
dog.Bark();

継承を使うと、共通する処理を親クラスにまとめられます。

ただし、継承を使いすぎると構造が複雑になるため、初心者のうちは基本だけ理解しておけば十分です。

9-2. thisキーワードの使い方

thisは、現在のインスタンス自身を表すキーワードです。

C#
class Person
{
private string name;

public Person(string name)
{
this.name = name;
}
}

この例では、引数のnameとフィールドのnameが同じ名前です。

this.nameと書くことで、「このインスタンスのフィールド」を意味します。

プロパティでも使えます。

C#
class Person
{
public string Name { get; set; }

public void SetName(string name)
{
this.Name = name;
}
}

thisは必ず必要な場面ばかりではありませんが、同じ名前の変数を区別したいときに便利です。

9-3. partialクラスとは

partialクラスとは、1つのクラスを複数のファイルに分けて定義できる仕組みです。

C#
partial class Person
{
public string Name { get; set; }
}

別のファイルに次のように書くこともできます。

C#
partial class Person
{
public void SayHello()
{
Console.WriteLine($"こんにちは、{Name}です。");
}
}

どちらも同じPersonクラスとして扱われます。

partialは、フォームアプリや自動生成コードなどで使われることがあります。

初心者が自分で頻繁に使う場面は少ないですが、既存のコードを読むときに見かけることがあります。

9-4. recordやstructとの違い

C#には、class以外にもrecordstructがあります。

classは参照型です。インスタンスへの参照を変数に持ちます。

structは値型です。小さなデータを表すときに使われることがあります。

C#
struct Point
{
public int X { get; set; }
public int Y { get; set; }
}

recordは、データを表現するために便利な型です。

C#
record PersonRecord(string Name, int Age);

初心者のうちは、まずclassをしっかり理解することが大切です。

その後、値型としてのstruct、データ中心のrecordを学ぶと理解しやすくなります。

9-5. ファイル分割とクラス管理の考え方

C#では、1つのクラスを1つのファイルに書くことが一般的です。

たとえば、PersonクラスならPerson.csというファイルに書きます。

C#
class Person
{
public string Name { get; set; }
}

必ずクラス名とファイル名を同じにしなければならないわけではありませんが、同じにしておくと管理しやすくなります。

クラスが増えてきたら、役割ごとにフォルダやnamespaceを分けます。

たとえば、データを表すクラスはModels、処理を担当するクラスはServicesに分けることがあります。

C#
namespace MyApp.Models
{
class Person
{
}
}

整理された構成にしておくと、コードを探しやすくなります。

10. C#のクラスで初心者がつまずきやすいエラーと対処法

C#のクラスを学ぶとき、初心者がよく遭遇するエラーがあります。

原因を知っておけば、落ち着いて対処できます。

10-1. インスタンス化せずにメンバーを使おうとしている

よくあるエラーの1つが、インスタンス化せずにプロパティやメソッドを使おうとすることです。

C#
class Person
{
public string Name { get; set; }
}

次のように書くとエラーになります。

C#
// Person.Name = "田中"; // エラー

Nameはインスタンスメンバーなので、クラス名から直接アクセスできません。

正しくは、newでインスタンスを作ります。

C#
Person person = new Person();
person.Name = "田中";

staticではないメンバーを使うには、まずインスタンス化が必要です。

10-2. privateメンバーに外部からアクセスしている

privateメンバーは、クラスの外からアクセスできません。

C#
class Person
{
private string name;
}

次のように外部からアクセスするとエラーになります。

C#
Person person = new Person();
// person.name = "田中"; // エラー

外部から値を設定したい場合は、publicプロパティを用意します。

C#
class Person
{
public string Name { get; set; }
}
C#
Person person = new Person();
person.Name = "田中";

アクセス修飾子の意味を理解すると、このようなエラーを避けやすくなります。

10-3. クラス名とファイル名・namespaceの混乱

C#では、クラス名とファイル名が必ず一致していなくても動作します。

ただし、実務ではクラス名とファイル名を一致させることが一般的です。

たとえば、PersonクラスはPerson.csに書きます。

また、namespaceが異なる場合、クラスが見つからないことがあります。

C#
namespace MyApp.Models
{
class Person
{
}
}

別のnamespaceから使う場合は、usingを追加します。

C#
using MyApp.Models;

または、完全修飾名で指定します。

C#
MyApp.Models.Person person = new MyApp.Models.Person();

クラスが見つからないときは、クラス名、ファイル名、namespace、usingを確認しましょう。

10-4. staticと非staticを混同している

staticメンバーと非staticメンバーを混同するエラーもよくあります。

C#
class Person
{
public string Name { get; set; }

public static void Show()
{
// Console.WriteLine(Name); // エラー
}
}

Nameはインスタンスメンバーです。一方、Showはstaticメソッドです。

staticメソッドは特定のインスタンスに属していないため、直接Nameを使えません。

使いたい場合は、インスタンスを作る必要があります。

C#
public static void Show()
{
Person person = new Person();
person.Name = "田中";
Console.WriteLine(person.Name);
}

または、Showを非staticメソッドにします。

C#
public void Show()
{
Console.WriteLine(Name);
}

10-5. NullReferenceExceptionが発生する原因

NullReferenceExceptionは、nullの変数に対してメンバーへアクセスしたときに発生します。

C#
Person person = null;
Console.WriteLine(person.Name);

この場合、personにはインスタンスが入っていないため、Nameにアクセスできません。

正しくは、インスタンスを作成してから使います。

C#
Person person = new Person();
person.Name = "田中";
Console.WriteLine(person.Name);

また、プロパティの中に別のクラス型を持つ場合も注意が必要です。

C#
class Person
{
public Address Address { get; set; }
}

class Address
{
public string City { get; set; }
}

次のように書くと、Addressがnullのためエラーになります。

C#
Person person = new Person();
// Console.WriteLine(person.Address.City); // エラー

先にAddressもインスタンス化します。

C#
Person person = new Person();
person.Address = new Address();
person.Address.City = "東京";

Console.WriteLine(person.Address.City);

NullReferenceExceptionが出たら、「どの変数がnullなのか」を確認することが大切です。

11. C#クラスの実践サンプル

ここでは、実際にPersonクラスを作り、プロパティ、コンストラクタ、メソッド、インスタンス化までをまとめて確認します。

11-1. Personクラスを作る

まずはPersonクラスを作成します。

C#
class Person
{
}

これが最小構成のクラスです。

11-2. プロパティを追加する

次に、名前と年齢を表すプロパティを追加します。

C#
class Person
{
public string Name { get; set; }
public int Age { get; set; }
}

これで、Personクラスは名前と年齢を持てるようになりました。

11-3. コンストラクタで初期化する

次に、コンストラクタを追加して、インスタンス作成時に名前と年齢を設定できるようにします。

C#
class Person
{
public string Name { get; set; }
public int Age { get; set; }

public Person(string name, int age)
{
Name = name;
Age = age;
}
}

このコンストラクタにより、次のようにインスタンス化できます。

C#
Person person = new Person("田中", 20);

11-4. メソッドで情報を表示する

次に、情報を表示するメソッドを追加します。

C#
class Person
{
public string Name { get; set; }
public int Age { get; set; }

public Person(string name, int age)
{
Name = name;
Age = age;
}

public void ShowProfile()
{
Console.WriteLine($"名前: {Name}");
Console.WriteLine($"年齢: {Age}");
}
}

ShowProfileメソッドを呼び出すと、名前と年齢を表示できます。

11-5. Mainメソッドからインスタンス化して使う

最後に、MainメソッドからPersonクラスを使います。

C#
using System;

class Person
{
public string Name { get; set; }
public int Age { get; set; }

public Person(string name, int age)
{
Name = name;
Age = age;
}

public void ShowProfile()
{
Console.WriteLine($"名前: {Name}");
Console.WriteLine($"年齢: {Age}");
}
}

class Program
{
static void Main()
{
Person person1 = new Person("田中", 20);
Person person2 = new Person("佐藤", 25);

person1.ShowProfile();
person2.ShowProfile();
}
}

実行結果は次のようになります。

名前: 田中
年齢: 20
名前: 佐藤
年齢: 25

このサンプルでは、1つのPersonクラスから複数のインスタンスを作成しています。

それぞれのインスタンスが別々の名前と年齢を持っていることがわかります。

12. C#のクラスを理解するための学習手順

C#のクラスは、一度にすべてを理解しようとすると難しく感じます。

順番に学ぶことで、無理なく理解できます。

12-1. まずはクラス・インスタンス・newを理解する

最初に理解すべきなのは、クラス、インスタンス、newの関係です。

クラスは設計図です。

インスタンスは、クラスから作られた実体です。

newは、クラスからインスタンスを作るためのキーワードです。

C#
Person person = new Person();

この1行の意味をしっかり理解することが、C#のクラス学習の第一歩です。

12-2. 次にプロパティとメソッドを覚える

次に、プロパティとメソッドを学びます。

プロパティはデータを表します。

C#
public string Name { get; set; }

メソッドは処理を表します。

C#
public void SayHello()
{
Console.WriteLine("こんにちは");
}

クラスは、データと処理をまとめるものだと考えると理解しやすくなります。

12-3. コンストラクタで初期化の流れを理解する

プロパティとメソッドに慣れたら、コンストラクタを学びましょう。

コンストラクタは、インスタンスを作るときに実行される初期化処理です。

C#
public Person(string name, int age)
{
Name = name;
Age = age;
}

コンストラクタを理解すると、「インスタンスが作られるときに何が起きているのか」が見えるようになります。

12-4. 慣れてきたら継承やstaticを学ぶ

基本に慣れてきたら、継承やstaticを学びます。

継承は、既存のクラスの機能を引き継ぐ仕組みです。

C#
class Dog : Animal
{
}

staticは、インスタンスを作らずに使えるメンバーを定義する仕組みです。

C#
static class Calculator
{
public static int Add(int a, int b)
{
return a + b;
}
}

これらは便利ですが、最初から深く学びすぎると混乱しやすいです。

まずは通常のクラスとインスタンスを理解してから学ぶとよいでしょう。

12-5. 小さなサンプルを作って練習する

C#のクラスは、読むだけではなかなか身につきません。

小さなサンプルを作って練習することが大切です。

たとえば、次のようなクラスを作ってみるとよいでしょう。

Personクラス、Productクラス、Carクラス、Bookクラス、Calculatorクラスなどです。

例として、Bookクラスを作るなら次のようになります。

C#
class Book
{
public string Title { get; set; }
public string Author { get; set; }

public Book(string title, string author)
{
Title = title;
Author = author;
}

public void ShowInfo()
{
Console.WriteLine($"タイトル: {Title}");
Console.WriteLine($"著者: {Author}");
}
}

このように身近なものをクラスにしてみると、クラスの考え方が理解しやすくなります。

13. C#のクラスに関するよくある質問

ここでは、C#のクラスについて初心者が疑問に感じやすい内容をまとめます。

13-1. クラスとインスタンスの違いは何ですか?

クラスは設計図です。

インスタンスは、その設計図から作られた実体です。

たとえば、Personクラスは「人を作るための設計図」です。

C#
class Person
{
public string Name { get; set; }
}

このクラスから作ったpersonがインスタンスです。

C#
Person person = new Person();

クラスだけでは具体的なデータを持ちません。インスタンスを作ることで、名前などの値を持てるようになります。

13-2. クラスは必ずインスタンス化が必要ですか?

通常のクラスを使う場合は、基本的にインスタンス化が必要です。

C#
Person person = new Person();

ただし、staticクラスやstaticメンバーはインスタンス化せずに使えます。

C#
Console.WriteLine(Math.Abs(-10));

Math.Absのようなstaticメソッドは、クラス名から直接呼び出せます。

初心者のうちは、「普通のクラスはnewして使う」「staticはnewしなくても使える」と覚えるとよいでしょう。

13-3. フィールドとプロパティはどちらを使うべきですか?

外部から使うデータは、基本的にプロパティを使います。

C#
public string Name { get; set; }

クラスの内部だけで使うデータは、privateフィールドにします。

C#
private int count;

初心者のうちは、外部に公開したい値はpublicプロパティ、内部で管理したい値はprivateフィールドと考えれば問題ありません。

13-4. staticを付けると何が変わりますか?

staticを付けると、そのメンバーはインスタンスではなくクラスに属します。

通常のメソッドは、インスタンスを作ってから呼び出します。

C#
Person person = new Person();
person.SayHello();

staticメソッドは、クラス名から直接呼び出します。

C#
Calculator.Add(1, 2);

staticは便利ですが、インスタンスごとのデータを扱う処理には向いていません。

13-5. 初心者はどこまでクラスを理解すればよいですか?

初心者は、まず次の内容を理解できれば十分です。

クラスは設計図であること、newでインスタンスを作ること、プロパティでデータを持てること、メソッドで処理を持てること、コンストラクタで初期化できることです。

最初から継承、抽象クラス、インターフェイス、ジェネリックなどをすべて理解する必要はありません。

まずは小さなクラスを自分で作り、インスタンス化して使う練習を重ねましょう。

まとめ

C#のクラスは、データと処理をまとめるための基本的な仕組みです。

クラスは「オブジェクトの設計図」であり、実際に使うにはnewキーワードでインスタンス化します。

C#
Person person = new Person();

クラスの中には、データを表すプロパティやフィールド、処理を表すメソッドを定義できます。

C#
class Person
{
public string Name { get; set; }

public void SayHello()
{
Console.WriteLine($"こんにちは、{Name}です。");
}
}

また、コンストラクタを使うと、インスタンス生成時に初期値を設定できます。

C#
public Person(string name)
{
Name = name;
}

C#のクラスを理解するには、まず「クラス」「インスタンス」「new」の関係を押さえることが大切です。

そのうえで、プロパティ、メソッド、コンストラクタ、static、継承へと少しずつ学習を進めると、C#のコードを読み書きしやすくなります。

C#のクラスは最初は難しく感じるかもしれませんが、小さなサンプルを作って練習すれば少しずつ理解できます。まずはPersonProductのような身近なクラスを作り、インスタンス化して使うところから始めてみましょう。