C#のインスタンスとは?初心者にもわかる作成方法・使い方・クラスとの違い
はじめに
C#を学び始めると、早い段階で「インスタンス」という言葉が出てきます。
しかし、初心者にとっては「クラス」「オブジェクト」「インスタンス」の違いがわかりにくく、コードを書いていても何を作っているのかイメージしづらいことがあります。
C#のインスタンスとは、簡単に言うとクラスという設計図から作られた実体のことです。
クラスだけでは実際のデータを持ったり、処理を実行したりする対象としては使えません。newを使ってインスタンスを作成することで、はじめてそのクラスを実際に利用できるようになります。
この記事では、C#のインスタンスとは何か、作成方法、使い方、クラスやオブジェクトとの違い、よくあるエラーまで初心者にもわかりやすく解説します。
1. C#のインスタンスとは何か
1-1. インスタンスの意味を初心者向けに簡単解説
C#のインスタンスとは、クラスをもとに作られた具体的なデータのかたまりです。
たとえば、「人」を表すPersonクラスがあるとします。
このクラスには、名前や年齢などの情報を持たせることができます。
C#class Person
{
public string Name;
public int Age;
}
この時点では、Personという「人の設計図」があるだけです。
実際の「田中さん」や「佐藤さん」はまだ存在していません。
そこで、次のようにnewを使ってインスタンスを作成します。
C#Person person1 = new Person();
このperson1が、Personクラスから作られたインスタンスです。
つまり、クラスが設計図で、インスタンスはその設計図から作られた実物だと考えるとわかりやすいです。
1-2. クラスとインスタンスの関係
クラスとインスタンスの関係は、よく「設計図」と「実体」にたとえられます。
クラスは、どのようなデータや処理を持つかを定義します。
一方、インスタンスは、そのクラスをもとに実際に作られたものです。
C#class Car
{
public string Color;
public void Drive()
{
Console.WriteLine("車が走ります");
}
}
このCarクラスは、車の色を表すColorフィールドと、車が走る処理を表すDriveメソッドを持っています。
ただし、クラスを定義しただけでは実際の車は存在しません。
C#Car myCar = new Car();
このようにインスタンスを作成することで、myCarという実際に扱える車のデータができます。
1-3. オブジェクトとの違い
C#では、「インスタンス」と「オブジェクト」はほぼ同じ意味で使われることが多いです。
厳密に言うと、オブジェクトはメモリ上に存在する実体全般を指し、インスタンスは「あるクラスから作られた実体」という意味で使われます。
たとえば、次のコードを見てみましょう。
C#Person person = new Person();
この場合、new Person()によって作られたものは、Personクラスのインスタンスです。
同時に、メモリ上に存在するオブジェクトでもあります。
初心者のうちは、C#においては「インスタンス」と「オブジェクト」はかなり近い意味だと理解して問題ありません。
ただし、説明の場面では「どのクラスから作られたものか」を強調したいときに「インスタンス」という言葉がよく使われます。
1-4. インスタンスが必要になる場面
インスタンスは、クラスに定義されたフィールド、プロパティ、メソッドを実際に使いたいときに必要になります。
たとえば、次のようなDogクラスがあるとします。
C#class Dog
{
public string Name;
public void Bark()
{
Console.WriteLine(Name + "が吠えました");
}
}
このクラスを使って犬の名前を設定し、吠える処理を実行するには、インスタンスを作成する必要があります。
C#Dog dog = new Dog();
dog.Name = "ポチ";
dog.Bark();
実行結果は次のようになります。
C#ポチが吠えました
このように、クラスに書いた内容を実際に動かすには、インスタンスを作成して操作する必要があります。
2. C#でインスタンスを作成する基本構文
2-1. new演算子を使ったインスタンス化
C#でインスタンスを作成するには、基本的にnew演算子を使います。
この処理を「インスタンス化」と呼びます。
基本構文は次のとおりです。
C#クラス名 変数名 = new クラス名();
たとえば、Personクラスのインスタンスを作成する場合は、次のように書きます。
C#Person person = new Person();
左側のPerson personは、Person型の変数personを用意している部分です。
右側のnew Person()は、Personクラスから新しいインスタンスを作成している部分です。
2-2. クラス名・変数名・コンストラクタの役割
インスタンス作成のコードには、いくつかの要素があります。
C#Person person = new Person();
まず、最初のPersonは型を表しています。
これは「この変数にはPersonクラスのインスタンスを入れます」という意味です。
次に、personは変数名です。
作成したインスタンスをあとから使うための名前です。
そして、new Person()のPerson()はコンストラクタの呼び出しです。
コンストラクタとは、インスタンスを作成するときに実行される特別な処理です。
つまり、この1行では、次のことを行っています。
C#Person型の変数personを用意し、Personクラスの新しいインスタンスを作成して代入する
2-3. インスタンス作成のサンプルコード
実際にインスタンスを作成して使うコードを見てみましょう。
C#using System;
class Person
{
public string Name;
public int Age;
public void Introduce()
{
Console.WriteLine($"私の名前は{Name}です。年齢は{Age}歳です。");
}
}
class Program
{
static void Main()
{
Person person = new Person();
person.Name = "田中";
person.Age = 25;
person.Introduce();
}
}
実行結果は次のようになります。
C#私の名前は田中です。年齢は25歳です。
このコードでは、new Person()でPersonクラスのインスタンスを作成しています。
その後、person.Nameとperson.Ageに値を設定し、person.Introduce()でメソッドを呼び出しています。
2-4. varを使った書き方との違い
C#では、型名の代わりにvarを使ってインスタンスを作成することもできます。
C#var person = new Person();
これは次のコードとほぼ同じ意味です。
C#Person person = new Person();
varを使うと、右側のnew Person()から型を推論してくれます。
つまり、コンパイラが「この変数はPerson型だ」と判断してくれます。
ただし、varは型がなくなるわけではありません。
あくまでコード上で型名の記述を省略しているだけで、変数personはPerson型として扱われます。
初心者のうちは、最初は次のように型名を明示した書き方に慣れるのがおすすめです。
C#Person person = new Person();
慣れてきたら、コードを簡潔にするためにvarを使うとよいでしょう。
3. インスタンスの使い方
3-1. インスタンスからフィールドにアクセスする
インスタンスを作成すると、そのインスタンスを通じてフィールドにアクセスできます。
フィールドとは、クラスの中に定義された変数のようなものです。
C#class Student
{
public string Name;
public int Score;
}
このStudentクラスのインスタンスを作成し、フィールドに値を設定してみます。
C#Student student = new Student();
student.Name = "山田";
student.Score = 80;
Console.WriteLine(student.Name);
Console.WriteLine(student.Score);
実行結果は次のようになります。
C#山田
80
インスタンスのフィールドにアクセスするときは、次のようにドット.を使います。
C#インスタンス名.フィールド名
3-2. インスタンスからメソッドを呼び出す
インスタンスからは、クラスに定義されたメソッドも呼び出せます。
メソッドとは、処理をまとめたものです。
C#class Calculator
{
public int Add(int a, int b)
{
return a + b;
}
}
このCalculatorクラスのインスタンスを作成して、Addメソッドを呼び出してみます。
C#Calculator calc = new Calculator();
int result = calc.Add(3, 5);
Console.WriteLine(result);
実行結果は次のようになります。
C#8
このように、インスタンスメソッドを呼び出すときも、フィールドと同じようにドット.を使います。
C#インスタンス名.メソッド名()
3-3. 複数のインスタンスを作成した場合の動き
同じクラスから、複数のインスタンスを作成することもできます。
C#Person person1 = new Person();
Person person2 = new Person();
person1とperson2は、どちらもPersonクラスから作られています。
しかし、それぞれ別のインスタンスです。
C#person1.Name = "田中";
person2.Name = "佐藤";
Console.WriteLine(person1.Name);
Console.WriteLine(person2.Name);
実行結果は次のようになります。
C#田中
佐藤
同じクラスから作られていても、インスタンスごとに別々のデータを持つことができます。
3-4. インスタンスごとに値が分かれる仕組み
インスタンスごとに値が分かれるのは、newするたびに別の実体が作られるからです。
C#Person person1 = new Person();
Person person2 = new Person();
このコードでは、Personクラスのインスタンスが2つ作られています。
それぞれが別々のデータ領域を持っているため、片方の値を変更しても、もう片方には影響しません。
C#person1.Name = "田中";
person2.Name = "佐藤";
person1.Name = "鈴木";
Console.WriteLine(person1.Name);
Console.WriteLine(person2.Name);
実行結果は次のようになります。
C#鈴木
佐藤
person1.Nameを変更しても、person2.Nameは変わりません。
これがインスタンスを使う大きなメリットです。
4. クラスとインスタンスの違いを具体例で理解する
4-1. クラスは設計図、インスタンスは実体
クラスとインスタンスの違いは、次のように考えると理解しやすいです。
C#class House
{
public string Color;
public int RoomCount;
}
このHouseクラスは、家の設計図です。
色や部屋数を持つことは定義されていますが、具体的な家はまだ存在しません。
C#House house1 = new House();
house1.Color = "白";
house1.RoomCount = 3;
House house2 = new House();
house2.Color = "青";
house2.RoomCount = 5;
house1とhouse2は、Houseクラスから作られた別々のインスタンスです。
同じ設計図から作られていても、色や部屋数はそれぞれ異なります。
4-2. 変数・メソッド・プロパティとの関係
クラスの中には、フィールド、メソッド、プロパティを定義できます。
C#class Product
{
public string Name { get; set; }
public int Price { get; set; }
public void ShowInfo()
{
Console.WriteLine($"{Name}は{Price}円です。");
}
}
この例では、NameとPriceがプロパティ、ShowInfoがメソッドです。
インスタンスを作成すると、これらを実際に使えるようになります。
C#Product product = new Product();
product.Name = "ノート";
product.Price = 120;
product.ShowInfo();
実行結果は次のようになります。
C#ノートは120円です。
クラスに定義したプロパティやメソッドは、インスタンスを通じて操作します。
4-3. 図解イメージで理解するクラスとインスタンス
クラスとインスタンスの関係を文字で図解すると、次のようになります。
C#Personクラス
├─ Name
├─ Age
└─ Introduce()
↓ new
person1インスタンス
├─ Name = "田中"
├─ Age = 25
└─ Introduce()
person2インスタンス
├─ Name = "佐藤"
├─ Age = 30
└─ Introduce()
Personクラスは共通の設計図です。
そこからperson1やperson2という実体が作られます。
それぞれのインスタンスは、同じ構造を持っていますが、中に入っている値は別々です。
4-4. 初心者が混同しやすいポイント
初心者が混同しやすいのは、クラスそのものとインスタンスを同じものだと思ってしまうことです。
たとえば、次のようなクラスがあるとします。
C#class Person
{
public string Name;
}
この状態では、Nameという情報を持てる設計図があるだけです。
実際に名前を入れるには、インスタンスを作成する必要があります。
C#Person person = new Person();
person.Name = "田中";
また、インスタンスメンバーはクラス名から直接使うことはできません。
C#Person.Name = "田中"; // エラー
Nameはインスタンスごとの値なので、次のようにインスタンス名からアクセスします。
C#person.Name = "田中";
5. コンストラクタとインスタンス初期化
5-1. コンストラクタとは何か
コンストラクタとは、インスタンスが作成されるときに自動的に呼び出される特別なメソッドです。
主に、インスタンスの初期値を設定するために使います。
C#class Person
{
public string Name;
public Person()
{
Name = "未設定";
}
}
この例では、new Person()でインスタンスを作成すると、コンストラクタが呼び出されてNameに"未設定"が入ります。
C#Person person = new Person();
Console.WriteLine(person.Name);
実行結果は次のようになります。
C#未設定
コンストラクタ名はクラス名と同じにする必要があります。
戻り値の型は書きません。
5-2. 引数なしコンストラクタの使い方
引数なしコンストラクタは、引数を受け取らずにインスタンスを初期化するコンストラクタです。
C#class Book
{
public string Title;
public Book()
{
Title = "タイトル未定";
}
}
使い方は次のとおりです。
C#Book book = new Book();
Console.WriteLine(book.Title);
実行結果は次のようになります。
C#タイトル未定
特にコンストラクタを書かない場合、C#では自動的に引数なしコンストラクタが用意されます。
ただし、自分で引数ありコンストラクタを定義した場合は、必要に応じて引数なしコンストラクタも明示的に書く必要があります。
5-3. 引数ありコンストラクタの使い方
引数ありコンストラクタを使うと、インスタンス作成時に値を渡して初期化できます。
C#class Person
{
public string Name;
public int Age;
public Person(string name, int age)
{
Name = name;
Age = age;
}
}
このクラスのインスタンスを作成するには、コンストラクタに引数を渡します。
C#Person person = new Person("田中", 25);
Console.WriteLine(person.Name);
Console.WriteLine(person.Age);
実行結果は次のようになります。
C#田中
25
引数ありコンストラクタを使うと、インスタンス作成後に1つずつ値を設定しなくても、最初から必要な値を入れられます。
5-4. オブジェクト初期化子を使う方法
C#では、オブジェクト初期化子を使ってインスタンス作成と同時にプロパティへ値を設定できます。
C#class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
オブジェクト初期化子を使うと、次のように書けます。
C#Person person = new Person
{
Name = "佐藤",
Age = 30
};
この書き方では、new Person()でインスタンスを作成し、その直後にNameとAgeを設定しています。
プロパティが多い場合でも、見やすく書けるのがメリットです。
C#Console.WriteLine($"{person.Name}さんは{person.Age}歳です。");
実行結果は次のようになります。
C#佐藤さんは30歳です。
6. staticとインスタンスの違い
6-1. staticメンバーとは何か
staticメンバーとは、インスタンスを作成しなくてもクラス名から直接使えるメンバーのことです。
フィールド、プロパティ、メソッドなどにstaticを付けることができます。
C#class MathHelper
{
public static int Add(int a, int b)
{
return a + b;
}
}
このAddメソッドはstaticなので、インスタンスを作成せずに呼び出せます。
C#int result = MathHelper.Add(3, 5);
Console.WriteLine(result);
実行結果は次のようになります。
C#8
6-2. インスタンスメンバーとの違い
インスタンスメンバーは、インスタンスごとに存在するメンバーです。
一方、staticメンバーはクラスそのものに属します。
C#class Counter
{
public int InstanceCount;
public static int StaticCount;
}
InstanceCountはインスタンスメンバーなので、インスタンスごとに値を持ちます。StaticCountはstaticメンバーなので、クラス全体で共有されます。
C#Counter c1 = new Counter();
Counter c2 = new Counter();
c1.InstanceCount = 1;
c2.InstanceCount = 2;
Counter.StaticCount = 10;
Console.WriteLine(c1.InstanceCount);
Console.WriteLine(c2.InstanceCount);
Console.WriteLine(Counter.StaticCount);
実行結果は次のようになります。
C#1
2
10
6-3. staticはインスタンス化せずに使える
staticメンバーは、次のようにクラス名から直接使います。
C#ClassName.StaticMember
たとえば、C#でよく使うConsole.WriteLineもstaticメソッドです。
C#Console.WriteLine("Hello");
Consoleクラスのインスタンスを作成しなくても使えます。
これはWriteLineがstaticメソッドとして用意されているためです。
一方、インスタンスメンバーは、必ずインスタンスを作成してから使います。
C#Person person = new Person();
person.Name = "田中";
6-4. staticとインスタンスの使い分け
staticを使うか、インスタンスを使うかは、データを個別に持たせたいかどうかで考えるとわかりやすいです。
個別の状態を持つ必要がある場合は、インスタンスを使います。
C#Person person1 = new Person();
Person person2 = new Person();
人ごとに名前や年齢が違うため、Personはインスタンスとして扱うのが自然です。
一方、共通の処理だけを提供したい場合はstaticが向いています。
C#class TaxCalculator
{
public static int AddTax(int price)
{
return (int)(price * 1.1);
}
}
このような計算処理は、特定のインスタンスに依存しないため、staticメソッドとして定義できます。
7. インスタンスでよくあるエラーと対処法
7-1. NullReferenceExceptionが起きる原因
C#でインスタンスを扱うときによく出るエラーがNullReferenceExceptionです。
これは、インスタンスが存在しない状態、つまりnullの変数に対してメンバーへアクセスしようとしたときに発生します。
C#Person person = null;
Console.WriteLine(person.Name); // エラー
このコードでは、personにインスタンスが代入されていません。
そのため、person.Nameにアクセスしようとするとエラーになります。
対処法は、使用する前にインスタンスを作成することです。
C#Person person = new Person();
person.Name = "田中";
Console.WriteLine(person.Name);
7-2. インスタンス化し忘れによるエラー
初心者がよくやってしまうのが、変数だけ宣言してインスタンス化を忘れることです。
C#Person person;
person.Name = "田中"; // エラー
このコードでは、personという変数はありますが、new Person()でインスタンスが作られていません。
正しくは次のように書きます。
C#Person person = new Person();
person.Name = "田中";
C#では、クラス型の変数を宣言しただけではインスタンスは作成されません。newを使って明示的にインスタンスを作る必要があります。
7-3. staticメンバーとインスタンスメンバーの混同
staticメンバーとインスタンスメンバーを混同すると、コンパイルエラーになることがあります。
C#class Sample
{
public int Number;
}
Numberはインスタンスメンバーなので、次のようにクラス名からアクセスすることはできません。
C#Sample.Number = 10; // エラー
正しくは、インスタンスを作成してからアクセスします。
C#Sample sample = new Sample();
sample.Number = 10;
逆に、staticメンバーは基本的にクラス名からアクセスします。
C#class Sample
{
public static int Count;
}
Sample.Count = 5;
7-4. アクセス修飾子によって使えない場合
クラスのフィールドやメソッドには、アクセス修飾子を付けることができます。
代表的なものにpublicやprivateがあります。
C#class Person
{
private string Name;
}
privateが付いたメンバーは、クラスの外から直接アクセスできません。
C#Person person = new Person();
person.Name = "田中"; // エラー
外部から使いたい場合は、publicなプロパティやメソッドを用意します。
C#class Person
{
private string name;
public void SetName(string value)
{
name = value;
}
public string GetName()
{
return name;
}
}
使い方は次のとおりです。
C#Person person = new Person();
person.SetName("田中");
Console.WriteLine(person.GetName());
このように、アクセス修飾子によってインスタンスから使えるメンバーと使えないメンバーが変わります。
8. インスタンスを使った実践サンプル
8-1. Personクラスを作成する
ここでは、Personクラスを使ってインスタンスの作成からメソッド呼び出しまでを確認します。
まず、次のようなPersonクラスを作成します。
C#class Person
{
public string Name { get; set; }
public int Age { get; set; }
public void Introduce()
{
Console.WriteLine($"こんにちは。私は{Name}です。{Age}歳です。");
}
}
このクラスには、NameとAgeというプロパティがあります。
また、自分の情報を表示するIntroduceメソッドがあります。
8-2. インスタンスを作成して値を設定する
次に、Personクラスのインスタンスを作成して値を設定します。
C#Person person = new Person();
person.Name = "田中";
person.Age = 25;
このコードでは、new Person()でインスタンスを作成し、personという変数に代入しています。
その後、NameとAgeに値を設定しています。
オブジェクト初期化子を使うと、次のようにも書けます。
C#Person person = new Person
{
Name = "田中",
Age = 25
};
どちらの書き方でも、Personクラスのインスタンスに値を設定できます。
8-3. メソッドを呼び出して結果を表示する
作成したインスタンスから、Introduceメソッドを呼び出してみます。
C#person.Introduce();
全体のコードは次のようになります。
C#using System;
class Person
{
public string Name { get; set; }
public int Age { get; set; }
public void Introduce()
{
Console.WriteLine($"こんにちは。私は{Name}です。{Age}歳です。");
}
}
class Program
{
static void Main()
{
Person person = new Person
{
Name = "田中",
Age = 25
};
person.Introduce();
}
}
実行結果は次のようになります。
C#こんにちは。私は田中です。25歳です。
このように、インスタンスに設定した値を使ってメソッドの処理を実行できます。
8-4. 複数インスタンスで動作を比較する
最後に、複数のインスタンスを作成して動作を比較してみます。
C#using System;
class Person
{
public string Name { get; set; }
public int Age { get; set; }
public void Introduce()
{
Console.WriteLine($"こんにちは。私は{Name}です。{Age}歳です。");
}
}
class Program
{
static void Main()
{
Person person1 = new Person
{
Name = "田中",
Age = 25
};
Person person2 = new Person
{
Name = "佐藤",
Age = 30
};
person1.Introduce();
person2.Introduce();
}
}
実行結果は次のようになります。
C#こんにちは。私は田中です。25歳です。
こんにちは。私は佐藤です。30歳です。
person1とperson2は同じPersonクラスから作られていますが、それぞれ別々の値を持っています。
これにより、同じ設計図から複数の実体を作り、それぞれ異なるデータを扱うことができます。
9. C#のインスタンスを理解するためのポイント
9-1. インスタンスはクラスから作られる実体
C#のインスタンスは、クラスから作られる実体です。
クラスにはデータや処理の定義を書きますが、そのままでは具体的なデータを持つ対象にはなりません。
C#Person person = new Person();
このようにインスタンスを作成することで、クラスに定義されたフィールド、プロパティ、メソッドを実際に使えるようになります。
9-2. newで作成して変数に代入する
インスタンスは、基本的にnewを使って作成します。
C#ClassName variableName = new ClassName();
作成したインスタンスは、変数に代入して使います。
C#Person person = new Person();
このpersonを通じて、プロパティに値を設定したり、メソッドを呼び出したりできます。
C#person.Name = "田中";
person.Introduce();
9-3. インスタンスごとにデータを持てる
インスタンスの大きな特徴は、インスタンスごとに別々のデータを持てることです。
C#Person person1 = new Person();
Person person2 = new Person();
person1.Name = "田中";
person2.Name = "佐藤";
person1とperson2は別々のインスタンスなので、それぞれ違う名前を持てます。
片方の値を変更しても、もう片方の値には影響しません。
C#person1.Name = "鈴木";
Console.WriteLine(person1.Name);
Console.WriteLine(person2.Name);
実行結果は次のようになります。
C#鈴木
佐藤
9-4. クラス・オブジェクト・staticとの違いを押さえる
C#のインスタンスを理解するには、クラス、オブジェクト、staticとの違いを押さえることが大切です。
クラスは設計図です。
インスタンスは、その設計図から作られた実体です。
オブジェクトは、メモリ上に存在する実体を指す言葉で、インスタンスと近い意味で使われます。
staticメンバーは、インスタンスを作成せずにクラス名から使えるメンバーです。
C#Person person = new Person(); // インスタンスを作成
Console.WriteLine(person.Name); // インスタンスメンバーにアクセス
C#Console.WriteLine("Hello"); // staticメソッドを呼び出し
インスタンスメンバーは個別のデータを扱いたいときに使い、staticメンバーは共通の処理や値を扱いたいときに使います。
まとめ
C#のインスタンスとは、クラスから作られる実体のことです。
クラスは設計図であり、インスタンスはその設計図をもとに作られた実際に使えるデータです。
インスタンスを作成するには、基本的にnew演算子を使います。
C#Person person = new Person();
作成したインスタンスからは、フィールドやプロパティにアクセスしたり、メソッドを呼び出したりできます。
C#person.Name = "田中";
person.Introduce();
また、同じクラスから複数のインスタンスを作成すれば、それぞれ別々の値を持たせることができます。
これにより、同じ構造を持つ複数のデータを効率よく扱えます。
初心者がつまずきやすいポイントは、クラスとインスタンスの違い、newによるインスタンス化、staticメンバーとの違い、NullReferenceExceptionなどです。
C#でオブジェクト指向プログラミングを理解するうえで、インスタンスは非常に重要な考え方です。
まずは「クラスは設計図、インスタンスは実体」と覚え、実際にコードを書きながら理解を深めていきましょう。

