27 Ekim 2014 Pazartesi

c# değer tipleri ve reference tipler

c# da  verileri işlerken  genel olarak önceden tanımlı  tipleri(int,string,bool, decimal vs..) yada kendi yazdığımız sınıfları kullanırız  her tip kendine has belli formatları kuralları içinde saklarken bellekte  işgal ettikleri alanlarda da farklılıklar gösterirler.Bugün  değer ve referans  tipleri  ram'da nasıl davranışlar gösterir buna bakıyor olacağız.

Değer Tipleri(value types)

bu tür tipler bellek bölgesinde stack alanını kullanırlar.stack  bölgesi değişken ismi ile birlikte o değişkenin taşıdğı değeri burada saklar.
mesala  bir sayıyı hafızada tutmak istediğimizi   varsayalım genelde bunu 
int sayi=atayacağımız değer seklinde kullanırız.

burada resimde yazılı alanların bulunduğu kısımda byte tipinden yas değişkeni tanımlanıyor ve ona 25 sayısı atanıyor stack alanında bulunan değişkenimiz nesnenin kendi degerini taşıyor.değer tiplerinde eşitlemeler atamalar yapılırken her bir degişken ayrı bir nesne olarak ele alınır örneğin
  int sayi=5;
  int sayi2=sayi;
 sayi=10;
 MessageBox.Show(sayi2.TosString());

burada 2 farklı değişken vardır ve sayi2 isimli değişken sayi isimli değişkenin değerini almaktadır yani oda 5e eşitlenmistir.sonraki satırda sayi değeri 10 olmuştur msgboxla sayi2 degerini aldığımızda ilk atamıs oldugumuz 5 degerini görmus oluruz. aşagıda reference tiplerinde durumun böyle olmadığını göreceğiz. şimdi temel veri tipleri ile ilgili bir kaç sey daha söylemek gerekecek.

c# içinde on beş temel veri tipimiz var  ve bunları  beş  bölume ayırabiliriz , hızlıca göz atalım ;

tam sayı tipleri :
byte,sbyte,short ,ushort,int,uint,long ve ulong ( 8 adet tam sayı tipi)
ondalıklı sayı tipleri :
float,decimal,double (3 adet ondalıklı tip)
Doğru yada yalnışı döndüren tip :
Boolean
Metin tipleri :
char ve string (2 adet)
nesne(her şey) tipi :
object ile her türlü  veri tipini taşıyabilirsiniz.


string ve object hariç diğer bütün tipler value type(değer tipi) olarak işleme konulurlar.string bir sınıf ve reference tipi olmsına karşılık yinede struct(yapı) yani değer tipi gibi davranıs gösterir.değişkenleri sınıf gövdesinde tanımlarsak field(alan)ismini alırken bir metot ,event vs sinif harici bloklar içinde tanımlarsak lokal değişken olurlar. sınıf gövdesinde tanımladığımız tipler  biz onlara değer ataması yapmasakta otomatik olarak varsayılan değerini alırlar.tam sayi tipleri için varsayılan değer 0 ken  boolean tip icin false  string ve object veri tipi için null dur.lokal degişkenlere (yani metot içi) başlangıç değeri verilmezse  o sekilde kalmasında sorun olmasada o değişkeni bir yerde kullanmaya çalışırsak derleyici tarafından programımız çalışmadan kırılacaktır.
değer tipleri önceden tanımlı olarak bellekte stack alanında yer aldıkları  için boyutları ve kapladıkları alanlar bellidir.int 4 byte yer kaplarken  long 8 byte dir veya short 2 byte gibi visual studioda tasarım esnasında programı uygulamaya geçireceğimiz zaman bellekte bu tiplerin ne kadar alan işgal edecekleri bellidir.reference tiplerde bu belli olmaz bunun açıklamasına birazdan bakmakla birlikte stack alanının heap alanına göre daha performanslı oldugunu  söylemeliyim


Referans Tipleri(reference types)

reference tipler new anahtar kelimesi ile  hayat bulurlar sadece veri tipini ve degişken ismini yazarsak  reference tiplere new anahtar kelimesini kullanmaz isek o değişken null olarak kalır.örnekte bunu göreceğiz gelelim  ihtiyaç duymamızın nedenine   sebebi , bu tipi kullanan veri tiplerinin boyutlarının önceden belli olmamasıdır.evet stack alanı hızlı ve performanslıdır ama sınırları vardır.object ve string tiplerin değer tipli olmadğını söyledik.sözü uzatmadan neden bu tipe ihtiyaç duyarız ona bakalım. studioda görsel arayüzü olan bir winform tasarımı yazdığınızı düsünelim bu bir veri tabanı uygulaması yada basit bir program olsun. Ara yüzde textboxlar kullandığımızı düşünelim (bilindiği gibi  textboxların sunduğu ve taşıdığı veriler string dir.)kullanıcıdan kisişel verilerini istedigimizde isimlerden tutunda ev adresi  size sunduğu iş deneyimi(cv vs..) boyutları önceden bilenemez .işte bu yuzden onceden boyutunu tahmin edemeyeceğimiz veriler için bu türleri kullanırız.class ve dizilerde reference tiplidir. bu türü temsilen tanımladığımız değişken bellegin stack adresinde dururken içerdiği değer heap alanındadır. stacteki değişkenimiz zaten refakatcidir ve sadece o değerin  adresine işaret eder şekil ile şematize etmek istersek




