Здесь есть разные вещи:
- объекты живут в куче. Забудьте о них сейчас
- ссылки на объекты - это то, что хранится в
First
и секунде
- у вас есть две переменные в
Main
- у вас есть два параметра в
Swap
сейчас; важна разница между «ссылочным типом / ссылками» и «передачей по ссылке». Они совершенно не связаны .
в строке:
Swap(First, Second);
вы передаете значения двух переменных в Swap
. В этом случае значение из First
/ Second
является ссылкой на упакованный объект .
Next;
private static void Swap(object First, object Second)
{
object temp = First;
First = Second;
Second = temp;
}
Здесь вы меняете значение двух локальных параметров, но они полностью независимы от всего остального . Если мы хотим, чтобы вызывающий абонент увидел изменение в значениях (т.е. переназначение), нам нужно передать по ссылке :
private static void Swap(ref object First, ref object Second)
{
object temp = First;
First = Second;
Second = temp;
}
Теперь значение First
больше не является ссылкой на упакованный объект; это ссылка на ссылку на упакованный объект. У звонящего мы используем:
Swap(ref First,ref Second);
, что означает передать ссылку на переменную First
, а не передать значение переменной First
.
Обратите внимание, что я сказал, что вы можете забыть о том факте, что есть объект? Все выше точно так же, если мы использовали:
int x = 1, y = 2;
Swap(ref x, ref y);
void Swap(ref int a, ref int b) {
var tmp = a; a = b; b = tmp;
}
единственное отличие состоит в том, что значение из x
равно 1 и т. Д., А ref x
является ссылкой на переменную x. При передаче по ссылке ссылочный тип против значения-типа совершенно не имеет значения; единственная важная вещь - это понимание того, что вы передаете значение переменной по умолчанию, где значение переменной равно 1
(и т. д.), или "ссылка на объект ». В любом случае логика одинакова.