Выделение памяти в разделе Методы в C#. Net - PullRequest
0 голосов
/ 06 марта 2020

Я все еще учусь C#, и я испытываю трудности с пониманием распределения памяти в методах. Давайте представим ситуацию, когда я получил некоторый эталонный объект, и в методе, который я назначаю существующему объекту, что будет сделано в памяти?

Я обнаружил Дублируются ли методы экземпляра в памяти для каждого объекта? но мне не очень понятно, если я опишу. Любые другие ссылки будут очень благодарны.

public class ClassToBeAssigned : IClassToBeAssigned {}
public interface IClassToBeAssigned{}

public class AllocatingClass
{
  private ClassToBeAssigned testAssigment;

  // Just as example
  void Main()
  {
       // new allocation in memory
       testAssigment = new ClassToBeAssigned();
       Assign(testAssigment);
  }

  // create here copy of context by assigned
  void Assign(IClassToBeAssigned assigned)
  {
       // What will happend now if there are 4x method calls ?
       DoSomething(assigned);
       DoSomething(assigned);
       DoSomething(assigned);
       DoSomething(assigned);
  }
  void DoSomething(IClassToBeAssigned assignIt)
  {
       // What is happening here in memory allocation for that reference each call ?
       IClassToBeAssigned dealWithIt = assignIt;
  }
}

Я только немного запутался по поводу того, что там происходит, также я нашел много информации, но ничего для этой конкретной проблемы c.

Ответы [ 2 ]

0 голосов
/ 06 марта 2020

DoSomething выделит несколько байтов из стека для переменной dealWithIt, поэтому в зависимости от системы, которая будет 32 или 64-битной, она выделяет, поскольку dealWithIt является просто ссылкой.
Ссылка из assignIt будет затем скопировано в эту выделенную память, чтобы затем немедленно быть снова освобождено, так как метод завершен, и стек возвращается к предыдущему методу.

0 голосов
/ 06 марта 2020

Назначение ссылки не создает копию в C#. Вы создаете только новый экземпляр в Main, поэтому существует только один экземпляр ClassToBeAssigned.

Исключение составляют типы значений; они нуждаются в особой заботе. Если бы ClassToBeAssigned было struct, а не class, каждый вызов Assign(testAssignment); фактически создавал бы новый экземпляр, который является копией testAssignment. Обратите внимание, что даже в этом случае DoSomething(assignment); будет , а не приведет к новой копии. Если вы хотите больше узнать об этой топи c, читайте о боксе в C#.

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

...