![]() |
| | #1 (permalink) |
| Tür (type) konusundan bahsetmeden önce şunu bilmeniz ve aklınızdan çıkarmamanızda fayda vardır. C# nesne tabanlı bir dildir ve her şey bir nesnedir. Nesnenin yapısını da sınıflar oluşturur. (Sınıfları ilerleyen bölümlerimizde inceleyeceğiz.) C# da tüm sınıflar Object temel sınıfından türemiştir. Türler C# da ikiye ayrılır: Değer türleri ve referans türleri. Değer türleri ile referans türleri arasındaki farkı anlamak, C# da değişkenlerin bellek yönetiminin nasıl çalıştığını anlamak demektir. Değer türleri ve referans türleri aynı zamanda farklı iki bellek bölgesini anlatmaktadır: Stack ve Heap bellek bölgesi. Dolayısıyla değer türleri Stack bellek bölgesi ile ilişkili, referans türleri de Heap bellek bölgesi ile ilişkilidir. Şunu hiçbir zaman unutmamanız gerekir. Değer türünden bir değişken Stack bellek bölgesinde tutulur, Referans türünden bir değişkenin kendisi Stack bölgesinde tutulurken temsil ettiği nesne Heap bellek bölgesinde tutulur. Referans türlerinin ne anlama geldiğini öğreneceğiz ancak şu anda temel olarak değer türlerini anlamamız gerekmektedir. Değer türleri C# da kullanılan int, long, char gibi doğal türlerden oluşmaktadır. Net içinde tür yönetimi CTS ( Common Ttype System ) tarafından yönetilir. CTS. Net içinde kullanılan dillerin türlerini, dil bağımsızlığını sağlamak amacıyla ortak bir tür ile gösterir. Yani siz. Net içinde Visual Basic ya da C# ile program yazdığınızda kullandığınız türler CTS tarafından ortak bir türe dönüştürülmektedir. Örneğin; Visual Basic de kullanılan integer ve C# da kullanılan int türleri .Net içinde System.Int32 ile gösterilmektedir. Peki, System.Int32 nedir? Ne anlama gelmektedir. .Net çalışma ortamından her şey Object sınıfından türemiştir. Object sınıfından türemiş olan ValueType sınıfı, değer türleri için bir temel sınıfı oluşturmaktadır. Değer türleri de. Net içinde bir yapı olarak ( struct ) tanımlanmışlardır. Dolayısıyla. Net içinde kullanılan türlerin metotları ve özellikleri vardır. ![]() Resim 1.9: Int32 sınıfının metotları Eğer Visual Studio içinde boş bir proje oluşturur ve Int32. yazdığımızda Int32 yapısına ait metot ve elamanları görebiliriz. Ancak şu anda biz metot, özellik, veri elemanı gibi konulara girmiyoruz. Şu anda yabancıyız. Bunlar sınıflar konusunda anlatılacaktır. Ancak aşağıdaki üç maddeyi unutmamız gerekmektedir. C# kullanılan doğal türlerin aslında. Net içinde CTS tarafından diğer. Net dilleri ile uyumlu olması açısından ortak bir tür ile temsil edildiği, C#’da değer türleri ve referans türleri olarak iki türün olduğu, Değer ve referans türleri ile bağlantılı stack ve heap denilen iki bellek bölgesinin olduğu unutulmamalıdır. Aşağıdaki tabloda C#’da kullanılan türler ve bu türlerin. Net içindeki tanımları verilmiştir. ![]() Yukarıdaki tabloda gördüğümüz bool veri türü sadece true (doğru) ya da false (yanlış) değerini almaktadır. Yani bool türünden bir değişkene sadece true veya false değeri atanmaktadır. Aksi takdirde derleyici hata verecektir. Kod: bool flag; int a=1; flag = a; mesajı verecektir. Referans Türleri Nelerdir ? C#’da türlerin temel iki kısma ayrıldığını söylemiştik. Bunlardan birisi değer türleri ( Value Types ), diğeri de referans türleridir ( Reference Types ). Referans türleri adres tutan türlerdir. C#’da tüm nesneler referans türündendir. Dolayısıyla C#’da her şey bir nesne olduğuna göre ve Object sınıfından türetildiğine göre demek ki C# kullanılan tüm nesneler bir adres belirtirler. Hatırlayacağınız gibi değer türleri stack bellek bölgesinde tutulurdu. Referans türünden bir değişkenin kendisi stack bölgesinde tutulurken, nesnenin kendisi heap bellek bölgesinde tutulmaktadır. Yani siz referans türünden bir değişken tanımladığınızda değişkenin kendisi stack bellek bölgesinde tutulacak ancak değer olarak nesnenin heap bellek bölgesindeki yerinin adresini tutacaktır. ![]() Resim 1.6: Referans türlerinin hafızadaki durumu Yukarıdaki şekildeki gibi p referans türünden bir değişkendir ve stack bellek bölgesinden tutulmaktadır. Ancak p’nin içinde nesnenin kendisi yoktur. Hatırlarsanız değer türünden bir değişken gerçek değeri tutmaktaydı. p’nin içinde nesnenin heap bellek bölgesindeki adresi vardır. Peki, niçin böyle tasarlamış olabilir? Yani niçin nesneler heap bellek bölgesinde tutulmaktadır? Bunun cevabı CLR’ dir. Çünkü bellek yönetimi CLR ‘nin kontrolü altındadır. Kullanılmayan nesneler CLR yönetimindeki çöp toplayıcı mekanizma sayesinde (garbage collection ) heap alanından silinmektedir. C ve C++’da kullanılan referans gösteren & operatörü C#’da kullanılmamaktadır. Bununla birlikte göstericilerde C#’da normal olarak kullanılmamaktadır. Ancak bu C# ‘ın göstericileri desteklemediği anlamına gelmez. C# göstericileri desteklemektedir eğer bir gösterici kullanmak istiyorsanız o zaman yönetilmeyen kod (unmanaged) yazmak gerekir. Tabi bu durumda karşımıza farklı bir durum çıkar. Bellek yönetimi CLR (Common Language Runtime ) yönetimindedir. Heap bellek bölgesindeki geçersiz durumdaki nesneleri temizlemektedir. Bu yönetilen koddur. Burada belleğin temizlenmesi, bellekten ayrılan yerlerin geri bırakılması tamamen CLR’nin yönetimi altındadır. O zaman yönetilmeyen kod yazdığımızda CLR aradan çıkacaktır. Bellekten ayrılan yerlerin geri bırakılması programcıya kalacaktır. Referans türleri için heap bellek bölgesinde yer ayrımı yapıldıktan sonra geriye adres dönülmektedir. Bu adreste referans türünden bir değişkene atanmaktadır. Bu ana kadar incelediklerimize göre: İki tane temel tür vardır: Değer türleri ve referans türleri. Tüm doğal türler değer türüdür ve stack bellek bölgesinde tutulmaktadır. Tüm nesneler ise referans türündendir. Referans değişkenleri, nesnenin heap bellek bölgesindeki adresini tutmaktadır ve referans değişkenleri de stack bellek bölgesinde bulunmaktadır. Kaynak : MEGEP | Nesne Tabanlı Programlama 1
__________________ Beni Sevmek İçin Programlanma Devrelerini Yakarım ! | |
| | |
![]() |
| Etiketler |
| c# değişken türleri, c# değişkenleri, c# double, c# int, c# stack ve heap, c# string, c# veri türleri |
| Seçenekler | |
| Stil | |
| |