Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
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>