burada kullandığımız veri tipi stringtir ad isimli değişken  ramda stack(yığında)  durur fakat  ad isimli değişkenimiz içinde "sanalprogramalama" değerini taşımaz   sadece hafızada değer nerede bulunuyorsa o adres bilgisini kendinde tutar yani temsili olan 0f123h isimli  hafıza bilgisini tutar. eger bu bir  deger tipi olsaydı ad  isimli değişkenimiz icinde direkt olarak "sanalprogramlama"bilgisini taşıyor olacaktı. her ne kadar string tipler class olsada structlar gibi davranır demiştik.deger tipleri ile kullandığımız  örnegi şimdi reference tiplere uyarlayalım.önce bir ev sınıfı yazalım

class ev
    {

        public int odasayisi;
        public int fiyat;
        public string semt;
      
           
    }
sonra ev sınıfından 1 nesne 1 de işaretçi  oluşturalım
 {
            ev ilkev = new ev();
            ilkev.fiyat = 500000;
            ilkev.odasayisi = 3;
            ilkev.semt = "kadıköy";
            ev ikinciev = ilkev;
            ikinciev.semt = "şişli";

            MessageBox.Show(ilkev.semt);
}

ekrana "kadıköy "bilgisi yerine "şisli" yazar
 ilk ev ( ev ilkev = new ev()) komutu ile bellege cıkar. ikinci ev ise (  ev ikinciev = ilkev)
 new anahtar kelimesi olmadan ilkeve eşitlenir ama bu eşitlenme hali aslında ilkevin tutmus olduğu adresi tutmasıdır yani burada 2 ayrı nesne yok sadece 2 değişkenin aynı adres bölgesini tutma durumu var.işte değer tiplerinden farkı budur biz
int a=5 ;
int b=a; dediğimizde bellekte 2 tane int degişkeni olusmustur oysa ikinciev=ilkev() demekle ilkev ;ikincievin tuttuğu adresi taşımıs oluyor dolayısı ile adresi tutan degişkenlerden birisi o sınıf uzerinde bir değer değişikligi yapınca otomatikmen ikinciside de aynı değişikligi göruyoruz.
peki ikinciev=null dersek ne olur bu sefer ikinci ev boşa çıkmıs olur artık hafızadaki adresi işaret etmiyordur. dolayısı ile ikinciev yazıp (.)noktaya basınca ögelerine ulasabilir olsakta bunu stuido icinde kullandığımızda
"Object reference not set to an instance of an object". hatasını alırız yani nesne örnegi gecerli bir nesneye atanmadı seklinde özetlenebilir bu hata mesajı. burada new anahtar kelimesini kullanırsak artık bağımsız ikinci bir nesnemiz olur.bu sefer yaptıgımız degişiklikler diger  nesne uzerinde etkili olmaz.şimdilik bu kadarı yeterli diye düsünuyorum.daha sonra diziler ile bu konu hakkında örnekler görecegiz ve tür tipleri daha saglam temellerde zihnimizde yer alacaktır.bir sonraki yazıda görüşmek dileğiyle.

15 Ekim 2014 Çarşamba

Kurs programı Demo uygulaması


Merhaba arkadaşlar  bugun bir konu işlemek yerine üzerinde çalışma yaptığım bir projenin bazı görüntülerini paylaşmak istedim sizinle. program öğrenci ve personel kayıt ile alakalı  umarım beğenirsiniz.

bu açılış ekranımız.




buradan program içindeki  formlara ulaşabiliyoruz

   

menüler vasıtası ile de tablolara ulaşabiliyoruz




tablolardan personeli seçtik açıklamalarını görüyorsunuz




buda farklı bir tablo öğrenci tablosu




öğrenci tablosunu datagridview nesnesi ile görüyoruz





ve son olarak öğrenci tablosunun kayıt ekranındayız tablolarda görmüş olduğunuz resim ve bilgilerin gerçekle alakası olmadığını rastgele girilmiş olan bilgiler olduğunuda hatırlatayım. aşağıda programın kısa bir tanıtımını görebileceğiniz video linkini paylaşıyorum bir sonraki yazıda görüşene kadar sağlıcakla kalın

