Ekin Karadağ

Programlama hakkında kendini geliştirmek isteyenlere, yazılım ile ilişkili üniversite bölümlerinde okuyan ve sektörde çalışanlara yönelik bu makalede İlkel Tipler (Primitive Type) ile Referans Tipleri’nin (Reference -Object- Type) bellekte tutulması arasında ne gibi farklar olduğunu ve bu farkların oluşturduğu bazı problemlerin nasıl önüne geçilebileceğine dair detayları bulacaksınız.

İlkel Veri Tipleri ile Referans Veri Tipleri arasındaki temel fark, bellek saklama biçimlerinde yatmaktadır.

İlkel Tiplerin ve Referans Tiplerinin bellekte tutuluş farkı nedir?

İlkel tipler bellekte yığın(stack) üzerinde tutulur.Değer girilmediği zaman varsayılan değerlere sahip olurlar.(Integer 0,Double 0.0 gibi.)

Referans türleri ise bellek alanında değer yerine adresi barındırarak, söz konusu adresin işaret ettiği lokasyonda veri depolarlar. Başka bir ifadeyle, bir ifade eğer referans türleri içeriyorsa, nesnenin işlenmesi, nesnenin adresi üzerinden gerçekleştirilir..

Peki bu farklılık bize ne anlatıyor?

İlkel tiplerde eşitlik ifadeleri, değişkenlerin içerdiği değerleri kontrol ederken , referans tiplerinde ise nesnelerin adreslerinin eşit olup olmadığına bakar.

Bu durumu kodda inceleyelim.

C#’da, bir dizi başka bir diziye atanırken, esasında dizinin bellek adresi iletilmiş olur. Bu durum, b dizisinin, a dizisinin aynı bellek bölgesini işaret edeceği anlamına gelir.

Dolayısıyla, b dizisinde yapılan değişiklikler, aslında bellekteki aynı diziyi etkiler ve bu değişiklikler a dizisine de yansır. Bu durum, a ve b dizilerinin aynı bellek bölgesini paylaştığını ifade eder.

Yani ifade etmek gerekirse, iki dizi arasında atama işlemi yapıldığında, yalnızca bellek adresi aktarılır ve bu nedenle her iki dizi de aynı verileri işlemek üzere bağlantılı hale gelir.(int dizisinin referans türü olduğunu unutmayalım)

Bu durumu yaşamak istemiyorsanız diziyi kopyalayıp üzerinde işlem yapabilirsiniz.Bu sayede dizi bellekte ayrı bir adresi işaret edeceği için yaptığınız değişikliklerde iki dizi aynı anda etkilenmemiş olur.

İlk bölümde ilkel tiplerin ve referans tiplerinin bellekte tutulma biçimleri arasındaki farkı inceledik. 2. bölümünde ise Equals ve GetHashCode metodlarımızın neden override edilmesi gerektiğine bakacağız.

Yazının devamı için takipte kalın.

Paylaş