Recentemente ho attivato regole aggiuntive per l'analisi del codice. Con mia sorpresa ho visto una violazione in un luogo che consideravo sempre come la migliore pratica. Se ho due monouso annidati sto mettendo due dichiarazioni utilizzando in questo modo:Nidificato utilizzando istruzioni e codice Microsoft Analisi
using (StringReader strReader = new StringReader(xmlString))
using (XmlReader xmlReader = XmlReader.Create(strReader))
{
result.ReadXml(xmlReader);
}
Ciò corrisponde anche alla Q alta nominale & Un Nested using statements in C#
La violazione ottengo stati seguenti:
Warning 18 CA2202 : Microsoft.Usage : Object 'strReader' can be disposed more
than once in method '????'. To avoid generating a System.ObjectDisposedException
you should not call Dispose more than one time on an object.: Lines: ??
Quello che ho fatto è stato un tentativo intuitivo ed errore, pensando che la chiusura del flusso esterno probabilmente disporrà anche quella interna che ho risolto velocemente il mio codice in questo modo:
using (XmlReader xmlReader = XmlReader.Create(new StringReader(xmlString)))
{
result.ReadXml(xmlReader);
}
Hura! L'avviso è sparito. Ma, tada! Il nuovo si è verificato:
Warning 18 CA2000 : Microsoft.Reliability : In method '????????', object
'new StringReader(xmlString)' is not disposed along all exception paths. Call
System.IDisposable.Dispose on object 'new StringReader(xmlString)' before all
references to it are out of scope.
poi ho trovato una brutta soluzione:
{
StringReader strReader = null;
try
{
strReader = new StringReader(xmlString);
using (XmlReader xmlReader = XmlReader.Create(strReader))
{
strReader = null;
result.ReadXml(xmlReader);
}
}
finally
{
if (strReader != null) strReader.Dispose();
}
}
Come ultimo passaggio (come ogni buon programmatore) Ho guardato in pagina di aiuto per CA2202 e con mia sorpresa esattamente la mia ultima soluzione UGLY è stata proposta per risolvere il problema?
Dopo aver provato {} finalmente usando il codice clutter molto! Per me l'nidificazione è molto più leggibile.
Domanda: C'è un modo migliore di fare le cose? Sto cercando una soluzione che sia intuitivamente comprensibile. Tutti quelli che vedranno quest'ultimo frammento saranno curiosi di ciò che sta accadendo.
Grazie in anticipo per le vostre risposte.
Domande come nel tuo P.S. probabilmente appartengono a MetaStackoverflow. In effetti, quella domanda potrebbe essere già stata posta e ha risposto lì. –
proposito ho provato anche seguente codice 'utilizzando (StringReader strReader = new StringReader (xmlString)) usando (xmlReader xmlReader = XmlReader.Create (strReader)) { strReader = null; result.ReadXml (xmlReader); } ' porta per compilare errore Errore Non è possibile assegnare a 'strReader' perché è un 'utilizzando variabile' –