Aracılığıyla paylaş


Anonim türler

Anonim türler, bir tür kümesini açıkça tanımlamak zorunda kalmadan tek bir nesnede salt okunur özellikler kümesini kapsüllemek için kullanışlı bir yol sağlar. Tür adı derleyici tarafından oluşturulur ve kaynak kod düzeyinde kullanılamaz. Her özelliğin türü derleyici tarafından çıkarılır.

İşleci bir nesne başlatıcıyla birlikte kullanarak new anonim türler oluşturursunuz. Nesne başlatıcıları hakkında daha fazla bilgi için bkz . Nesne ve Koleksiyon Başlatıcıları.

Aşağıdaki örnekte ve Amountadlı Message iki özellik ile başlatılan anonim bir tür gösterilmektedir.

var v = new { Amount = 108, Message = "Hello" };

// Rest the mouse pointer over v.Amount and v.Message in the following
// statement to verify that their inferred types are int and string.
Console.WriteLine(v.Amount + v.Message);

Anonim türler genellikle kaynak dizideki select her nesneden özelliklerin bir alt kümesini döndürmek için sorgu ifadesinin yan tümcesinde kullanılır. Sorgular hakkında daha fazla bilgi için bkz . C# dilinde LINQ.

Anonim türler bir veya daha fazla genel salt okunur özellik içerir. Yöntemler veya olaylar gibi başka tür sınıf üyeleri geçerli değildir. Bir özelliği başlatmak için kullanılan ifade, anonim bir işlev veya işaretçi türü olamaz null.

En yaygın senaryo, başka bir türdeki özelliklerle anonim bir tür başlatmaktır. Aşağıdaki örnekte adlı Productbir sınıfın mevcut olduğunu varsayalım. Sınıf Product, Color ve Price özelliklerini, ilgilenmediğiniz diğer özelliklerle birlikte içerir:

class Product
{
    public string? Color { get; set; }
    public decimal Price { get; set; }
    public string? Name { get; set; }
    public string? Category { get; set; }
    public string? Size { get; set; }
}

Anonim tür bildirimi anahtar sözcüğüyle new başlar. Bildirimi, 'den Productyalnızca iki özellik kullanan yeni bir tür başlatır. Anonim türlerin kullanılması sorguda daha az miktarda veri döndürülür.

Anonim türde üye adları belirtmezseniz, derleyici anonim tür üyelerine bunları başlatmak için kullanılan özellikle aynı adı verir. Önceki örnekte gösterildiği gibi bir ifadeyle başlatılan bir özellik için bir ad sağlarsınız. Aşağıdaki örnekte anonim türün özelliklerinin adları ve ColorşeklindedirPrice. Örnekler, tür koleksiyonundan productsProduct öğedir:

var productQuery =
    from prod in products
    select new { prod.Color, prod.Price };

foreach (var v in productQuery)
{
    Console.WriteLine("Color={0}, Price={1}", v.Color, v.Price);
}

Projeksiyon başlatıcıları

Anonim türler, üye adını açıkça belirtmeden doğrudan yerel değişkenleri veya parametreleri kullanmanızı sağlayan projeksiyon başlatıcılarını destekler. Derleyici, değişken adlarından üye adlarını çıkarsar. Aşağıdaki örnekte bu basitleştirilmiş söz dizimi gösterilmektedir:

// Explicit member names.
var personExplicit = new { FirstName = "Kyle", LastName = "Mit" };

// Projection initializers (inferred member names).
var firstName = "Kyle";
var lastName = "Mit";
var personInferred = new { firstName, lastName };

// Both create equivalent anonymous types with the same property names.
Console.WriteLine($"Explicit: {personExplicit.FirstName} {personExplicit.LastName}");
Console.WriteLine($"Inferred: {personInferred.firstName} {personInferred.lastName}");

Bu basitleştirilmiş söz dizimi, birçok özelliğe sahip anonim türler oluştururken kullanışlıdır:

var title = "Software Engineer";
var department = "Engineering";
var salary = 75000;

// Using projection initializers.
var employee = new { title, department, salary };

// Equivalent to explicit syntax:
// var employee = new { title = title, department = department, salary = salary };

Console.WriteLine($"Title: {employee.title}, Department: {employee.department}, Salary: {employee.salary}");

Üye adı aşağıdaki durumlarda çıkarılamaz:

  • Aday adı, açık veya örtük olarak aynı anonim türdeki başka bir özellik üyesinin yinelemesidir.
  • Aday adı geçerli bir tanımlayıcı değildir (örneğin, boşluklar veya özel karakterler içerir).

