Глупое непонимание значимых и ссылочных типов, а возможно и области видимости C#

Я уже почти до наследования дошёл, но всё равно не понимаю этого. У нас есть поле i, значение которого должно увеличиваться при каждом создании объекта класса Person на единицу. Как это правильно сделать?

class Person
{
    private int i = 0;
    public Person()
    {
        // Тело конструктора //

        Console.WriteLine("Был создан конструктор #{0}!", i);
        i += 1;
    }
}

~

class Program
{
    static void Main(string[] args)
    {
        Person person0 = new Person();
        Person person1 = new Person();
        Person person2 = new Person();
        Person person3 = new Person();
        Person person4 = new Person();
        Person person5 = new Person();

    }
}

Я понял, что переменная изменяется лишь внутри конструктора, но её новое значение не присваивается в поле класса. Использовать в параметрах ref не то, что мне нужно. Мне кажется, что в теле конструктора создаётся новая переменная, которая просто копирует значение поля i (Ведь int - значимый тип данных), а потом переменная i просто удаляется сборщиком и значение поля никак при это не меняется, но тогда я попробовал передать туда ссылочный тип - string

    private string s = "I";
    public Person()
    {
        // Тело конструктора //
        
        Console.WriteLine("Был создан конструктор не по умолчанию {0}!", s);
        s += "I";
    }

Но это абсолютно не повлияло на результат:

Был создан конструктор не по умолчанию I!
Был создан конструктор не по умолчанию I!
Был создан конструктор не по умолчанию I!
Был создан конструктор не по умолчанию I!
Был создан конструктор не по умолчанию I!
Был создан конструктор не по умолчанию I!

Ответы (1 шт):

Автор решения: Igor

Eё новое значение присваивается в поле класса, только у каждого объекта свой экземпляр i.

private static int i = 0;
        ^^^^^^

А так будет один экземпляр i на все объекты Person.

→ Ссылка