.NET Referans Ve Değer Tipleri

ismail kaşan
4 min readMay 8, 2023

--

.NET, birçok farklı programlama diliyle kullanılabilen birçok farklı özellik sunar. Bu diller arasında C#, VB.NET, F# ve daha birçokları yer almaktadır.

.NET’in temel amacı, Windows platformu için uygulamalar geliştirmeye yönelik bir çerçeve sağlamaktır. Ancak, .NET’in son versiyonlarında Linux ve macOS gibi diğer platformlarda da kullanılabildiğini görmekteyiz. .NET, yüksek performanslı, güvenilir ve ölçeklenebilir uygulamalar geliştirmek için kullanılan bir araçtır.

.NET platformu, tip güvenliği sağlayan bir dizi tipler içerir. Bu tipler, uygulamanın hatalı veri türlerinden kaynaklanan hataları önlemesine yardımcı olur. Bu sayede, .NET uygulamaları daha güvenilir hale gelir.

.NET te tipler, iki ana kategori altında incelenebilir: değer tipleri ve referans tipleri. Değer tipleri, bellekte doğrudan(Stack) bir değer olarak saklanırken, referans tipleri bir bellek adresine(Heap) işaret eder. Bu nedenle, referans tipleri, bellekte daha büyük bir alan kaplar ve daha yavaş işleme süresine sahip olabilirler.

Değer tipleri arasında bool, char, byte, short, int, long, float, double ve decimal yer alırken, referans tipleri arasında class, interface, delegate ve array gibi öğeler yer alır. Aşağıda resimde C# dilindeki veri tipleri gösterilmektedir.

C# Data Types

İlkel(Primitive) Tipler:

Bir sürü compiler tarafından ortak kullanılan ilkel tiplerdir. Bu ilkel veri tipleri, değişkenlerin temel değerlerini tanımlamak için kullanılan basit ve temel veri türleridir. Bu tipler, farklı programlama dillerinde değişiklik gösterse de, genellikle sayısal veriler, karakterler, boolean değerler ve pointerlar gibi temel veri türlerini içerirler. Programcılar, programlama dillerinin ilkel veri tiplerini kullanarak, değişkenleri tanımlayabilir, yeni veri tipleri oluşturabilir ve programlarında kullanabilirler.

.NET’in FCL kütüphanesinde bütün ilkel tipler bulunur. Bu tiplerin bir kısmı .NET’in Common Language Spesification(CLS) kurallarına uyumlu oldukları için diğer dillerde kullanılabilecek tiplerdir. .NET’te data tiplerini 2 gruba ayırabiliriz. Reference tipler ve değer tipleridir. Değer tipleri belleğin Stack bölgesinde tutulurken, reference tipleri Heap bölgesinde tutulur. Aşağıdaki tabloda bütün data tipleri gösterilmiştir.

Yukarıdaki tabloda görüldüğü gibi (string ve object hariç) bütün değerlerin bir aralığı vardır. Yani bellekte o tip değer için ayrılmış bir aralık vardır. Derleyici bu sınır aşıldığında hata verecektir. Örneğin int data tipi için aralık -2,147,483,648 ile 2,147,483,648 dir. Eğer int tipinde bir değişkene bu değerden büyük bir değer ataması yaparsanız derleyici “OverflowException” hatası verecektir.

// compile time error: Cannot implicitly convert type 'long' to 'int'.
int a = 21474836471;

Birde, Unsigned integers, long, float, double ve decimal tipleri ile değişkenlere değer atılırken u,l,f,d son ekleri eklenmelidir.

uint x = 101u;
float fy = 11.2f;
long l = 45755452222244l;
ulong ul = 4575545222287451ul;
double d = 11452222.666d;
decimal mon = 1000.18m;

Default Değerler:

Her tipin bir default değeri vardır. Sayısal değerlerde default değeri 0 dir. Boolean tipte false’dir. Char’da ise ‘\0’ dir. default(typename) kullanarak datanın default değeri set edilir.

int i = default(int); // 0
float f = default(float);// 0
decimal d = default(decimal);// 0
bool b = default(bool);// false
char c = default(char);// '\0'

// C# 7.1 onwards
int i = default; // 0
float f = default;// 0
decimal d = default;// 0
bool b = default;// false
char c = default;// '\0'

