Bagikan melalui


Objek Teratomisasi XName dan XNamespace (LINQ ke XML)

XName dan XNamespace objek diatomisasi; yaitu, jika berisi nama yang memenuhi syarat yang sama, objek tersebut merujuk ke objek yang sama. Ini menghasilkan manfaat performa untuk kueri: ketika Anda membandingkan dua nama yang diatomisasi untuk kesetaraan, bahasa perantara yang mendasarinya hanya harus menentukan apakah kedua referensi menunjuk ke objek yang sama. Kode yang mendasarinya tidak harus melakukan perbandingan string, yang akan memakan waktu lebih lama.

Semantik atomisasi

Atomisasi berarti bahwa jika dua XName objek memiliki nama lokal yang sama, dan berada di namespace yang sama, mereka berbagi instans yang sama. Dengan cara yang sama, jika dua XNamespace objek memiliki URI namespace yang sama, objek tersebut berbagi instans yang sama.

Agar kelas mengaktifkan objek yang diatomisasi, konstruktor untuk kelas harus privat, bukan publik. Ini karena jika konstruktor bersifat publik, Anda dapat membuat objek yang tidak diatomisasi. Kelas XName dan XNamespace menerapkan operator konversi implisit untuk mengonversi string menjadi XName atau XNamespace. Ini adalah cara Anda mendapatkan sebuah instans dari objek-objek ini. Anda tidak bisa mendapatkan instans dengan menggunakan konstruktor, karena konstruktor tidak dapat diakses.

XName dan XNamespace juga menerapkan operator kesetaraan dan ketidaksetaraan, yang menentukan apakah dua objek yang dibandingkan adalah referensi ke instans yang sama.

Contoh: Membuat objek dan menunjukkan bahwa nama yang identik berbagi instans

Kode berikut membuat beberapa XElement objek dan menunjukkan bahwa nama yang identik berbagi instans yang sama.

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

Contoh ini menghasilkan output berikut:

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.

Seperti disebutkan sebelumnya, manfaat objek yang diatomisasi adalah bahwa ketika Anda menggunakan salah satu metode sumbu yang mengambil XName sebagai parameter, metode sumbu hanya harus menentukan bahwa dua nama mereferensikan instans yang sama untuk memilih elemen yang diinginkan.

Contoh berikut meneruskan XName ke panggilan metode Descendants, yang kemudian memiliki performa yang lebih baik karena pola atomisasi yang terstruktur.

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

Contoh ini menghasilkan output berikut:

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