Una domanda (diversa?) Su come viene applicato l'ambito variabile in relazione alle chiusure. Ecco un esempio minimo:Apertura variabile chiusura C#
public class Foo
{
public string name;
public Foo(string name)
{
this.name = name;
}
}
public class Program
{
static Action getAction(Foo obj)
{
return() => Console.WriteLine(obj.name);
}
static void Main(string[] args)
{
Foo obj1 = new Foo("x1");
Action a = getAction(obj1);
obj1 = new Foo("x2");
a();
}
}
Questa stampa x1
. Può essere spiegato come:
getAction
restituisce una funzione anonima che ha una chiusura che racchiude la variabile obj
. obj
ha lo stesso riferimento valore come obj1
ma la sua relazione con obj1
termina lì poiché la chiusura include solo obj
. In altre parole, qualsiasi valore assunto da obj1
in seguito non influisce sulla chiusura. Pertanto, ogni volta che viene richiamato a
(ad esempio, a
viene inviato a un'altra funzione), verrà sempre stampato x1
.
Ora le mie domande sono:
- è la spiegazione di cui sopra è corretto?
- Non ho in mente uno scenario specifico ma cosa succederebbe se volessimo che il programma stampasse
x2
(ad esempio chiusura per racchiudere un ambito esterno)? Potrebbe essere fatto (o non ha senso nemmeno tentare)?
La tua spiegazione sembra ovvia perché hai due diverse variabili che inizialmente si riferiscono allo stesso oggetto ma poi assegni un oggetto diverso a uno di loro, che non ha alcun effetto sull'altro. Immagino che dichiarare il tuo parametro 'obj' come' ref' possa indirizzare la tua seconda domanda, ma non ne sono sicuro al 100%. – jmcilhinney
@jmcilhinney Non è consentito acquisire il parametro 'ref' in chiusura. – PetSerAl
@PetSerAl, immagino che potrebbe essere quello di evitare esplicitamente la situazione descritta qui, o almeno di evitare l'apparenza che potrebbe essere possibile. – jmcilhinney