C#のクラスの仕組みとサンプルです。
目次
クラスの仕組み | クラスの概要 |
クラスからインスタンスを生成する | |
静的変数と静的メソッド(クラスからインスタンスを生成しないで利用) |
クラスの概要
class クラス名 { フィールド メソッド } |
- クラスは、データ(フィールド)と処理(メソッド)を定義できます。
- クラスは設計図や型枠のイメージです。クラスからオブジェクト(インスタンス)を生成して利用します。
※クラスからオブジェクト(インスタンス)を生成しないで利用することもできます。 - 機能を他のクラスに継承させることができます。
C# クラスの継承の仕組みとサンプル
クラスのサンプルです。
namespace test1
{
class Animal
{
private string name; //変数 varは不可
public string walk()
{
var str = "が歩く"; //変数 varは可
return name + str;
}
public void setName(string name)
{
this.name = name;
}
}
}
3~16行目までがAnimalというクラスです。
名前空間
namespace test1
1行目は、test1というnamespace(名前空間)です。
名前空間は、名前の重複を防ぐことができます。
例としてtest1の名前空間のColorクラスと、test2の名前空間のColorクラスは別のものとして区別できます。
クラス
class Animal
3行目は、Animalというクラス名です。最初の文字を大文字にします。Pascal記法といいます。
フィールド(データ)
private string name; //変数 varは不可
5行目は、クラスの内部で宣言されている変数です。フィールドまたはメンバー変数といいます。
privateのためクラスの外部からアクセスすることができません。
アクセスの有効範囲のことをスコープと呼びます。スコープは狭いほうが影響範囲が狭まり修正しやすくなります。データ型はstringで、ここではvarは不可です。
メソッド(処理)
public string walk()
{
var str = "が歩く"; //変数 varは可
return name + str;
}
public void setName(string name)
{
this.name = name;
}
7行目の「walk」と12行目の「setName」は、クラスのメソッドです。
publicのためクラスの外部からアクセスすることができます。
クラス内の変数やメソッドのことをメンバーといいます。
7行目のstring walk()のstringは、string型の値を返すという意味です。
9行目の変数strはローカル変数です。ローカル変数の有効範囲はメソッド内のみです。ここではvarでの宣言は可能です。
10行目のreturnは、値を返します。返される値を返り値または戻り値と呼びます。
12行目のstring nameのnameは、引数です。メソッドに値を渡します。
→7行目は()になっているので引数はありません。
戻り値がない場合、戻り値の型の箇所は「void」を指定します。
14行目のthis.nameのthisは、インスタンスを指します。
クラスからインスタンスを生成する
クラスからインスタンス(オブジェクト)を生成する場合は、new演算子を使用します。インスタンス化といいます
データ型 変数 = new クラス名(); //クラスからインスタンスを生成 |
上記の図はクラスからインスタンス(オブジェクト)を3つ生成したときのイメージです。
インスタンスごとにデータを管理できます。
例えると、クラスは設計図や型枠で、インスタンスは実体です。
以下は、クラスからインスタンスを生成して利用するサンプルです。
上記「クラスのサンプル」のAnimalクラスからインスタンスを生成します。
using System;
namespace test1
{
class Test1
{
static void Main()
{
Animal a1 = new Animal();
Animal a2 = new Animal();
Animal a3 = new Animal();
a1.setName("犬");
a2.setName("猫");
a3.setName("鳥");
Console.WriteLine(a1.walk()); // 犬が歩く
Console.WriteLine(a2.walk()); // 猫が歩く
Console.WriteLine(a3.walk()); // 鳥が歩く
}
}
}
8~10行目は、上記のAnimalクラスのインスタンスを3つ生成しています。
Animal a1のAnimalは、変数の型で、a1は変数です。
この変数には、インスタンスの配置場所(メモリ上のアドレス)が入ります。
12~14行目は、メソッドを使用してインスタンスに値をセットしています。
ポイントは、インスタンスごとに保持するデータが異なる点です。
16~18行目は、メソッドを使用してインスタンスの値を表示しています。
構文は、変数.メソッド名です。
インスタンスを1つのみ生成したい場合は、シングルトンというデザインパターンを使用します。 C# シングルトン(Singleton)のサンプル |
静的変数と静的メソッド(クラスからインスタンスを生成しないで利用)
クラスからインスタンスを生成しないで利用する場合はstatic修飾子を追加します。
new演算子がありませんが使用できます。
using System;
namespace Project1
{
public static class TestStatic
{
public static int CNT = 100;
public static void Print()
{
Console.WriteLine("テスト");
}
}
class Test1
{
static void Main()
{
Console.WriteLine(TestStatic.CNT);//100
TestStatic.Print(); //テスト
}
}
}
5~12行目は、TestStaticというクラスです。
7行目は、変数の前にstaticがついています。
static変数やクラスフィールドや静的変数(静的フィールド)とも呼ばれます。
8行目は、メソッドの前にstaticがついています。
staticメソッドやクラスメソッドや静的メソッドとも呼ばれます。
17行目は、newでインスタンスを生成していませんがTestStaticクラスの変数を参照できます。
構文はクラス名.変数名です。
18行目もnewでインスタンスを生成していませんがClass1クラスのメソッドを実行できます。
構文はクラス名.メソッド名です。
17,18行目とも参照先にstaticが付いていない場合は、コンパイルエラーになります。
オブジェクトとインスタンスの使い分け
ここでは以下のように使用しています。
インスタンス | クラスから実体化したもの |
オブジェクト | 設計工程での用語。インスタンスとニアリーイコール。 |
関連の記事