9 Şubat 2023 Perşembe

Record Type

  • İmmutable, recordların propertyleri create ediltikten sonra artık değiştirilemez.
  • Value-Based Equality, aynı record türünün iki instancesi, propertyleri için aynı valuelara sahip olmaları durumunda eşit olduğu anlamına gelir.

init’ keyword’ü ile işaretlenen propertyler  nesne üretildikte sonra artık  değiştirilemezler. Benzer şekilde  bir objeyi bütünsel olarak değişmez yapmak istiyorsak burada Recordlar devreye girmektedir. Böylece recordlar sayesinde immutable obje oluşturabiliriz. 

Record, bir objenin komple sabit/değişmez olarak kalmasını sağlamakta ve bu durumu güvence altına almaktadır. Böylece bu obje, artık değeri değişmeyeceğinden dolayı esasında objeden ziyade bir değer gözüyle bakılan bir yapıya dönüşmektedir.

Class’lar da verisel olarak nesne ön plandadır ve her bir farklı referansa sahip olan nesne farklı değer olarak algılanmaktadır.
Dolayısıyla Equals(x, y) karşılaştırması yanlıştır.

Recordlar da ise farklı objelerde de olsa, veriler(property değerleri) aynı olduğu sürece Equals(x, y) önermesi doğru olacaktır.

Record türünde yaratılacak nesneler aralarında karşılaştırıldıklarında referans olarak değil, verisel olarak değerlendirilir ve veriler eşitse bu nesneler eşit kabul edilir.


UserOne ve UserTwo record type oluşturma şekilleride ikiside aynı şey demektir. İkisi içinde  Id ve Name değerleri obje oluşturulacağı zaman belirlenir ve bir daha bu değerler değiştirilemez.

INHERİTANCE



Equals


Recordlarda equals valuelara göre kontrol edilir. İki farklı recordun valueları eşitse bu recordlar eşit kabul edilir.

with  Expression

With keywordu ile bir record instancesi referans alarak sadece değişmesini istediğimiz propery ismi with içerisinde belirtilir ve yeni instance oluşturulur. Aşağıda userOne nesnesin Id değeri aynı kalacak fakat name değeri Veli olacak şekilde yeni bir nesne üretmiş oluyoruz.

Positional Record 


Yukarıda görüldüğü üzere direkt olarak record tanımlamasının yanında parantezler ile constructor misali obje içerisindeki ilgili property’ler tanımlanmaktadır. Bu property’ler default ‘init’ olacak şekilde oluşturulmakta ve nesne üretimi esnasında constructor’dan verilecek değerlerden sonra readonly olarak kullanılmaktadır ve artık değiştirilememektedir. Fakat Age propertysi init olmadığı için  değiştirilebilir durumdadır.


CLASS vs RECORD

  • Classların iki instances/objects karşılaştırmak için bellek adrreslerine bakmamız gerekirken recordlar için  property values karşılaştırılması yeterlidir. Recordlar için iki nesnenin propertyleri eşitse bu recordlar eşit kabul edilir
  • Record, data/properties depolamak için tasarlanırken, Classlar logic/operations/behavior için tasarlanır.
  • DTO'lar gibi sadece data taşıyan logic içermeyen yapılar için record kullanabiliriz. 

DTO vs RECORD

Data Transfer Object(DTO'lar) ve Recordlar , bir uygulamanın farklı katmanları arasında data transfer etmek  için kullanılan iki önemli kavramdır. Hem DTO'lar hem de Recordlar, dataları yönetmeyi kolaylaştırmak için tasarlanmıştır.

DTO'lar, bir uygulamanın Presentation Layerı ile Persistance Layerı gibi farklı bölümleri arasında data transfer etmek  için kullanılan basit veri yapılarıdır. DTO'lar genellikle dataların bir network üzerinden  iletilebilecek bir forma kolayca dönüştürülmesine izin veren  serialization ve deserialization ile birlikte kullanılır. Recordlar immutable oldukları için layer arasında aktarılırken yanlışlıkla değiştirilmesin diye DTO'lar yerine kullanılabilirler. 

  • DTO'lar ve Recordlar arasında seçim yaparken, uygulamanızın özel gereksinimlerini göz önünde bulundurmanız önemlidir. Transfer edilecek objenin immutable olmasını istiyorsak recordları tercih etmeliyiz. Ancak, uygulamanız eski C# sürümleriyle uyumluluk gerektiriyorsa veya transfer edildikten  sonra dataları değiştirebilmeniz gerekiyorsa, DTO'ları tercih edebiliriz.
REFERENCE

 C#’ta Class, Record ve Struct Arasındaki Farklar
C# dilinde nesneleri temsil etmek için class, record ve struct gibi farklı türler bulunur.

Peki, bunların farkları nelerdir?
· Class (Referans Tipi)
Bellekte heap üzerinde tutulur.
Referans tipi olduğu için nesne kopyalandığında sadece referansı aktarılır.
Değiştirilebilir (mutable) yapılar için uygundur.

· Record (Referans veya Değer Tipi)
Varsayılan olarak immutable (değiştirilemez) yapıdır.
Value-based equality kullanır (içerik karşılaştırması yapar).
class veya struct olarak tanımlanabilir.

· Struct (Değer Tipi)
Stack üzerinde tutulur (performans açısından avantajlıdır).
Kopyalama yapıldığında yeni bir nesne oluşturulur.
Küçük ve sık kullanılan veri yapıları için uygundur.

 Özet:
Referans tipi istiyorsanız: Class veya Record (class)
Değer tipi ve immutable yapı istiyorsanız: Record (struct)
Değer tipi ve mutable yapı istiyorsanız: Struct

Hiç yorum yok:

Yorum Gönder