C# Anonymous (Anonim) Tipler

Bilindiği üzere, bir nesne oluşturmak için belirli bir özelliklere (properties) sahip bir sınıf (class) tanımı yapıp bu sınıf üzerinden instance işlemi yaparak nesneler oluştururuz. C# 3.0 ile birlikte bir sınıf tanımlamadan read-only özelliklere sahip nesneler oluşturabileceğimiz Anonymous (Anonim) tipler tanıtılmıştır. Bu makalemizde anonim tipleri incelyeceğiz.

Teknik bir tanım yapacak olursak anonim tipler, bir grup read-only özelliği (property), bir sınıf tanımlamanıza gerek kalmadan tek bir nesneye kapsüllemenize (encapsulate) olanak tanıyan yapılardır.

Anonim tiplerde property (özellikler) arkaplanda derleme zamanında üretilirler. Bu nedenle, tip adına kaynak kod düzeyinde erişilemez. Derleyici ayrıca anonim tipin her bir özelliğinin (veri tipini) de derleme zamanında ortaya çıkarır.

Anonim tipler oluşturmak için, new operatörünü bir nesne başlatıcı ile kullanırsınız. Örneğin, Name ve Price adlı iki özelliğe sahip bir anonim tipin nasıl oluşturulacağına hep birlikte inceleyelim:

        var product = new 
        { 
            Name = "IPhone 14",
            Price = 999.99
        };

        Console.WriteLine($"{product.Name} - {product.Price}");

Sonuç:

IPhone 14 - 999,99

Fareyi Visual Studio üzerinde Name veya Price özelliklerinin üzerine getirirseniz, derleyicinin Name özelliğinin tipini string olarak ve Price özelliğinin tipini ise double olarak olarak atandığını görürsünüz:

Name ve Price properties (özellikleri) read-only olduğundan, ona yeni bir değer atamaya çalışırsanız eğer derleme zamanı hatası alırsınız. Örneğin:

product.Price = 2000; // hata

Eğer tekrar bir atama yapmak isterseniz örneğin aynı name ve farklı price özelliğine sahip yeni bir anonim nesne oluşturmak için with ifadesini kullanabilirsiniz.

with ifadesi, sizlere bir veya daha fazla özelliğin yeni değerlere sahip olduğu bir anonim tip nesnesi oluşturur. Örneğin:

        var product = new 
        { 
            Name = "IPhone 14",
            Price = 999.99
        };

        Console.WriteLine($"{product.Name} - {product.Price}");

        var productX = product with
        {
            Price = 1000
        };
        Console.WriteLine($"{productX.Name} - {product.Price}");

Sonuç:

IPhone 14 - 999,99
IPhone 14 - 1000

Bu örnekte, product nesnesiyle, ancak yeni Price değeriyle aynı anonim tipde yeni bir örnek oluşturmak için with ifadesini kullanıyoruz.

Anonim tipler sadece Class’lar için değil array gibi yapılar içinde geçerlidir. Örneğin bir dizi anonim tip tanımla:

var products = new[]
{
    new { Name = "Phone X", Price = 999.99 },
    new { Name = "Computer Y", Price = 1999.99 },
    new { Name = "Tablet Z", Price = 2999.99 }
};

Ve anonim bir tip, açık tiplerin örnekleri olan özelliklere sahip olabilir. Örneğin:

using static System.Console;


var product = new
{
    Name = "Phone X",
    Price = 999.99,
    attribute = new ProductAttribute() { Color = "Black", Weight = 100 }
};

WriteLine($"{product.Name}: {product.attribute.Color}");



class ProductAttribute
{
    public string? Color
    {
        get; init;
    }
    public decimal? Weight
    {
        get; init;
    }
}

Bu örnekte, ProductAttribute sınıfının bir örneği olan bir özelliğe sahip anonim bir nesne tanımlıyoruz.

Son olarak anonim tipler, doğrudan object tipinden miras alır ve anonim tipleri, object dışında herhangi bir tipe çeviremezsiniz. Aynı sıra ve tipte aynı özellik kümesine sahip iki veya daha fazla anonim nesneniz varsa, derleyici bu nesneleri aynı tipte ele alacaktır. Başka bir deyişle, aynı üretilen türü paylaşırlar.

Özet

  • read-only property sahip bir object oluşturmak için anonim tipler kullanılır.
  • Anonim bir tip bildirmek için new anahtar sözcüğünü ve bir object initializer (object başlatıcıyı) kullanılır.
  • Ayrı bir tür tanımlamadan verileri geçici olarak depolayan bir nesne oluşturmak istediğinizde anonim tipler kullanılır.
  • Anonim tipler çalışma zamanında oluşturulur.