Bu durumlarda, üye adını açıkça belirtmeniz gerekir.

İpucu

Çıkarsanan veya açık üye adlarının tercih edilip edilmediğini zorlamak için .NET stil kuralı IDE0037 kullanabilirsiniz.

Bir alanı başka bir türe göre tanımlamak da mümkündür: sınıf, yapı, hatta başka bir anonim tür. Bu, aşağıdaki örnekte olduğu gibi bu nesneyi tutan değişken kullanılarak gerçekleştirilir ve burada önceden oluşturulmuş kullanıcı tanımlı türler kullanılarak iki anonim tür oluşturulur. Her iki durumda da, product anonim türdeki shipment alan ve shipmentWithBonus her alanın varsayılan değerlerini içeren türdedir Product . bonus alanı, derleyici tarafından oluşturulan anonim bir türdür.

var product = new Product();
var bonus = new { note = "You won!" };
var shipment = new { address = "Nowhere St.", product };
var shipmentWithBonus = new { address = "Somewhere St.", product, bonus };

Genellikle, bir değişkeni başlatmak için anonim bir tür kullandığınızda, değişkenini var kullanarak örtük olarak yazılan bir yerel değişken olarak bildirirsiniz. Yalnızca derleyicinin anonim türün temel adına erişimi olduğundan tür adı değişken bildiriminde belirtilemiyor. hakkında vardaha fazla bilgi için bkz . Örtük Olarak Yazılan Yerel Değişkenler.

Aşağıdaki örnekte gösterildiği gibi, örtük olarak yazılan bir yerel değişkeni ve örtük olarak yazılan bir diziyi birleştirerek anonim olarak yazılan öğeler dizisi oluşturabilirsiniz.

var anonArray = new[] { new { name = "apple", diam = 4 }, new { name = "grape", diam = 1 }};

Anonim türler, doğrudan class öğesinden türetilen türlerdir object ve object dışında herhangi bir türe dönüştürülemez. Derleyici, her anonim tür için bir ad sağlar, ancak uygulamanız bu türe erişemez. Ortak dil çalışma zamanı açısından bakıldığında, anonim bir tür diğer başvuru türlerinden farklı değildir.

Bir derlemedeki iki veya daha fazla anonim nesne başlatıcı aynı sırada ve aynı adlara ve türlere sahip bir özellik dizisi belirtirse, derleyici nesneleri aynı türde örnekler olarak ele alır. Derleyici tarafından oluşturulan aynı tür bilgilerini paylaşırlar.

Anonim türler, yıkıcı olmayan mutasyonu ifadeler biçiminde destekler. Bu, bir veya daha fazla özelliğin yeni değerlere sahip olduğu anonim bir türün yeni bir örneğini oluşturmanıza olanak tanır:

var apple = new { Item = "apples", Price = 1.35 };
var onSale = apple with { Price = 0.79 };
Console.WriteLine(apple);
Console.WriteLine(onSale);

Bir alanı, özelliği, olayı veya yöntemin dönüş türünü anonim bir türe sahip olarak bildiremezsiniz. Benzer şekilde, bir yöntemin, özelliğin, oluşturucunun veya dizin oluşturucunun resmi parametresini anonim bir türe sahip olarak bildiremezsiniz. Anonim bir türü veya anonim türler içeren bir koleksiyonu bir yönteme bağımsız değişken olarak geçirmek için parametresini türü objectolarak bildirebilirsiniz. Ancak, anonim türler için kullanmak object güçlü yazma amacını yener. Sorgu sonuçlarını depolamanız veya yöntem sınırının dışına geçirmeniz gerekiyorsa, anonim bir tür yerine sıradan bir adlandırılmış yapı veya sınıf kullanmayı göz önünde bulundurun.

Equals Anonim türlerdeki ve GetHashCode yöntemleri özelliklerin Equals ve GetHashCode yöntemleri açısından tanımlandığından, aynı anonim türün iki örneği yalnızca tüm özellikleri eşitse eşittir.

Not

Anonim bir türün erişilebilirlik düzeyi şeklindedir internal. Bu nedenle, farklı derlemelerde tanımlanan iki anonim tür aynı türde değildir. Bu nedenle, anonim türlerin örnekleri, tüm özellikleri eşit olsa bile farklı derlemelerde tanımlandığında birbirine eşit olamaz.

Anonim türler, küme ayraçlarıyla çevrelenen her özelliğin adını ve ToString çıkışını birleştirerek yöntemini geçersiz kılarToString.

var v = new { Title = "Hello", Age = 24 };

Console.WriteLine(v.ToString()); // "{ Title = Hello, Age = 24 }"