Vous ne pouvez pas stocker une référence à une variable dans un champ ou d'un tableau. Le CLR exige qu'une référence à une variable dans (1) un paramètre formel, (2) un local, ou (3) le type de retour d'une méthode. C# prend en charge (1), mais pas les deux autres.
(APARTÉ: Il est possible en C# pour soutenir les deux autres; en fait, j'ai écrit un prototype de compilateur de ne mettre en œuvre ces fonctionnalités. Il est assez soignée. (Voir http://ericlippert.com/2011/06/23/ref-returns-and-ref-locals/ pour plus de détails.) Bien sûr, on doit écrire un algorithme qui vérifie qu'aucune ref local pourraient éventuellement être référence à un local qui était en maintenant détruite cadre de la pile, qui est un peu délicat, mais sa faisable. Peut-être que nous allons appuyer ce dans un futur hypothétique version de la langue.)
Toutefois, vous pouvez créer une variable avons arbitrairement longue durée de vie, en le mettant dans un champ ou d'un tableau. Si ce que vous avez besoin est une "référence" dans le sens de "j'ai besoin de stocker un alias d'une variable arbitraire", alors, non. Mais si ce que vous avez besoin est une référence dans le sens de "j'ai besoin d'une magie jeton qui me permet de lire et d'écrire dans une variable particulière", alors il suffit d'utiliser un délégué, ou une paire de délégués.
sealed class Ref<T>
{
private Func<T> getter;
private Action<T> setter;
public Ref(Func<T> getter, Action<T> setter)
{
this.getter = getter;
this.setter = setter;
}
public T Value
{
get { return getter(); }
set { setter(value); }
}
}
...
Ref<string> M()
{
string x = "hello";
Ref<string> rx = new Ref<string>(()=>x, v=>{x=v;});
rx.Value = "goodbye";
Console.WriteLine(x); // goodbye
return rx;
}
Que l'extérieur de la variable locale x va rester en vie au moins jusqu'à ce que le rx est récupérée.