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.
Anonim türler, önce adlandırılmış bir tür tanımlamadan bir salt okunur özellik kümesini tek bir nesnede kapsüllemek için kullanışlı bir yol sağlar. Derleyici, derleme zamanında kaynak kodunuzda erişilemeyen bir tür adı oluşturur. Derleyici her özelliğin türünü çıkarsar.
işlecini new bir nesne başlatıcıyla birlikte kullanarak anonim türler oluşturun. Aşağıdaki örnek, Name ve Age olmak üzere iki özellikle başlatılan anonim bir türü göstermektedir.
var person = new { Name = "Alice", Age = 30 };
Console.WriteLine($"{person.Name} is {person.Age} years old.");
// Output:
// Alice is 30 years old.
Çıkarsanan özellik adları
Söz dizimini Name = value kullanarak özellik adlarını açıkça belirtebilirsiniz. Anonim bir türü bir değişken veya üye erişim ifadesiyle başlattığınızda, derleyici bu ifadeden özellik adını çıkarsar:
string productName = "Laptop";
decimal price = 999.99m;
var product = new { productName, price };
Console.WriteLine($"{product.productName}: {product.price:C}");
// Output:
// Laptop: $999.99
Önceki örnekte, derleyici başlatıcıda kullanılan değişken adlarından productName ve price'i özellik adları olarak çıkarsamaktadır.
Var ile anonim türler bildirme
Derleyici tür adını oluşturduğundan ve kaynak kodunda bu ada erişemediğiniz için yerel değişkeni bildirmek için kullanmanız var gerekir. Tür adını açıkça belirtemezsiniz:
// You must use var — you can't write a named type here.
var person = new { Name = "Alice", Age = 30 };
LINQ sorgularında anonim türler kullanma
Anonim türler en sık sorgu ifadesinin select yan tümcesinde görünür ve burada her kaynak öğeden özelliklerin bir alt kümesini yansıtırlar:
var words = new[] { "apple", "blueberry", "cherry" };
var results = words.Select(w => new { Word = w, Length = w.Length });
foreach (var item in results)
{
Console.WriteLine($"{item.Word} has {item.Length} letters.");
}
// Output:
// apple has 5 letters.
// blueberry has 9 letters.
// cherry has 6 letters.
Eşitlik
Aynı özellik adları ve türleri aynı sırada olan iki anonim tür örneği, aynı derleyici tarafından oluşturulan türü paylaşır. Derleyici, Equals ve GetHashCode ifadelerini geçersiz kılar, böylece eşitlik karşılaştırması, başvuru kimliği yerine özellik değerlerini karşılaştırır:
var a = new { Name = "Alice", Age = 30 };
var b = new { Name = "Alice", Age = 30 };
var c = new { Name = "Bob", Age = 25 };
Console.WriteLine(a.Equals(b)); // True
Console.WriteLine(a.Equals(c)); // False
İç içe anonim türler
Anonim türler, özellik değerleri olarak diğer anonim türleri içerebilir:
var order = new
{
OrderId = 1,
Customer = new { Name = "Alice", City = "Seattle" },
Total = 150.00m
};
Console.WriteLine($"Order {order.OrderId} for {order.Customer.Name} in {order.Customer.City}");
// Output:
// Order 1 for Alice in Seattle
Özellikler
Anonim türler aşağıdaki özelliklere sahiptir:
- Derleyici Object'den türetilen
internal sealed classtürleri olarak bunları oluşturur. - Tüm özellikler
publicve yalnızca okunur. - Anonim türler, yıkıcı olmayan mutasyon için ifadeleri destekler
with. - Derleyici değer tabanlı Equals, GetHashCode ve ToString geçersiz kılar.
- Anonim türler ifade ağaçlarını destekler, oysa tuple'lar desteklemez.
Sınırlamalar
Anonim türlerin çeşitli sınırlamaları vardır:
- Türü adlandıramadığınız için bunları yöntem dönüş türleri, yöntem parametreleri veya alan türleri olarak kullanamazsınız.
- Bunların kapsamı, bunları bildirdiğiniz yönteme göre belirlenmiştir.
- Yöntemler, olaylar veya özel işleçler ekleyemezsiniz.
- Özellikler her zaman salt okunur olur; anonim türler, değiştirilebilir özellikleri desteklemez.
Bunun yerine tanımlama demetleri ne zaman kullanılır?
Yeni kodların çoğu için anonim türler yerine tuple kullanmayı göz önünde bulundurun. Değer türleri olarak tanımlama kümeleri daha iyi performans sağlar. Ayrıca, parçalama desteği ve daha esnek söz dizimi sağlarlar. İfade ağacı desteğine veya başvuru türü semantiğine ihtiyacınız olduğunda anonim türler daha iyi bir seçenek olmaya devam eder. Ayrıntılı karşılaştırma için bkz. Anonim ve tuple türleri arasında seçim yapma.