Aracılığıyla paylaş


Anonim ve tanımlama grubu türleri arasında seçim yapma

Uygun türü seçmek için kullanılabilirlik, performans ve diğer türlerle karşılaştırıldığında dengelemeler dikkate alınır. C# 3.0'dan bu yana anonim türler kullanılabilirken, genel System.Tuple<T1,T2> türler .NET Framework 4.0 ile kullanıma sunulmuştur. O zamandan beri yeni seçenekler dil düzeyi desteğiyle kullanıma sunulmuştur. Örneğin, adından da anlaşılacağı gibi System.ValueTuple<T1,T2> , anonim türlerin esnekliğine sahip bir değer türü sağlar. Bu makalede, bir türü diğerinin yerine seçmenin uygun olduğu zaman öğreneceksiniz.

Kullanılabilirlik ve işlevsellik

C# 3.0'da DilLe Tümleşik Sorgu (LINQ) ifadeleriyle anonim türler tanıtıldı. LINQ ile geliştiriciler genellikle sorgulardan elde edilen sonuçları, üzerinde çalıştıkları nesnelerden birkaç belirli özelliği barındıran anonim türlere yansıtırlar. Bir nesne dizisinin DateTime örneğini oluşturan ve iki özelliğe sahip anonim bir türe yansıtan bu nesneler arasında yinelemeler sağlayan aşağıdaki örneği göz önünde bulundurun.

var dates = new[]
{
    DateTime.UtcNow.AddHours(-1),
    DateTime.UtcNow,
    DateTime.UtcNow.AddHours(1),
};

foreach (var anonymous in
             dates.Select(
                 date => new { Formatted = $"{date:MMM dd, yyyy hh:mm zzz}", date.Ticks }))
{
    Console.WriteLine($"Ticks: {anonymous.Ticks}, formatted: {anonymous.Formatted}");
}

Anonim türler işleci kullanılarak new örneklenir ve özellik adları ve türleri bildirimden çıkarılır. Aynı derlemedeki iki veya daha fazla anonim nesne başlatıcısı 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.

Önceki C# kod parçacığı, aşağıdaki derleyici tarafından oluşturulan C# sınıfına çok benzer şekilde iki özelliğe sahip anonim bir tür oluşturur:

internal sealed class f__AnonymousType0
{
    public string Formatted { get; }
    public long Ticks { get; }

    public f__AnonymousType0(string formatted, long ticks)
    {
        Formatted = formatted;
        Ticks = ticks;
    }
}

Daha fazla bilgi için bkz . anonim türler. LINQ sorgularına yansıtırken demetlerde aynı işlevsellik vardır; tanımlama kümeleri halinde özellikleri seçebilirsiniz. Bu tanımlama kümeleri, anonim türlerin yapacağı gibi sorguda akar. Şimdi aşağıdaki örneği kullanarak System.Tuple<string, long>göz önünde bulundurun.

var dates = new[]
{
    DateTime.UtcNow.AddHours(-1),
    DateTime.UtcNow,
    DateTime.UtcNow.AddHours(1),
};

foreach (var tuple in
            dates.Select(
                date => new Tuple<string, long>($"{date:MMM dd, yyyy hh:mm zzz}", date.Ticks)))
{
    Console.WriteLine($"Ticks: {tuple.Item2}, formatted: {tuple.Item1}");
}

System.Tuple<T1,T2>ile, örneği , ve Item2gibi Item1numaralandırılmış öğe özelliklerini kullanıma sunar. Özellik adı yalnızca sırayı sağladığından, bu özellik adları özellik değerlerinin amacının anlaşılmasını zorlaştırabilir. Ayrıca, System.Tuple türler başvuru class türleridir. System.ValueTuple<T1,T2> Ancak, bir değer struct türüdür. Aşağıdaki C# kod parçacığı, yansıtmak için kullanır ValueTuple<string, long> . Bunu yaparken, değişmez bir söz dizimi kullanarak atar.

var dates = new[]
{
    DateTime.UtcNow.AddHours(-1),
    DateTime.UtcNow,
    DateTime.UtcNow.AddHours(1),
};

foreach (var (formatted, ticks) in
            dates.Select(
                date => (Formatted: $"{date:MMM dd, yyyy at hh:mm zzz}", date.Ticks)))
{
    Console.WriteLine($"Ticks: {ticks}, formatted: {formatted}");
}

Tanımlama kümeleri hakkında daha fazla bilgi için bkz . Tanımlama grubu türleri (C# başvurusu) veya Tanımlama Kümeleri (Visual Basic).

Önceki örneklerin tümü işlevsel olarak eşdeğerdir, ancak bunların kullanılabilirliği ve temel uygulamaları arasında küçük farklılıklar vardır.

Avantajlar ve Dezavantajlar

her zaman yerine Tupleve anonim türler kullanmak ValueTuple isteyebilirsiniz, ancak göz önünde bulundurmanız gereken dengeler vardır. Türler ValueTuple değişebilirken, Tuple salt okunur. Anonim türler ifade ağaçlarında kullanılabilirken tanımlama kümeleri kullanılamaz. Aşağıdaki tabloda, bazı önemli farklara genel bir bakış sağlanır.

Temel farklılıklar

Veri Akışı Adı Erişim değiştiricisi Tür Özel üye adı Yapısızlaştırma desteği İfade ağacı desteği
Anonim türler internal class ✔️ ✔️
Tuple public class ✔️
ValueTuple public struct ✔️ ✔️

Serileştirme

Tür seçerken dikkat edilmesi gereken önemli noktalardan biri, seri hale getirilip getirilmemesi gerektiğidir. Serileştirme, bir nesnenin durumunu kalıcı veya taşınabilen bir forma dönüştürme işlemidir. Daha fazla bilgi için bkz . serileştirme. Serileştirme önemli olduğunda, anonim türler veya tanımlama grubu türleri yerine veya struct oluşturmak class tercih edilir.

Performans

Bu türler arasındaki performans senaryoya bağlıdır. En büyük etki, ayırmalar ve kopyalama arasındaki dengeyi içerir. Çoğu senaryoda etki azdır. Önemli etkiler ortaya çıktığında, kararı bilgilendirmek için ölçümler yapılmalıdır.

Sonuç

Tanımlama kümeleri ve anonim türler arasında seçim yapmak için geliştirici olarak dikkate alınması gereken birkaç faktör vardır. Genel olarak, ifade ağaçlarıyla çalışmıyorsanız ve tanımlama grubu söz dizimi konusunda rahatsanız, ad özellikleri esnekliğine sahip bir değer türü sağladıklarına göre seçim yapınValueTuple. İfade ağaçlarıyla çalışıyorsanız ve özellikleri adlandırmayı tercih ediyorsanız anonim türleri seçin. Aksi takdirde kullanın Tuple.

Ayrıca bkz.