Question

MISE À JOUR Si totalement tiré un moment outil. Je voulais vraiment dire par référence contre Out / Ref. Tout ce qui dit "ref", je veux dire par référence comme dans

SomeMethod (Object someObject)

Versus

SomeMethod (out someObject)

Désolé. Ne voulez simplement pas changer le code pour que les réponses aient déjà un sens.

Autant que je sache, contrairement à ref où il "copie" le pointeur et crée un nouvel espace sur la pile pour utiliser ce pointeur, mais ne changera pas le pointeur:

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 copie le pointeur et peut manipuler où il pointe:

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
}

C'est bien et dandy avec des objets, mais qu'en est-il des types de valeur, vu qu'ils n'ont rien à dire d'être uniquement sur la pile?

Était-ce utile?

La solution

Ce n'est pas parce que la variable réside dans la pile (s'il s'agit d'une variable locale) que vous ne pouvez pas créer de pointeur dessus, ce qui est également le cas des types de référence.

Le pointeur dans RefMethod est sur le "externe" variable - et la variable elle-même vit sur la pile car il s'agit d'une variable locale non capturée.

Comme Leppie l’a dit, ref et out sont identiques à l’exception des règles d’assignation définitive. En fait, la seule différence en IL est un attribut appliqué aux paramètres out.

Voir mon article sur la transmission de paramètres pour plus de détails sur les références / sorties en général .

Autres conseils

ref et out est exactement le même, pour autant que je sache, à l'exception du fait qu'un paramètre out ne peut pas être initialisé. Par conséquent, les deux vont sur la pile.

En fait, utiliser les types ref ou out on Reference crée également un pointeur ... non pas sur l'objet mais sur la référence à l'objet! Donc, ce serait une sorte de

RefMethod(SomeThing **inner)
{
}

en C ++, alors que ce serait avec les types valeur

RefMethod2(int *inner)
{
}

pour les types de valeur.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top