Отслеживание адреса при передаче параметров по ссылке в c # - PullRequest
0 голосов
/ 01 июня 2018

Что помещается в стек, когда объект вызывается по ссылке?Рассмотрим этот код:

using System;
class em
{
   public int i=0;
}
class program
{
    public void method(int a, ref int b, em c, ref em d)
    {
         //implementation
    }
    static public void Main()
    {
         int i;
         int j;
         em e1 = new em();
         em e2 = new em();
         i=9;
         j=10;
         Program p=new Program();
         p.method(i,ref j,e1,ref e2);
    }
}

Когда передается e1, ссылка на объект передается в качестве аргумента, но в этом коде, когда e2 передается по ссылке, что помещается в стек, т.е. что передаетсякак аргумент к методу?И что передается, когда тот же объект возвращается с помощью ref.

Ответы [ 2 ]

0 голосов
/ 01 июня 2018

Классы являются ссылочными типами, и когда вы передаете экземпляр в качестве параметра, указатель (ссылка) объекта копируется.Но когда вы используете ключевое слово ref, указатель передается сам, а любые изменения выполняются непосредственно по исходной ссылке.Смотрите код ниже:

class program
{
    static public void method(int a, ref int b, em c, ref em d)
    {
        c = null; // c is copy of e1
        d = null; // d is e2
    }
    static public void Main()
    {
        int i;
        int j;
        em e1 = new em(); // e1 is pointer to 'new em()' location at memory
        em e2 = new em(); // e2 is pointer to 'new em()' location at memory
        i = 9;
        j = 10;
        method(i, ref j, e1, ref e2);
        // e1 is intact
        // e2 is null
    }
}
0 голосов
/ 01 июня 2018

Данные существуют в куче, поскольку e2 не является типом значения, поэтому просто ссылка на адрес кучи хранится в стеке .Таким образом, вы не передаете e2, просто ссылку на e2.

Эта является хорошей ссылкой, показывающей различия между типами значений и ссылками и где они хранятся.

...