Primitive terimine denk düşecek Türkçe bir kavram aradıysam da en yakın birebir anlamı olan ilkel sözcüğü terim anlamını pek karşılamadığı için sözlükteki primitif sözcüğünü kullanmayı seçtim. Yazıda bu şekilde devam edeceğimi belirterek kavrama hemen geçiyorum.

En genel anlamda primitif türler dilin en temel türlerini oluşturmaktadır ve derleyici seviyesinde bilinmektedirler. Diğer tüm türlerin bunları kullanarak oluşturulduğunu söylersek yanlış olmaz. Primitiflik C# için değil onun çalıştığı .net platformu için vardır. Biliyorsunuz ki .net kullanılarak yazılmış projeler geliştirildikleri dil her ne olursa olsun sonuçta bir MSIL koduna dönüşeceklerdir.

Primitif türler ile built-in (gömülü) türleri ve Visual Basic .net'in kendi primitif tür tanımlarını karıştırmamak gerekmektedir. Burada en temel fark biraz önce söylediğim gibi sanki atomu oluşturan parçalarmış gibi bu türün bölünemez olmasıdır. Örneğin, string türü gömülü bir tür olsa da hepinizin bildiği gibi aslında char türünden immutable (değişmez) bir dizidir. Dolayısıyla alt parçalarına ayrılabilir. Yine decimal basit görünen bir tip olsa da aslında arkada int türünden değerler kullanan bir struct (yapı) dır ve aslında yine C# kullanılarak yazılmıştır. Primitif olan ve olmayan tiplere ait kaynak kodları (DateTime Decimal Short) incelerseniz primitif tiplerin kendilerini bellekte saklayan kısımların kendi alias tiplerinde (Int32 için int, Int16 için short...); primitif olmayanlarda ise örneğin decimal da primitif tipler ile olduğunu göreceksiniz. Yani aslında Int32 ile int arasında kendisini derleme açısından bir fark vardır. Aksi durumda .net'in kendi kodlarının kendisini derlenmesi mümkün olmayacaktır (bir struct tanımlarken struct'ın fieldlarından herhangi biri structın kendisi ile aynı türden olamaz). Ama tabii ki bizim kullanımımız açısından int ya da Int32 neredeyse hiç bir fark (using System; yazma şartı dışında) yok.

Bir türün primitif olup olmadığını anlamak için [Tür].IsPrimitive şeklinde sormamız yeterlidir.

Console.WriteLine(typeof(int).IsPrimitive);
Console.WriteLine(typeof(Int32).IsPrimitive); // aslında üsteki ile aynı
Console.WriteLine(typeof(decimal).IsPrimitive);
Console.WriteLine(typeof(string).IsPrimitive);
Console.WriteLine(typeof(DateTime).IsPrimitive);
Console.WriteLine(typeof(short).IsPrimitive);

/*Sonuçlar

True
True
False
False
False
True

*/

Farklı bir framework kullanmadığınız sürece primitif türler Boolean, Byte, SByte, Int16, UInt16, Int32, UInt32, Int64, UInt64, IntPtr, UIntPtr, Char, Double, Single şeklindedir. Anlaşıldığı üzere kendi derleyicinizi yazmadığınız sürece kendi primitif türünüzü oluşturmanız pek olası değil.

Peki hangi türlerin primitif olduğunu bilmenin ne gibi kazancı olur? Öncelikli fayda performans olacaktır çünkü olası en yalın türler ile çalışıyor olacaksınız. Örneğin, bu sebeple eğer yaklaşık değer size yeterli oluyorsa double kullanmak decimal kullanmaktan performanslı olacaktır -ki oyun geliştirirken bu bilgi oldukça işe yaramaktadır. Bunun dışında eğer marshalling(elinizdeki .net verisinin başka platformlara bellek üzerinden aktarmanız için yaptığınız serileştirme işleri) gibi konularla ilgileniyorsanız primitif tiplerde görünen tür farklı olacaktır.