Anonim Türler
Anonim türler, bir salt okunur özellik kümesine, önce açıkça bir tür tanımlamak zorunda kalmadan tek bir nesnede kapsüllemenin kullanışlı bir yolunu 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 ertelenmiştir.
İşleci bir nesne new başlatıcı ile birlikte kullanarak 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 örnek, ve adlı iki özellik ile başlatılan anonim bir türü Amount Message gösterir.
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 bir sorgu ifadesinin yan tümcesinde, kaynak dizisinde her bir nesneden select özelliklerin bir alt kümesini dönmek için kullanılır. Sorgular hakkında daha fazla bilgi için bkz. C# içinde LINQ.
Anonim türler bir veya daha fazla genel salt okunur özellik içerir. Yöntemler veya olaylar gibi diğer sınıf üyesi türleri geçerli değildir. Bir özelliği başlatmak için kullanılan ifade, anonim bir null işlev veya işaretçi türü olamaz.
En yaygın senaryo, başka bir türden özelliklere sahip anonim bir tür başlatmaktır. Aşağıdaki örnekte adlı bir sınıf olduğunu Product varsayalım. ProductSınıf, Color Price ilginizi çekmiyor diğer özelliklerle birlikte ve özellikleri içerir. Değişken products bir nesne Product koleksiyonudur. Anonim tür bildirimi anahtar sözcüğüyle new başlar. Bildirimi, yalnızca iki özelliği kullanan yeni bir türü Product başlatıyor. Anonim türlerin kullanımı, sorguda daha az miktarda verinin döndürülüyor olmasına neden olur.
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ğlarsiniz. Aşağıdaki örnekte, anonim türün özelliklerinin adları ve Color Price 'tir.
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);
}
Genellikle, bir değişkeni başlatmak için anonim bir tür kullanırsanız, değişkenini var kullanarak örtülü olarak türe sahip bir yerel değişken olarak bildirersiniz. Anonim türün temel alınan adına yalnızca derleyici erişimi olduğundan tür adı değişken bildiriminde belirtilmez. hakkında daha fazla bilgi var için bkz. Örtülü Olarak Türe Sahip Yerel Değişkenler.
Aşağıdaki örnekte gösterildiği gibi, örtülü olarak türe sahip bir yerel değişkeni ve örtülü olarak türüne sahip bir diziyi birleştirerek anonim olarak türe sahip öğelerden bir dizi oluşturabilirsiniz.
var anonArray = new[] { new { name = "apple", diam = 4 }, new { name = "grape", diam = 1 }};
Anonim class türler, doğrudan 'den türetilen object ve dışında herhangi bir türeyen türlerdir. object Derleyici her anonim tür için bir ad sağlar, ancak uygulamanıza erişe değildir. Ortak dil çalışma zamanı perspektifinden bakıldığında anonim tür, diğer başvuru türlerinden farklı değildir.
Bir derlemedeki iki veya daha fazla anonim nesne başlatıcısı aynı sırada olan ve aynı adlara ve türlere sahip bir özellik dizisi belirtirse, derleyici nesneleri aynı türün örnekleri olarak kabul eder. Derleyici tarafından oluşturulan aynı tür bilgilerini paylaşırlar.
Anonim türler, ifadeleri ile şeklinde yıkıcı olmayan yıkıcıyı 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 sağlar:
var apple = new { Item = "apples", Price = 1.35 };
var onSale = apple with { Price = 0.79 };
Console.WriteLine(apple);
Console.WriteLine(onSale);
Bir alanın, özelliğin, olayın veya yöntemin dönüş türünü anonim türe sahip olarak bildiresiniz. Benzer şekilde, bir yöntem, özellik, oluşturucu veya dizin oluşturucu için resmi bir parametreyi anonim türe sahip olarak bildiresiniz. Anonim bir türü veya anonim türleri içeren bir koleksiyonu bir yönteme bağımsız değişken olarak geçmek için, parametresini türünde object bildirebilirsiniz. Ancak anonim object türler için kullanmak güçlü yazmanın amacını yitirmektedir. Sorgu sonuçlarını depolamalı veya yöntem sınırının dışında geçmeniz gerekirse anonim tür yerine normal bir adlandırılmış yapı veya sınıf kullanmayı göz önünde bulundurabilirsiniz.
Anonim türlerde ve yöntemleri özelliklerin ve yöntemleri bakımından tanımlandığı için, aynı anonim türün iki örneği yalnızca tüm özellikleri eşitse Equals GetHashCode Equals GetHashCode eşittir.