Program Tanıtım videosu

7 Ekim 2014 Salı

Yapıcı Metot Constructor

Metotlar konusunu işlediğimiz zaman metotların dörde ayrıldığından bahsetmiştim bunlardan ikisini (deger döndüren ,ve döndürmeyen)görmüştük.okumamış olanlar yada hatırlamak isteyenler  Buraya göz atabilirler.Bugun üzerinde çalışacağımız metot ise constructor.kelime anlamı yapıcı olan inşa eden anlamına gelen constructor c# de sınıfı kuran metottur.diger metotlardan farklı olarak dönüş tipi almazlar (string,int,bool vs..) dönüş tipi olmadığı gibi void anahtar kelimesinde kullanmayız.ama parametre alabilirler ve overload edilebilirler  yani aşırı yuklenebilinir.ayrıca sınıf ismi ilede aynı olmak zorundadır.sınıflara (class) ayrıntılı olarak baska bir konuda bakıyor olacağız. windows formu açarak ismini constructor verdim.solution explorer uzerinde proje adına sag tıklayarak add sekmesinden class seçiyorum.ismini constr verdim


resimle class tanımını kısmen görüyorsunuz


şimdi de bunu windows standart formu içinde inceleyelim formu cift tıklayarak kod kısmına geçelim


 formun içindeki kod kısmı bizim tanımladığımız clasa oranla daha az koda sahip.aklınız karışmasın.fark ettiyseniz en dışta namespace alanı var. bu visual studioda bir proje acarken  verdiğimiz isim .solution explorerde görünen proje ve solution ismidir. proje isminden sonra suslu parantezler acılp kapanır.onun içine clasımız yazılır claslar açık yesil renkte olurlar. bizim oluşturduğumuz clasın ismi constr  windows formunda ise form1 clasların suslu parantezleride kapanınca artık içine metot yada değişken tanımı yapabiliriz. metotlar class dısında olmaz arkadaslar claslarda namespaca dısında olmaz. sıralama once  name space> class>değişken yada metot seklindedir. yazılanları resimle anlatacak olursak


tekrar classımızın olduğu alana dönerek class bölumunundeki parantezlerin içine ctor yazarak iki kere tab tusuna basalım ctor code snippet denilen kısa bir yoldur studio nun editörü otomatik olarak kodu tamamlar

 tab tusundan önceki

tabtan sonraki hali .şimdide uygulama ile asıl konumuza gelelim aşağıda constr icindeki degişkenler ile sınıfın kurucu metodunu göruyorsunuz



burada hazır aşırı yuklenmekten bahsetmisken  diger metotları anlattığım derste buna değinmedigim icin şimdi 
tam zamanı diye düşünerekten bahsedeyim biraz.aşırı yuklenme bir metodu birden fazla sekilde çagırabilme kurabilme şeklidir diye ifade edebiliriz mesela buna örnek vermek gerekirse aşagıdaki resim size yol gösterici olacaktır


formun load eventinde(olay) messagebox sınıfımızı kullanırken degerlerimizi girerken aşagı dogru acılan oklarla  parametre sayıları farklı olan kullanımlardan birisini seceriz ve degerleri veririz işte bu bir metodun birden fazla şekilde kullanılabilmesi anlamına gelir zaten parametre sayıları aynı isimleri aynı veri tipleri aynı olan metot kullanmaya calıssak ide bize hata verecektir.metotların ya parametre sayısı değişik olacak ya veri tipi yani en azından bir imzası farklı olmak zorunda.şimdi constr adlı sınıfımızı yapıcı metot ile kurmayı görelim






bir sınıfı kurarken  eğer biz  müdahale etmezsek c# varsayılan olarak o  sınıfı new anahtar kelimesini kullanırken yapıcı  metot vasıtası ile kendisi kurar.fakat  metodu siz kurup parametreli hale getirirseniz c# otomatikten kontrolü size bırakır.  ve parametre kullanmadığınız metot artık geçersiz hale gelir. ancak siz  class içinde parametresiz olan kullanımıda koda eklerseniz  artık iki şekilde'de kullanımı mümkün olur.

yapıcı metotların özelliklerini tekrar hatırlayacak olursak;
  1. Public olmalıdır
  2. sınıf ismi ile aynı olmak zorundadır
  3. deger döndürmezler void ,string ,int vs gibi tipler almazlar
  4. parametreli yada parametresiz kullanımı mevcuttur.
parametre tanımlarsak varsayılan parametresiz kullanımı ortadan kalkar birde static olma özelliği vardırki o zaman public erisim belirleyicisini kullanmayız.bunu referans ve deger tipleri konusuna saklayalım.
resmi bol uygulaması az bir konu oldu.simdilik söyleyeceklerim bu kadar bir kaska konuda görusene kadar saglıcakla kalın.