Programlama dillerinde değişkenler bellekteki konumlarına erişim türleri açısından ikiye ayrılır, bunlar türler 'Değer' ve 'Referance' türlerdir.
Bu durumu C# dili için ele alırsak değer türler için 'struct' ve referans türler için 'class' kullanımı tercih edilir. OOP(Neneye Yönelik Programlama) dikkate alındığında daha çok Class kullanılır, eğer biraz ileri seviye yazılım geliştiriyorsanız 'interface'lerile birlikte 'generic' yapıları kullanıyorsunuzdur, generic kullanımlara 'Değer' ve 'Referance' tür kısıtları verirken 'class' ve 'struct' anahtar kelimeleri kullanılır.
Aşağıya bu kısıtlama örneklerinden birini iliştiriyorum;
public class EfEntityRepositoryBase<TEntity, TContext> : IEntityRepository<TEntity>
where TEntity:class ,IEntity,new()
where TContext:DbContext,new()
Yukarıda TEntity generic tipi 'class' ile kısıtlanarak sadece referans tütünden bir değer olabileceği belirtilmiştir.
Her neyse aslında anlatmak istediğim 'struct' yapısı kullanmak istendiğinde struct değişkeni başka bir değişkene atandığında içindeki hangi tip değişken türlerinin değerleri hangi tip değişken türlerinin referanslarının kullanıldığı.
Aslında çoğu kaynakta bu konunun detayını bulamayabilirsiniz ve kendiniz merak edip deneme kodlar yazarak bu tür durumları test etmeniz gerekir.
Kod üzerinden ilerlersek daha açıklayıcı olacaktır sanırım;
Bir 'Musteri' tipi var biz bu tipi hem class hem de struct olarak tamınlıyoruz, bu tip içinde bir de 'IntArray' adında referans tipli bir değişken barındırıyor, incelememiz bu değişken üzerinden olacak.
class Musteri
{
internal string TCNo { get; set; }
internal string Ad { get; set; }
internal string Soyad { get; set; }
internal int Cinsiyet { get; set; } // 717770000: Kadın, 717770001: Erkek
internal int[] IntArray { get; set; }
internal void Write()
{
Console.Write($"{TCNo}-{Ad}-{Soyad}-{Cinsiyet}");
foreach (int item in IntArray)
{
Console.Write($"-{item}");
}
Console.Write("\n");
}
}
struct MusteriStr
{
internal string TCNo { get; set; }
internal string Ad { get; set; }
internal string Soyad { get; set; }
internal int Cinsiyet { get; set; } // 717770000: Kadın, 717770001: Erkek
internal int[] IntArray { get; set; }
internal void Write()
{
Console.Write($"{TCNo}-{Ad}-{Soyad}-{Cinsiyet}");
foreach (int item in IntArray)
{
Console.Write($"-{item}");
}
Console.Write("\n");
}
}
Yukarıda tanımlanan yapıları alttaki kodlar ile test ediyoruz(basit bir Console uygulaması üzerinden test ediyoruz)
static void Main(string[] args)
{
Musteri musteri1 = new Musteri
{
Ad = "Müşteri1",
Soyad = "Soyad1",
Cinsiyet = 717770001,
TCNo = "11223344567",
IntArray = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }
};
MusteriStr musteriStr1 = new MusteriStr
{
Ad = "Müşteri1",
Soyad = "Soyad1",
Cinsiyet = 717770001,
TCNo = "11223344567",
IntArray = new int[] {1,2,3,4,5,6,7,8,9,10 }
};
Console.WriteLine("\n==============Classes==============");
Musteri musteri2 = musteri1;
musteri1.Write();
musteri2.Write();
musteri2.Ad = "WWW";
musteri2.IntArray[4] = 777777777;
musteri1.Write();
musteri2.Write();
Console.WriteLine("\n==============Structs==============");
MusteriStr musteriStr2 = musteriStr1;
musteriStr1.Write();
musteriStr2.Write();
musteriStr2.Ad = "WWW";
musteriStr2.IntArray[4] = 777777777;
musteriStr1.Write();
musteriStr2.Write();
Console.ReadKey();
}
Altta 'Main' metodu çalıştırılınca alınan çıktı görülüyor. Burada dikkat edilmesi gereken kısım 'struct' değişkeni başka bir değişkene atanınca struct'ta bulunan referans türlerin sadece referansları atanır, bu sebepledir ki 'musteriStr2.IntArray[4] = 777777777;' ifadesi hem 'musteriStr1'in hem de 'musteriStr2'nin ilgili değişkenini etkiler. Aksi türlü olsaydı eğer bu durumu CPU seviyesinde yönetmek baya bir zor olurdu.