Aracılığıyla paylaş


Anonim türler (C# Programlama Kılavuzu)

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:

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.

Ayrıca bakınız