Вопрос о параметре C# Out:Как Out обрабатывает типы значений?

StackOverflow https://stackoverflow.com/questions/436759

  •  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)
{
}

для типов значений.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top