2009-10-11 12 views
10

Chciałbym nauczyć się różnicy między XMLReader.Create i new XMLTextReader(), aby odczytać XML. Dlaczego wybrałbym jeden nad drugim?
Czy występuje różnica w wydajności?Różnica między XMLReader.Create() i nowym XMLTextReader()

Wiem, że XMLReader jest typem abstrakcyjnym dla XMLTextReader, przynajmniej to jest to, co czytałem wcześniej, ale widziałem gdzieś ludzi sugerowanych przy użyciu metod XMLReader.Create() zamiast nowej instancji XMLReader().

Z góry dziękuję ...

Z poważaniem.

Odpowiedz

13

XmlReader.Create pozwala określić XmlReaderSettings, czego nie robi żaden z konstruktorów XmlTextReader.

+0

Dzięki, bardzo mi to pomogło. – Tarik

+0

To nie wydaje się być jedyną różnicą, właśnie wpadłem na problem, w którym żadne ustawienia nie mogły spowodować pracy XmlReader.Create, ale XmlTextReader działa dobrze: http://stackoverflow.com/questions/34257204/different-behaviour- between-new-xmltextreader-and-xmlreader-create –

1

Aby uzyskać ogólną odpowiedź na pytanie, dlaczego ten rodzaj kodu w ogóle się pojawia, warto przyjrzeć się Factory Method Pattern. Używanie metody fabrycznej i abstrakcyjnej klasy/interfejsu pozwala pisać bardziej ogólny kod, nie przywiązując się do konkretnej implementacji. Może to pomóc w łatwym korzystaniu z kodu w nowych funkcjach lub w różnych sytuacjach.

+0

Dzięki, nie wiedziałem o tym. – Tarik

+0

* sarkazm na * O tak, i sprawia radość znajdowanie nietrywialnych błędów w wielu środowiskach. –

+1

Poważnie. tylko słowo ostrzeżenia: Wzór Fabryki może szybko stać się złym i włączyć ich mistrza. Po pierwsze, natychmiast tracisz bezpieczeństwo podczas kompilacji. Po drugie, utrzymywanie spójności w wielu wersjach może stać się bardzo bolesne. Widziałem przypadki (niektóre z nich moje ;-)), gdzie wzór fabryczny stał się koniecznością z powodu poważnych wad konstrukcyjnych w systemie. Nie zrozum mnie źle, jedyne, co mówię, to to, że w niektórych sytuacjach mogą być najlepszym sposobem na ukrycie czegoś, ale w innych po prostu chcesz wiedzieć :-) –

3

odpowiedź Microsoftu jest po prostu:

Chociaż Microsoft .NET Framework zawiera klasę XmlTextWriter, która jest implementacją klasy XmlWriter w wydaniu 2.0, zaleca się użycie metody Create, aby utworzyć nowy Obiekty XmlWriter. Metoda Create umożliwia określenie funkcji do obsługi utworzonego obiektu XmlWriter, a także pozwala w pełni wykorzystać nowe funkcje wprowadzone w wydaniu 2.0.

ale odpowiedź pomija najważniejszą różnicę:

Jeżeli nazywamy „nowy XmlTextReader” zostanie ustawiony w trybie „v1compat”, co spowoduje, że mają bardzo złe strumieniowego zachowanie w pewnych przypadkach potencjalnie prowadząc do OutOfMemoryExceptions! Zobacz Why is my new XmlTextReader(stream) reading in many megabytes into memory rather than streaming properly? po więcej informacji na ten temat.

REKOMENDACJA: Jeśli naprawdę nie potrzebujesz zachowania środowiska .NET 1.1, NIGDY nie powołaj się "nowy XmlTextReader", zamiast tego zawsze wywołaj "XmlReader.Create".

+0

Czy istnieje sposób umieszczenia XmlReader w "v1compat "tryb? –

Powiązane problemy