Я программист на Java. У меня мало знаний о C#. Но из blogs, который я прочитал, Java поддерживает только pass-by-value-of-reference, тогда как в C# по умолчанию используется значение pass-by-value-of-reference, но программист может использовать pass по ссылке, если это необходимо.Как работает метод подкачки на C# на уровне памяти?
Я понял, как работает функция свопинга. Я думаю, что очень важно понять эту концепцию, поскольку она очень важна для концепций программирования.
В C#:
public static void Main()
{
String ONE = "one"; //1
ChangeString(ONE); //2
Console.WriteLine(ONE); //3
String ONE = "ONE"; //4
ChangeString(ref ONE); //5
Console.WriteLine(ONE); //6
}
private static void ChangeString(String word)
{
word = "TWO";
}
private static void SeedCounter(ref String word)
{
word = "TWO";
}
Шаг 1: Строка объекта со значением
one
создается на куче, и адрес его местоположения возвращаемые хранится в переменнойONE
. Runtime Environment выделяет кусок памяти в куче и возвращает указатель на начало этого блока памяти. Эта переменнаяONE
хранится в стеке, который является ссылочным указателем на местоположение фактического объекта в памятиЭтап 2: Вызывается метод
changeString
. Копии указателя (или расположения адреса памяти) назначаются переменному слову. Эта переменная является локальной для метода, которая означает, что когда вызов метода заканчивается, он удаляется из фрейма стека и выходит из области видимости для сбора мусора. В вызове метода переменное слово переназначается, чтобы указать на новое место, гдеTWO
объект находится в памяти. Метод возвращаетШаг 3: Печать на консоли следует напечатать
ONE
, поскольку то, что было изменено в предыдущем шаге только локальная переменнаяШаг 4: Переменный один переназначен, чтобы указать на ячейку памяти, где объект
ONE
проживает.Этап 5: метод
changeString
называется. На этот раз передается ссылка наONE
. что это означает, что переменная word локального метода является псевдоним переменной переменной в основной области. Итак, нет копия справок делается. Следовательно, это эквивалентно при мысли, что одна и та же переменная передается вызову метода. Метод переназначает переменную, указывающую на другую ячейку памяти, которая имеет место для храненияTWO
. Метод возвращаетШаг 6: Теперь переменная
one
на внешней сфере, то есть в основном методе изменяется методом вызова, и поэтому он печатаетTWO
.
В Java
, шаг 5 невозможно. То есть вы не можете pass by reference
.
Пожалуйста, исправьте, правильно ли описанный выше поток программирования?
Статьи я прочитал, here и here.
Не делайте таких предположений, как * "... создается на куче" *, компилятор может разложить его на кучу , стек или в любом месте .... Это просто подробная информация .... –
@ LB: Спасибо за указание. Я не знал, что компилятор выделяет его. В цитированной выше статье упоминается как куча. поэтому я просто предположил, что это правда –
Вы также можете прочитать эту [правду о типах значений] (http://blogs.msdn.com/b/ericlippert/archive/2010/09/30/the-truth-about -value-types.aspx) –