Aracılığıyla paylaş


Atomize XName ve XNamespace nesneleri (LINQ to XML)

XName ve XNamespace nesneler atomize edilir; yani aynı nitelenmiş adı içeriyorsa, aynı nesneye başvururlar. Bu, sorgular için performans avantajları sağlar: Eşitlik için iki atomize adı karşılaştırdığınızda, temel alınan ara dilin yalnızca iki başvurunun aynı nesneye işaret edip etmediğini belirlemesi gerekir. Temel alınan kodun dize karşılaştırmaları yapması gerekmez ve bu işlem daha uzun sürer.

Atomizasyon semantiği

Atomizasyon, iki XName nesne aynı yerel ada sahipse ve aynı ad alanındaysa aynı örneği paylaştığı anlamına gelir. Aynı şekilde, iki XNamespace nesne aynı ad alanı URI'sine sahipse aynı örneği paylaşır.

Bir sınıfın atomize nesneleri etkinleştirmesi için sınıfın oluşturucusunun genel değil özel olması gerekir. Bunun nedeni oluşturucunun genel olması durumunda atomize olmayan bir nesne oluşturabilmektir. XName ve XNamespace sınıfları, bir dizeyi bir XName veya XNamespace içine dönüştürmek için örtük bir dönüştürme operatörü uygular. Bu nesnelerin bir örneğini bu şekilde alırsınız. Oluşturucuya erişilemediğinden bir oluşturucu kullanarak örnek alamazsınız.

XName ve XNamespace ayrıca karşılaştırılan iki nesnenin aynı örneğe başvuru olup olmadığını belirleyen eşitlik ve eşitsizlik işleçlerini uygulayın.

Örnek: Nesneler oluşturma ve özdeş adların bir örneği paylaştığını gösterme

Aşağıdaki kod bazı XElement nesneler oluşturur ve aynı adların aynı örneği paylaştığını gösterir.

var 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");
Dim r1 As New XElement("Root", "data1")
Dim r2 As XElement = XElement.Parse("<Root>data2</Root>")

If DirectCast(r1.Name, Object) = DirectCast(r2.Name, Object) Then
    Console.WriteLine("r1 and r2 have names that refer to the same instance.")
Else
    Console.WriteLine("Different")
End If

Dim n As XName = "Root"

If DirectCast(n, Object) = DirectCast(r1.Name, Object) Then
    Console.WriteLine("The name of r1 and the name in 'n' refer to the same instance.")
Else
    Console.WriteLine("Different")
End If

Bu örnek aşağıdaki çıkışı oluşturur:

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.

Daha önce belirtildiği gibi, atomize nesnelerin avantajı, parametre olarak bir XName alan eksen metotlarından birini kullandığınızda, istenen öğeleri seçmek için yalnızca iki adın aynı örneğe atıfta bulunup bulunmadığını belirlemesi gerektiğidir.

Aşağıdaki örnek, bir `XName` nesnesini `Descendants` yöntem çağrısına geçirir, bu da atomizasyon deseni nedeniyle daha iyi bir performansa sahiptir.

var 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);
Dim root As New XElement("Root", New XElement("C1", 1), New XElement("Z1", New XElement("C1", 2), New XElement("C1", 1)))

Dim query = From e In root.Descendants("C1") Where CInt(e) = 1

For Each z In query
    Console.WriteLine(z)
Next

Bu örnek aşağıdaki çıkışı oluşturur:

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