Sono a conoscenza della tecnica per gestire IDisposable in modo tradizionale. Di ', in OnStop() di servizio di Windows chiudo messaggio coda di cliente:Smaltimento impostando su null?
if (client != null)
{
client.Dispose();
}
Per la prima volta oggi ho visto un ragazzo a farlo in questo modo:
using (client)
{
client = null;
}
che cosa è esattamente accadendo all'interno del suo "usare" o ha a disposizione correttamente?
BTW, una cosa penso che migliorerebbe l'usabilità di "using" sarebbe la possibilità di impostare esplicitamente la "variabile shadow" su null, in modo che l'oggetto non venisse smaltito, oppure avere una versione di "using" che disporrebbe solo in caso di colpa. Un costruttore, ad esempio, potrebbe quindi "utilizzare" i campi dell'oggetto da costruire, e quindi decidere di "mantenerli" appena prima che ritornasse. È possibile utilizzare i blocchi try/finally invece di "using", ma sono più prolissi e meno chiari. – supercat
@supercat IMO che lo scenario è già piuttosto complesso - meglio essere espliciti al riguardo e capire cosa sta succedendo (cioè sono contento di 'try' /' finally' there) –
Ho appena guardato di nuovo il codice e penso Ho capito lo scopo - se "client" è un campo o una proprietà, la sua vita potrebbe probabilmente non essere confinata in un blocco "using". In alcuni casi, potrebbe essere necessario eliminare un campo o una proprietà che contiene un riferimento all'oggetto prima di chiamare Smaltisci su di esso. Il codice "using" mostrato qui sarebbe più conciso rispetto alla creazione esplicita di una variabile temporanea, anche se un approccio ancora migliore sarebbe utilizzare una routine "Zap" per tale scopo. – supercat