Вопрос о параметре C# Out:Как Out обрабатывает типы значений?
-
22-07-2019 - |
Вопрос
ОБНОВЛЕНИЕ Итак, полностью вытащил инструментальный момент.Я действительно имел в виду ссылку, а не Out/Ref.Все, что говорит «ref», я на самом деле имел в виду ссылку, как в
SomeMethod (Объект someObject)
Против
SomeMethod (из некоторого объекта)
Извини.Просто не хочу менять код, чтобы ответы уже имели смысл.
Насколько я понимаю, в отличие от ref, где он «копирует» указатель и создает новое пространство в стеке для использования этого указателя, но не меняет указатель:
SomeMethod()
{
SomeThing outer = new SomeThing();
RefMethod(ref outer)
}
RefMethod(ref inner) //new space on stack created and uses same pointer as outer
{
inner.Hi = "There"; //updated the object being pointed to by outer
inner = new SomeThing();//Given a new pointer, no longer shares pointer with outer
//New object on the heap
}
Out копирует указатель и может манипулировать тем, куда он указывает:
SomeMethod()
{
SomeThing outer = new SomeThing();
RefMethod(out outer)
}
RefMethod(out inner) //same pointer shared
{
inner = new SomeThing();//pointer now points to new place on heap
//outer now points to new object
//Old object is orphaned if nothing else points to it
}
Это нормально и здорово с объектами, но как насчет типов значений, поскольку им нечего указывать на то, что они находятся только в стеке?
Решение
Тот факт, что переменная находится в стеке (если это локальная переменная), не означает, что вы не можете создать на нее указатель - и действительно, это относится и к ссылочным типам.
Указатель внутри RefMethod относится к «внешней» переменной, а сама переменная находится в стеке, поскольку является незахваченной локальной переменной.
Как сказал Леппи, ref и out идентичны, за исключением правил определенного присвоения — фактически, единственное различие в IL — это атрибут, применяемый к параметрам out.
Видеть моя статья о передаче параметров для более подробной информации о ref/out в целом.
Другие советы
Насколько мне известно, ref и out абсолютно одинаковы, за исключением того, что параметр out не может быть инициализирован.Следовательно, оба идут в стек.
На самом деле использование ref или out для ссылочных типов также создает указатель... не на объект, а на ссылку на объект!Так что это будет что-то вроде
RefMethod(SomeThing **inner)
{
}
в C++, а с типами значений это было бы
RefMethod2(int *inner)
{
}
для типов значений.