Вопрос о параметре C # Out: Как Out обрабатывает типы значений? - PullRequest
4 голосов
/ 12 января 2009

ОБНОВЛЕНИЕ Итак, полностью вытащил момент инструмента. Я действительно имел в виду под ссылкой против Out / Ref. Все, что говорит 'ref', я действительно имел в виду под ссылкой, как в

SomeMethod (Объект someObject)

Versus

SomeMethod (из SomeObject)

К сожалению. Просто не хочу менять код, поэтому ответы уже имеют смысл.

Насколько я понимаю, в отличие от 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
}

С объектами все в порядке, но как насчет типов значений, поскольку им нечего указывать на то, что они находятся только в стеке?

Ответы [ 3 ]

9 голосов
/ 12 января 2009

То, что переменная живет в стеке (если это локальная переменная), не означает, что вы не можете создать указатель на нее - и действительно, это также относится и к ссылочным типам.

Указатель в RefMethod указывает на «внешнюю» переменную, а сама переменная живет в стеке, так как является не захваченной локальной переменной.

Как сказал Леппи, ref и out идентичны, за исключением правил по определенному присваиванию - фактически, единственным отличием в IL является атрибут, применяемый к параметрам out.

См. мою статью о передаче параметров для более подробной информации о ref / out в целом.

3 голосов
/ 12 января 2009
Насколько я знаю,

ref и out абсолютно одинаковы, за исключением того, что параметр out не может быть инициализирован. Следовательно, оба идут в стек.

1 голос
/ 12 января 2009

На самом деле использование ref или out для ссылочных типов также создает указатель ... не на объект, а на ссылку на объект! Так что это было бы что-то вроде

RefMethod(SomeThing **inner)
{
}

в C ++, тогда как для типов значений это будет

RefMethod2(int *inner)
{
}

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

...