クラス宣言はテンプレート、つまり設計図のようなものです。これを元にいくつでもクラスインスタンスを作成できます。
インスタンスメンバー:クラスの各インスタンスは独立したオブジェクトで、専用のデータメンバーを保有し、同じクラスの他インスタンスと干渉しません。インスタンスに紐付いているため、これらをインスタンスメンバーと呼びます。
静的メンバー:既定の種類はインスタンスメンバーです。静的メンバーを定義することも可能で、静的メンバーはインスタンスではなくクラス自身に属します。詳しくは後の講義で解説します。
実例を見て確認しましょう
class Program
{
static void Main(string[] args)
{
Factory factoryFox = new Factory();
Robot robot1 = new Robot();
Robot robot2 = new Robot();
Robot robot3 = new Robot();
}
}
class Factory
{
}
class Robot
{
public string name;
public void SayHello()
{
Console.WriteLine($"Hello everyone my name is {name},I come from Foxdevelop.com");
}
}Code language: JavaScript (javascript)
このコードにはFactoryとRobot、二つのクラスが定義されています。Robotにはメソッド一つとフィールドnameが存在し、Factoryにはnameフィールドがありません。
メイン関数内でFactoryインスタンスを一つ、Robotインスタンスを三つ生成しています。
メモリ上の配置構造を確認します。

robot1、robot2、robot3の3台のロボットはそれぞれ独立したnameを持ち、メモリ上の領域が分かれていて互いに影響しません。robot1の値を変更してもrobot2には反映されません。
static void Main(string[] args)
{
Factory factoryFox = new Factory();
Robot robot1 = new Robot();
Robot robot2 = new Robot();
Robot robot3 = new Robot();
robot1.name = "Tom"; //各nameは独立、相互に影響なし
robot2.name = "Jack";
robot3.name = "Smith";
}Code language: JavaScript (javascript)
メソッドメンバーは本体が一つだけ存在
先述したnameは各インスタンスごとに独立し、一方の値を変更しても他方に影響を与えません。クラスにはフィールド以外にメソッドメンバーも定義できます。
クラス内のメソッドは実体が一つだけ用意され、複数のインスタンスで共有されるのでしょうか。
メソッドのコード本体:プログラム全体で一つだけ存在し、すべてのインスタンスが共有
クラスがコンパイルされると、メソッドの機械語命令はメソッドテーブル(Method Table)に格納され、型自身に属します。ヒープ上の同クラスインスタンスはすべてこのコードを共有し、オブジェクトごとに複製されません。
RobotクラスのSayHelloを例に挙げます
class Robot
{
public string name;
public void SayHello()
{
Console.WriteLine($"Hello everyone my name is {name},I come from Foxdevelop.com");
}
}Code language: PHP (php)
メモリ領域にはヒープとスタック以外にも区分が存在し、メソッドはMethod Tableに配置されます。
クラスの関数はメソッドテーブルに保管されます。呼び出し時にテーブル内の処理を実行するため、インスタンス間で共有される仕組みです。
static void Main(string[] args)
{
Factory factoryFox = new Factory();
Robot robot1 = new Robot();
Robot robot2 = new Robot();
Robot robot3 = new Robot();
robot1.name = "Tom";
robot2.name = "Jack";
robot3.name = "Smith";
robot1.SayHello();
robot2.SayHello();
robot3.SayHello();
}Code language: JavaScript (javascript)
上記コードの3回のSayHello呼び出しは同一の関数を実行しています。ただしメソッド内のローカル変数は独立し、フィールド参照の結果は呼び出し元のインスタンスに依存します。
public void SayHello()
{
Console.WriteLine($"Hello everyone my name is {name},I come from Foxdevelop.com");
}Code language: JavaScript (javascript)
robot1からSayHelloを呼べばnameはTom、robot2から呼べばnameはJackとなります。
インスタンスメンバー