Ostatnio włączyłem dodatkowe zasady analizy kodu. Ku mojemu zaskoczeniu zobaczyłem naruszenie w miejscu, które zawsze uważałem za najlepszą praktykę. Jeśli mam dwie zagnieżdżone jednorazowych kładę dwa użyciu instrukcji tak:Zagnieżdżone przy użyciu instrukcji i analiz Microsoft Code
using (StringReader strReader = new StringReader(xmlString))
using (XmlReader xmlReader = XmlReader.Create(strReader))
{
result.ReadXml(xmlReader);
}
ten odpowiada również wysokiej znamionowej Q & A Nested using statements in C#
naruszenie dostaję stany następujące:
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: ??
To, co zrobiłem, to intuicyjna próba i błąd, myśląc, że zamknięcie zewnętrznego strumienia prawdopodobnie również pozbędzie się wewnętrznego Szybko naprawiłem mój kod w ten sposób:
using (XmlReader xmlReader = XmlReader.Create(new StringReader(xmlString)))
{
result.ReadXml(xmlReader);
}
Hura! Ostrzeżenie znikło. Ale, tada! Nowa jeden wystąpiły:
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.
Potem znalazłem bardzo brzydki rozwiązanie:
{
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();
}
}
W ostatnim kroku (jak każdy dobry programista) zajrzałem do strony pomocy dla CA2202 i dokładnie mojego zaskoczenia moje ostatnie rozwiązanie UGLY zostało zaproponowane w celu rozwiązania problemu?
Posiadanie try {} w końcu przy użyciu zaśmieca kod bardzo! Dla mnie jest zagnieżdżony przy użyciu znacznie bardziej czytelny.
Pytanie: Czy istnieje lepszy sposób robienia rzeczy? Szukam rozwiązania, które będzie intuicyjnie zrozumiałe. Każdy, kto zobaczy ten ostatni fragment, będzie ciekawostką tego, co się dzieje.
Z góry dziękuję za odpowiedzi.
Pytania takie jak w przypadku P.S. prawdopodobnie należą do MetaStackoverflow. W rzeczywistości to pytanie mogło już zostać zadane i tam udzielono odpowiedzi. –
przez 'stosując (StringReader strReader = nowy StringReader (xmlString)) sposób, że próbuje również następnego kodu stosując (XmlReader XMLReader = XmlReader.Create (strReader)) { strReader = NULL; result.ReadXml (xmlReader); } ' prowadzi do kompilacji error nie można przypisać do 'strReader', ponieważ jest to 'za pomocą zmiennej' –