Referance Type ve Value type:

CLR hem referans hem de değer tiplerini destekler. FCL kütüphanesindeki tiplerin çoğu reference tipli olmasına rağmen, yazılımcıların daha çok kullandıkları tipler value tiplerdir. Çünkü value tipleri kullanarak yeni referans tipler(class, interface vs.) oluştururlar. Reference tipler her zaman yönetilen bir Heap bellek bölgesinde tutulur. Heap bölgesi CLR tarafından yönetilmektedir. Hangi değişken için ne kadar bellek ayrılacağı CLR’in algoritmaları sonucunda belirlenir. Kullanılmayan objelerin yok edilmesi yine CLR’in Garbage Collector yapısıyla temizleniyor. Bu alanlara doğrudan yazılımcının müdahale yetkisi yoktur.

Referans tiplerde obje instance oluşturma esnasında “new” kelimesi kullanılır. “new” ile oluşturulan nesnenin adres bilgileri döner. Bu adres objenin data bitlerinin tutulduğu yeri gösterir.

Ayrıca bütün value tipleri sealed olarak işaretlenmiştir. Dolayısıyla value tipler miras alınıp derived bir value tip oluşturamıyoruz. Fakat struct ve bazı interface’leri kullanılarak custom value tipler oluşturulabilir. Örneğin, System.DateTime FCL kütüphanesinde bulunan özel bir struct tipidir.

Aşağıdaki kod örneğinde tiplere bağlı değişkenlerin bellek üzerinde nasıl etkileşimde bulundukları anlatılmaktadır. Ayrıca kod bloğunun altındaki resimde de bellek üzerinde nerelerde tutuldukları gösterilmektedir.

// Referans tipi (çünkü 'class')
class SomeRef {
public Int32 x;
}

// Value tipi ( çünkü 'struct')
struct SomeVal {
public Int32 x;
}

static void ValueTypeDemo() {
SomeRef r1 = new SomeRef(); // heap te tutulur.
SomeVal v1 = new SomeVal(); // stack te tutulur.
r1.x = 5; // Pointer ile o adresteki değer değiştirilir.
v1.x = 5; // değer direkt stack üzerinde değiştirilir.

Console.WriteLine(r1.x); // "5" gösterir.
Console.WriteLine(v1.x); // "5" gösterir.

SomeRef r2 = r1; // sadece refersı kopyalar (pointer)
SomeVal v2 = v1; // stack te yeni bir değişken oluşturup & değerini kopyalar.

r1.x = 8; // r1.x and r2.x dğerlerin ikisini değiştirir çünkü referans aynı yeri göstermektedir.
v1.x = 9; // Sadece v1.x'in değeri değişir, çünkü v2.x tamamen farklı bir değişkendir.

Console.WriteLine(r1.x); // "8" gösterir.
Console.WriteLine(r2.x); // "8" gösterir
Console.WriteLine(v1.x); // "9" gösterir
Console.WriteLine(v2.x); // "5" gösterir
}
r1, v1,r2 ve v2 değişkenlerinin bellek üzerindeki yerleri.

Sonuç olarak, programlama dillerinde veri tipleri, programların doğru çalışması için hayati öneme sahiptir. Refans ve değer tipleri, bir değişkenin değerini depolama ve yönetme şekilleri açısından farklılık gösterir. Değer tipleri, değişkenin değerini doğrudan depolar ve değişkenin bir kopyasını oluşturarak işlemleri gerçekleştirir. Refans tipleri ise, değişkenin bellekteki konumunu tutar ve değişken üzerinde işlemler gerçekleştirir.

.NET te tipler, uygulama geliştirme sürecinde çok önemli bir role sahiptir. Doğru tiplerin seçilmesi, uygulamanın performansı, ölçeklenebilirliği ve güvenilirliği açısından son derece önemlidir. Ayrıca, .NET platformunda sağlanan tipler, uygulamanın hatasız bir şekilde çalışmasına yardımcı olur.

Yararlanılan kaynaklar:
Microsoft CLR via C# Fourth Edition kitabı.

--

--

ismail kaşan
ismail kaşan

Written by ismail kaşan

I am a full stack developer since 2016.

No responses yet