Члены экземпляра

Объявление класса — это по сути шаблон или чертеж. На его основе можно создавать любое количество экземпляров класса.

Члены экземпляра: Каждый экземпляр класса является независимым объектом с собственным набором данных, он не влияет на другие экземпляры того же класса. Такие члены называются членами экземпляра, так как они привязаны к объектам-экземплярам класса.

Статические члены: По умолчанию используются члены экземпляра. Также можно объявлять статические члены, они принадлежат самому классу, а не его экземплярам. Мы разберем это в следующих уроках.

Рассмотрим пример

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 и так далее.

Члены экземпляра

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *