Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
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>