Между тем, читая в Интернете, я узнал, что статические переменные всегда имеют один и тот же адрес памяти. Поэтому при компиляции программы компилятор решает, какой адрес памяти назначить статическим переменным. Чтение заставило меня задуматься о том, что происходит, когда вы это делаете:
class Foo {}
class Program
{
public static Foo someStaticVar;
static void Main(string[] args)
{
Foo localVariable = new Foo();
int x = 4;
someStaticVar = localVariable; // is someStaticVariable still will have the same address?
}
// variable x will be pushed of the stack
// localVariable will be pushed of the stack
// what happens then with someStatic var?
}
Я также узнал, что при объявлении переменных внутри метода они будут помещаться в стек при создании и извлекаться из стека при возврате метода. Если все это так, то someStaticVar должен исчезнуть, но это не так.
Я уверен, что я что-то неправильно понял. Или, может быть, в строке someStaticVar = localVariable;
выполняется глубокая копия этого объекта, но я сомневаюсь, потому что в интеренете много вопросов о том, как сделать глубокую копию объекта, и они сильно отличаются от этого подхода.