Объявление класса — это по сути шаблон или чертеж. На его основе можно создавать любое количество экземпляров класса.
Члены экземпляра: Каждый экземпляр класса является независимым объектом с собственным набором данных, он не влияет на другие экземпляры того же класса. Такие члены называются членами экземпляра, так как они привязаны к объектам-экземплярам класса.
Статические члены: По умолчанию используются члены экземпляра. Также можно объявлять статические члены, они принадлежат самому классу, а не его экземплярам. Мы разберем это в следующих уроках.
Рассмотрим пример
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: C# (cs)
В примере есть два класса: Factory и Robot. В классе Robot есть один метод и одно поле name, у класса Factory поля name нет.
В основной функции создается один экземпляр Factory и три экземпляра Robot.
Давайте посмотрим, как данные хранятся в памяти.

Три робота robot1, robot2 и robot3 имеют собственные значения 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: C# (cs)
Только одна копия членов-функций
Как мы видели на примере name, каждый экземпляр хранит независимое значение. Изменение поля одного экземпляра не затрагивает другие. Помимо полей в классах также существуют члены-функции.
Существует ли для каждой функции внутри класса только одна копия, разделяемая всеми экземплярами?
Тело кода функции (метода): существует в единственном экземпляре для всей программы и разделяется всеми экземплярами
После компиляции машинные инструкции методов сохраняются в таблице методов (Method Table), которая принадлежит самому типу. Все экземпляры этого класса в куче используют один общий код, для каждого объекта копия функции не создается.
Возьмем метод SayHello из класса Robot
class Robot
{
public string name;
public void SayHello()
{
Console.WriteLine($"Hello everyone my name is {name},I come from Foxdevelop.com");
}
}Code language: C# (cs)
Память состоит не только из кучи и стека, есть и другие области. Методы хранятся в 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: C# (cs)
В приведенном коде все три вызова SayHello обращаются к одной и той же функции. При этом локальные переменные внутри метода независимы, а доступ к полям зависит от экземпляра, вызвавшего метод.
public void SayHello()
{
Console.WriteLine($"Hello everyone my name is {name},I come from Foxdevelop.com");
}Code language: C# (cs)
Когда robot1 вызывает SayHello, переменная name равна Tom; при вызове из robot2 name принимает значение Jack и так далее.
Члены экземпляра