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 Messageadlı Amount 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, ilgilenmediğiniz diğer özelliklerle birlikte ve Price özelliklerini içerirColor. Değişken products bir nesne koleksiyonudur Product . 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 PriceşeklindedirColor.

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);
}

İ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ı veya 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 zaten örnek oluşturulmuş kullanıcı tanımlı türler kullanılarak iki anonim tür oluşturulur. Her iki durumda product da anonim türdeki shipment alan ve shipmentWithBonus her alanın varsayılan değerlerini içeren türde Product olacaktır. bonus Ve alan, derleyici tarafından oluşturulan anonim türde olacaktı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 derleyici anonim türün temel adına erişebildiğinden tür adı değişken bildiriminde belirtilemez. 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 öğesinden objecttüretilen ve dışında objectherhangi bir türe yayınlanamaz türlerdirclass. 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üzeyidir, internalbu 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 }"