Atomisierte XName- und XNamespace-Objekte (LINQ to XML) (C#)Atomized XName and XNamespace Objects (LINQ to XML) (C#)

Die XName- und XNamespace-Objekte sind atomisiert. Dies bedeutet, dass sie auf dasselbe Objekt verweisen, wenn sie denselben qualifizierten Namen enthalten.XName and XNamespace objects are atomized; that is, if they contain the same qualified name, they refer to the same object. Dadurch wird die Leistung von Abfragen verbessert: Beim Vergleichen zweier atomisierter Namen auf Übereinstimmung muss die zugrunde liegende Intermediate Language nur ermitteln, ob die beiden Verweise auf dasselbe Objekt zeigen.This yields performance benefits for queries: When you compare two atomized names for equality, the underlying intermediate language only has to determine whether the two references point to the same object. Im zugrunde liegenden Code müssen keine zeitaufwändigen Zeichenfolgenvergleiche ausgeführt werden.The underlying code does not have to do string comparisons, which would be time consuming.

AtomisierungssemantikAtomization Semantics

Atomisierung bedeutet, dass zwei XName-Objekte dieselbe Instanz gemeinsam nutzen, wenn sie über denselben lokalen Namen verfügen und sich im selben Namespace befinden.Atomization means that if two XName objects have the same local name, and they are in the same namespace, they share the same instance. Dementsprechend nutzen zwei XNamespace-Objekte dieselbe Instanz gemeinsam, wenn sie über denselben Namespace-URI verfügen.In the same way, if two XNamespace objects have the same namespace URI, they share the same instance.

Damit eine Klasse atomisierte Objekte unterstützt, muss der Konstruktor für die Klasse privat sein, nicht öffentlich.For a class to enable atomized objects, the constructor for the class must be private, not public. Bei einem öffentlichen Konstruktor könnten Sie ein nicht atomisiertes Objekt erstellen.This is because if the constructor were public, you could create a non-atomized object. Die XName-Klasse und die XNamespace-Klasse implementieren einen impliziten Konvertierungsoperator, um eine Zeichenfolge in einen XName oder einen XNamespace zu konvertieren.The XName and XNamespace classes implement an implicit conversion operator to convert a string into an XName or XNamespace. Auf diese Weise können Sie eine Instanz dieser Objekte abrufen.This is how you get an instance of these objects. Sie können keine Instanz über einen Konstruktor abrufen, da Sie auf den Konstruktor nicht zugreifen können.You cannot get an instance by using a constructor, because the constructor is inaccessible.

Außerdem werden von XName und XNamespace Gleichheits- und Ungleichheitsoperatoren implementiert, mit denen Sie ermitteln können, ob die beiden verglichenen Objekte Verweise auf dieselbe Instanz darstellen.XName and XNamespace also implement the equality and inequality operators, to determine whether the two objects being compared are references to the same instance.

BeispielExample

Im folgenden Code werden mehrere XElement-Objekte erstellt, und es wird veranschaulicht, dass identische Namen dieselbe Instanz aufweisen.The following code creates some XElement objects and demonstrates that identical names share the same instance.

XElement r1 = new XElement("Root", "data1");  
XElement r2 = XElement.Parse("<Root>data2</Root>");  

if ((object)r1.Name == (object)r2.Name)  
    Console.WriteLine("r1 and r2 have names that refer to the same instance.");  
else  
    Console.WriteLine("Different");  

XName n = "Root";  

if ((object)n == (object)r1.Name)  
    Console.WriteLine("The name of r1 and the name in 'n' refer to the same instance.");  
else  
    Console.WriteLine("Different");  

Dieses Beispiel erzeugt die folgende Ausgabe:This example produces the following output:

r1 and r2 have names that refer to the same instance.  
The name of r1 and the name in 'n' refer to the same instance.  

Wie bereits erwähnt, besteht der Vorteil atomisierter Objekte darin, dass beim Verwenden einer der Achsenmethoden, die als Parameter einen XName erfordert, zum Auswählen der gewünschten Elemente nur ermittelt werden muss, ob die beiden Namen auf dieselbe Instanz verweisen.As mentioned earlier, the benefit of atomized objects is that when you use one of the axis methods that take an XName as a parameter, the axis method only has to determine that two names reference the same instance to select the desired elements.

Im folgenden Beispiel wird ein XName an den Descendants-Methodenaufruf übergeben. Dieser erreicht aufgrund des Atomarisierungsmusters eine bessere Leistung.The following example passes an XName to the Descendants method call, which then has better performance because of the atomization pattern.

XElement root = new XElement("Root",  
    new XElement("C1", 1),  
    new XElement("Z1",  
        new XElement("C1", 2),  
        new XElement("C1", 1)  
    )  
);  

var query = from e in root.Descendants("C1")  
            where (int)e == 1  
            select e;  

foreach (var z in query)  
    Console.WriteLine(z);  

Dieses Beispiel erzeugt die folgende Ausgabe:This example produces the following output:

<C1>1</C1>  
<C1>1</C1>  

Siehe auchSee Also

Leistung (LINQ to XML) (C#)Performance (LINQ to XML) (C#)