Странное поведение ссылки (тот же адрес памяти в int) - PullRequest
2 голосов
/ 27 февраля 2011

Hy!Я изучаю типы ссылок сейчас, и я не понимаю, почему у x такой же адрес памяти, как у?Разве они не должны иметь разные адреса?

class Program
{
    static void Main(string[] args)
    {
        int x = 10; // int -> stack
        int y = x; // assigning the value of num to mun. 
        DisplayMemAddress(x);
        DisplayMemAddress(y);
        Console.ReadLine();
    }
    static unsafe void DisplayMemAddress(int x)
    {
        int* ptr = &x;
        Console.WriteLine("0x" + new IntPtr(ptr).ToString("x"));
    }
}

1 Ответ

5 голосов
/ 27 февраля 2011

x и y в Main являются независимыми переменными.Они могут хранить разные значения.Они не могут быть по одному адресу.Обратите внимание, что они значения типа переменные, хотя в этом коде вы вообще не узнаете о ссылочных типах, поскольку он не использует никаких ссылочных типов (кроме * 1008).*, Program и Console).

Однако ваш код этого не показывает - он показывает адрес параметра в DisplayMemAddress, который совершенно другой.Значения x и y передаются значением в метод.Было бы полезно, если бы вы переименовали параметр в вашем методе DisplayMemAddress на z:

static unsafe void DisplayMemAddress(int z)
{
    int* ptr = &z;
    Console.WriteLine("0x" + new IntPtr(ptr).ToString("x"));
}

Теперь об этом проще говорить.Вы отображаете адрес z, а не x или y.Этот адрес будет в стеке (как деталь реализации), и, поскольку стек имеет одинаковую высоту в обоих вызовах, он покажет одно и то же значение.Теперь, если вы измените метод для использования передачи по ссылке, вы на самом деле увидите адрес x и y:

class Program
{
    static void Main(string[] args)
    {
        int x = 10; // int -> stack
        int y = x; // assigning the value of num to mun. 
        DisplayMemAddress(ref x);
        DisplayMemAddress(ref y);
        Console.ReadLine();
    }

    static unsafe void DisplayMemAddress(ref int z)
    {
        fixed (int* ptr = &z)
        {
            Console.WriteLine("0x" + new IntPtr(ptr).ToString("x"));
        }
    }
}

Честно говоря, показываяадреса - не лучший способ узнать о ссылочных типах, типах значений и передаче параметров IMO.

У меня есть пара статей, которые могут вам пригодиться:

...