2016-06-29 3 views
0

Почему этот код печати «7» Пытаясь понять, как стека и кучи выглядит и как делает это выглядит в распределении памятиПочему этот код печати «7»

public static void Main() 
{ 
    Cls a = new Cls(); 
    a.v = 3; 
    Func(a); 
    Console.WriteLine(a.v); 
} 

class Cls 
{ 
    public int v; 
} 

static void Func(Cls a) 
{ 
    a.v = 7; 
    a = new Cls(); 
    a.v = 2; 
} 

Если вы можете прикрепить scatch из стека и кучи с памятью, он действительно оценит

+0

Потому что вы устанавливаете 'a.v = 7'. Следующее присваивание 'a.v = 2' находится на полностью отдельной« Cls », никак не связанной с первой. –

+0

Что вы, вероятно, путаете, состоит в том, что переменные и объекты являются двумя отдельными понятиями. Делая 'a = новый Cls()', вы не перезаписываете оригинальный объект, на который указывал 'a'. Вы перенаправляете 'a' на другой объект. –

+0

Отметьте используемым языком (Java?) – Bentoy13

ответ

0

Вы передаёте указатель к первому Cls экземпляр. Второй, созданный внутри вашей функции, является совершенно другим объектом.

Другими словами, вы печатаете значение свойства от первого объекта, один, на который указывает в Main().

Когда вы повторно назначая в переменную в новый объект внутри вашей функции, в внутри Main() прежнему указывает на исходный объект.

Я не уверен, что объясняю это очень хорошо ... :) Или, может быть, я даже не понимаю вопроса?

0
static void Func(Cls a) 
{ 
    a.v = 7; <----- This is modifying the Cls you create in Main function 
    a = new Cls(); 
    a.v = 2; <----- This is a new and locally referenced Cls whose value is neither returned to the main function nor is a global variable 
} 
Смежные вопросы