Существует 3 различных способа выделения памяти.
Статическая:
Они связаны и распределяются во время компиляции. Глобальные статические переменные, например.
Динамический стек:
Они связаны во время выполнения и помещаются в стек. Например, локальная переменная в вызове функции.
Динамическая куча:
Теперь динамическая куча также имеет несколько различных «подкатегорий», таких как неявные и явные, но я не буду вдаваться в подробности.
Когда вы объявляете
private MyClass item; // here?
ссылка на MyClass помещается в стек. Это только ссылка и ничего более. В этот момент его значение равно нулю.
public void MyMethod()
{
item = new MyClass(); // or here?
}
Именно в этот момент память явно выделяется в куче, вызывая 'new MyClass ()', и затем item ссылается на нее.
Так что на самом деле у вас есть 2 переменные после вызова MyMethod. Тип ссылки именованный элемент и безымянная переменная в куче, на которую ссылается элемент, который имеет тип MyClass.