30 Mart 2010 Salı

Object Oriented Programming (12) - Class içerisine Field ve Property Eklemek

Class içerisine Field ve Property Eklemek

Class içerisine field eklemek için, private veya protected access modifier ile bir değişken tanımlamak yeterli olacaktır.


Private modifier'ı ile tanımlanan field'a sadece bulunduğu Class içerisinden erişilebilir. Protected modifier ile tanımlanan field'a hem bulunduğu Class içerisinden hem de Inheritance (miras alındığı) yapılan Class içerisinde erişilebilir. protected access modief ile field tanımlama işlemi Inheritance (Miras Alma) konusunda detaylı bir şekilde ele alınacaktır.

Aşağıda örnekte Sifre Class'ımız için _uzunluk adında bir field tanımladık.

private int _uzunluk;

Şimdi _uzunluk field'ı içerisindeki değeri okuyabilen ve değiştirebilen bir Property yazalım. Propery oluşturmanın en kolay yolu, field satırının tamamını seçerek, sağ tuş kısayol menüsünden Refactor -> Encapsulate Field komutunu seçmektir. Bu işlem CTRL + R ve CTRL + E tuş kombinasyonlarına art arda basılarak da yapılabilir.




 
 
 
 
 
 
 
 
 
 
 
 
Açılan Encapsulate Field penceresinde ki Property Name değerine, .NET IDE'si tarafından varsayılan olarak Uzunluk adı verilmiştir.


OK butonu tıkladıktan sonra Sifre Class'ımızın görüntüsü aşağıdaki gibi olacaktır.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace SifreUretici
{


public class Sifre
{


//Field
private int _uzunluk;

//Property


public int Uzunluk
{


get { return _uzunluk; }


set { _uzunluk = value; }
}


}


}

Field ve Property isimleri belirlerken camelCase ve PascalCase isimlendirme standartlarını kullanırız. Bu standartlara göre, field ismi belirlerken alt tire(_) ile başlar, camelCase(uzunluk, adSoyad, tcKimlikNo gibi) isimlendirme standartı ile devam ederiz. Property isimlerinde ise PascalCase (Uzunluk, AdSoyad, TcKimlikNo) isimlendirme standartı kullanırız. Örnekler de bu standartlara uyulmaktadır.

23 Mart 2010 Salı

Object Oriented Programming (11) - Class Yazmak

Class Yazmak


Bir proje içerisine Class eklemek için Visual Studio . NET 2008'den faydalanabilirsiniz. Varsayılan olarak Visual Studio içerisinden eklenen her bir Class için ayrı bir kaynak dosya(.cs uzantılı) oluşturulur. Bu kaynak dosyanın içeriği aşağıdaki gibidir.


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ProjeAdi
{


class Class1
{

}


}


Bir kaynak dosya(.cs uzantılı dosya) içerisinde birden fazla Class ve Namespace tanımlaması yapılabilir. (Namespace bölümünde, içi içe Namespace kullanımına değinilmiştir.) Aşağıdaki örnekte, nsClassGrubu namespace içerisinde, Class1 ve Class2 adında iki Class tanımlaması gösterilmektedir.


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace nsClassGrubu
{


public class Class1
{


}


public class Class2
{


}
}

Projeye Class eklemek için, Solution Explorer penceresi içerisinde proje adı üzerinde sağ tıklayıp, çıkan kısayol menüsünden Add --> Class komutu seçilir. Açılan Add New Item diyalog penceresinden, Class'a bir ad vererek ekleme işlemi tamamlanır.

Ayrıca Project-->Add Class menüsünü içerisinden de Class eklenebilir.

Aşağıdaki örnekte SifreUretici adında bir Windows Application'a, Sifre adında bir Class eklenmektedir. Clasımızın tüm Solution üzerinden erişilebilir olması için, class adının önüne public access modifier'ının eklenmesi gerekmektedir. public access modifier'ı eklenmeyen claslar internal olacaktır.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace SifreUretici
{

public class Sifre
{


}


}


Önemli bir ayrıntıyı belirtmeden geçmeyelim. Oluşturulan her yeni projenin Root Namespace ve Assembly adı VS .NET IDE'si tarafından, proje adı üzerinden, varsayılan olarak verilmektedir. Yukardaki örnekte Sifre Class'ının bulunduğu root namespace adı(SifreUretici) NET IDE'si tarafından otomatik olarak verilmiştir. Eğer Assembly ve Root Namespace adını değiştirmek istiyorsanız, Solution Explorer penceresindeki proje adı üzerinde sağ tıklayıp, çıkan kısayol menüsünden Properties komutunu seçmelisiniz.

Son olarak Class, Field ve Property isimleri belirlerken, Sıfat veya Fiil değil İsim vermemiz önerilir. Örnek: Random, Textbox,Sifre gibi...

15 Mart 2010 Pazartesi

Object Oriented Programming (10) - Object Browser ve Class View Kullanmak

Object Browser ve Class View Kullanmak


Object Browser, Visual Studio .NET içerisindeki kütüphane(Assembly) ve Namespace'leri tüm alt öğeleriyle ile beraber hiyerarşik şekilde listeler.

Object Browser'ı görüntülemek için, View Penceresinden Object Browser komutunu verebilirsiniz veya Ctrl + Alt + J kısayol tuş kombinasyonunu kullanabilirsiniz.



Object Browser penceresinin sol üst köşesindeki Browse seçeneğinden, görüntülenmesini istediğimiz Framework versiyonunu seçerek, o Framework'e ait Assembly'leri listeleyebiliriz. Ayrıca "All Components" seçeneği ile tüm Assembly'lerin listelenmesini sağlayabiliriz.


Object Browser içerisinde Browse edilen seçeneğe göre tüm referenslar(Assembly) ve bu referanslarla ilişkili namespace'leri hiyerarşik bir şekilde listelenir.

Objects paneli içerisinden seçilen herhangi bir Namespace genişletilirse, içindeki tüm öğeler hiyerarşik şekilde listelenir. Bu öğelerin herhangi biri seçildiğinde, o öğeye ait tüm alt öğeler Object Browser penceresinin sol bölmesinde gösterilir.

Objects penceresinin sağ alt köşesinde ise, seçilen öğenin tanımını ve hangi namespace altında olduğu gösterilir.

Class View, Projeye ait tüm Namespace'lerle beraber, bu namespace'lere ait tüm Class ve alt öğelerini(field, property, method, event) listeleyen önemli bir penceredir.

Class View'ı görüntülemek için, View Penceresinden Class View komutunu verebilirsiniz veya Ctrl + Shift + C kısayol tuş kombinasyonunu kullanabilirsiniz.



 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Object Oriented Programming (9) - Encapsulation

Encapsulation


Genelde Class öğeleri(Property,Method), başka bir Class tarafından kullanılmak amacıyla yazılır. Bunun yanında bazı Class öğeleride, diğer öğelere yardımcı olmak amacıyla yazılır. Bu öğeler genellikle Class'ın iç işlerinde kullanılır. Belli bir Class'ı kullanan başka bir Class'ın, iç işlerde kullanılan bu öğeleri görmesi veya bilmesi gerekmez. Bu amaçla bazı property ve methodların, ait olduğu class dışından, erişimini sınırlama özelliğine encapsulation (kapsülleme) denir.

Öğeleri sadece bulunduğu Class içerisinde erişilebilir yapmak için(Encapsule yapmak için) private veya protected access modifier'larını kullanırız.

Örnekte ki GazaBas metodu, SuspansiyonSisteminiDevreyeSok(), KaportadaYagDolastir(), ve MotoraBenzinPompala() iç metodlarının sırayla çalıştırır. Ayrıca Araba Class'ından Object türetildiği zaman, sadece GazaBas() metodu gözükecektir.


public class Araba
{

public void GazaBas()
{


SuspansiyonSisteminiDevreyeSok();


YagDolastir(5);


MotoraBenzinPompala();
}

private void SuspansiyonSisteminiDevreyeSok()
{
}

private void YagDolastir(int lt)
{
}


private void MotoraBenzinPompala()
{
}


}

14 Mart 2010 Pazar

Object Oriented Programming (8) - Field, Property, Method, Event :

Field, Property, Method, Event :


Field : Class içerisinde tanımlanan ve değer saklamak amacıyla kullanılan Class öğeleridir. private modifier'ı (erişim denetleyicileri) ile tanımlandığı için, bu öğelere class dışından erişilemez.

Aşağıda ki örnekte Ad değeri saklamak için string türünde bir field tanımladım.

private string _ad;

Property : Field içerisindeki değerleri, okumak, yazmak veya değiştirmek amacıyla kullanılan Class öğeleridir. public modifier'ı ile tanımlandığı için, bu öğelere Class tanımlandığı zaman(Class'dan Object türetildiği zaman) erişilebilir. Property'nin asıl amacı Class içerisinde data depoladığımız Field değerini değiştirmektir.

Bir Property Get ve Set adında iki accessor'dan oluşur. Get accessor Field içerisindeki değeri okumak için, Set accessor ise Field değerini değiştirmek için kullanılır. Property içerisinde Get ve Set accessor'ları kullanarak property'nin tipini belirleriz. Eğer Property içerisinde hem Get hem de Set accessor'u kullanıyorsak propery'miz standart(hem değer yazılabilen hemde okunabilen) bir property olur. Sadece Get accessor'u kullanılıyorsak okunabilir, Set accessor'u kullanıyorsak sadece yazılabilir bir property olur.

Aşağıdaki örnekte _ad field'ı içerisindeki değeri okuyabilen ve değiştirebilen Ad isimli string bir property tanımladım.

public string Ad
{
get
{
return _ad;
}


set
{
_ad = value;
}
}


Aşağıdaki örnekte sadece okunabilir bir property tanımladım. Bu tür property'ler genellikle dışarıdan değiştirmesini istemediğimiz program tarafından otomatik olarak üretilen değerler için kullanılır.


//_sayi field'ın değeri herhangi bir metod içerisinden alınabilir.


private int _sayi = 20;

public int KayitSayisi
{

get
{
return _sayi;
}

}

Son olarak bir yazılabilir property örneği verelim. Bu tür property'lerde field'ın değeri sadece değiştirilebilir.

//_sayi field'ın değeri herhangi bir metod içerisinden alınabilir.


private int _sayi;

public int Uzunluk
{


set
{
_sayi = value;
}

}

Method : Method'lar, Object ve Class'a ait eylemleri(aksiyonları) gerçekleştirebildiğimiz kod bloklardır. Örneğin bir Sifre class'ında, Sifre üretme veya var olan şifreyi sıfırlama işlemleri method olarak sayılabilir(yazılabilir). 2 çeşit method tipi vardır. Bunlar ;

• Geriye değer döndürmeyen method(void) : Bu tür method'lar sadece içerisindeki kod bloğunu çalıştırır.

Aşağıdaki örnekte string değer alan, aldığı bu değeri MessageBox üzerinde gösteren ve geriye değer döndürmeyen bir method tanımı yapılmıştır.

public void MesajGoster(string mesaj)
{
MessageBox.Show(mesaj);
}


• Geriye değer döndüren method(function) : Bu tür method'lar da tıpkı void gibi içerisindeki kod bloğunu çalıştırırlar. Fakat void'lerden farklı olarak geriye bir değer(return deyimi ile) döndürürler. Bu değer reference type veya value type türünden olabilir.

Aşağıdaki örnekte, geriye 10 karakter uzunluğunda string değer döndüren, bir method tanımı yapılmıştır. Bu method ile karakterleri harf ve rakamdan oluşan rastgele şifreler üretilmektedir.

public string SifreUret()
{
char[] karakter = {'A','B','C','D','E','F','G','H','I', 'J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z', '1','2','3','4','5','6','7','8','9','0','a','b','c','d','e','f','g', 'h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x', 'y','z'};

Random rnd = new Random();
int RastgeleSayi;
string sonuc = null;
for (int i = 1; i <= 10; i++)
{
RastgeleSayi = rnd.Next(0, karakter.Length - 1);
sonuc += karakter[RastgeleSayi].ToString();
}


return sonuc;


}

Method içersisindeki işlemleri gerçekleştirirken field değerlerinden faydalanabiliriz. Örneğin yukardaki method da kullandığımız 10 karakterlik sabit şifre uzunluğunu, Uzunluk adında bir property'den alarak değişken hale getirebiliriz. Böylece SifreUret methodumuz, girilen şifre uzunluğuna göre otomatik olarak şifre üretir.

Aşağıdaki örnekte Uzunluk propertisinin ve SifreUret methodunun beraber kullanımı gösterilmektedir.

//Field = Class içerisinde değer saklamak için kullanılır


private int _uzunluk;

//Property


public int Uzunluk
{
get { return _uzunluk; }
set { _uzunluk = value; }
}


public string SifreUret()
{
char[] karakter = { 'A','B','C','D','E','F','G','H','I',
'J','K','L','M','N','O','P','Q','R',
'S','T','U','V','W','X','Y','Z',
'1','2','3','4','5','6','7','8','9','0',
'a','b','c','d','e','f','g','h','i','j','k',
'l','m','n','o','p','q','r','s','t','u','v',
'w','x','y','z','!','@','?','$'};


Random rnd = new Random();
string sonuc = null;

for (int i = 1; i <= _uzunluk; i++)
{
int rastgeleSayi = 0;
rastgeleSayi = rnd.Next(0, karakter.Length - 1);
sonuc += karakter[rastgeleSayi].ToString();
}


return sonuc;
}

Metot Overload

Metot Overload (metodları aşırı yükleme), bir metodun birden fazla, farklı imza ile tanımlanmasıdır. Daha farklı bir anlatımla aynı isimli metodun birden fazla farklı parametre imzası almasıdır.

Güncel hayattan bir örnek ile konuyu açalım. Biri size “Benim doğum tarihim 6.5.1980. Ben kaç yaşındayım?” diye sorabilir. Aynı soru “Benim doğum yılım 1980. Ben kaç yaşındayım?” olarak da sorulabilir. Aslında burada iki farklı hesaplama söz konusudur. Birincisinde günümüzdeki yıldan verilen değerdeki yıl bulunarak çıkartılır. İkincisinde ise günümüzdeki yıldan direk verilen değer çıkartırılır. Bu iki farklı hesaplama dolayısı ile iki farklı metot gerektirir. Bu metotları kod olarak yazmak istersek şu şekilde yazabiliriz:

int TariheGoreYasHesapla(DateTime tarih)
{
int sonuc;
int dogumYili=tarih.Year;
sonuc = DateTime.Now.Year - dogumYili;
return sonuc;
}


int YilaGoreYasHesapla(int yil)
{
int sonuc;
sonuc = DateTime.Now.Year - yil;
return sonuc;
}

Ancak görüldüğü gibi bu iki metotun da amacı aynıdır: Yaş Hesaplamak! C#, parametrelerin imzası ayrı olduğu sürece birden fazla metota aynı ismi verme olanağını tanır.

Bu bilgi ışığında kodlar şu şekilde yazılabilir:

int YasHesapla(DateTime tarih)
{
int sonuc;
int dogumYili=tarih.Year;
sonuc = DateTime.Now.Year - dogumYili;
return sonuc;
}


int YasHesapla(int yil)
{
int sonuc;
sonuc = DateTime.Now.Year - yil;
return sonuc;
}

Artık sadece YasHesapla ismi kullanılarak iki metot da çağırılabilir. Eğer metoda DateTime tipinde bir değer gönderirseniz ilk metot, int veri tipinde değer gönderirseniz ikinci metot çalışacaktır. Visual Studio’da bir metotun kaç overload’u olduğu görülebilir. Ayrıca bu metotun overload’larının istediği imzalar IntelliSense’de aşağı-yukarı ok tuşları ile gezilebilir.










Overload’ların kullanılma nedeni yazılımcıyı metot kargaşasından kurtarmaktır. Aşağıdaki şekilde görüldüğü gibi MessageBox sınıfının Show metodunun 21 tane overload’ı vardır.

MessageBox’ın kullanımını hatırlayın. Bazen sadece ekranda mesaj olarak gözükmesi gereken metni verirken, bazen metnin yanında pencere başlığını, bazen pencerede gözükecek ikonu, bazen de Yes-No, OK gibi gösterilecek düğmeleri veriyoruz. Aslında bunların hepsi ayrı ayrı metotlardır. Eğer MessageBox’ın Show metotlarında overload kullanılmasaydı .

MessageBox.SadeceMetinGoster(“Merhaba Dünya”);
MessageBox.MetinVeBaslikGoster(“Merhaba Dünya”,”İlk Programım”);
MessageBox.MetinBaslikVeDugmeGoster(“Merhaba Dünya”,”İlk Programım”, Buttons.YesNo);

gibi kargaşaya yol açan bir çok metot kullanılacaktı. Oysa overload sayesinde sadece Show metodunu kullanıp parametrelerini değiştiriyoruz.

11 Mart 2010 Perşembe

Object Oriented Programming (7) - Access Modifiers(Erişim Belirleyicileri)

Access Modifiers(Erişim Belirleyicileri) :


Class yazmaya başlamadan önce Access Modifier'ları(Erişim Belirleyicileri) incelememiz gerekir. Access Modifier, oluşturduğunuz Class veya Class içindeki öğelerin(Property,Method ve Eventları) erişim seviyelerini belirlemek için kullanılan anahtar deyimler(kelimler) grubuna, toplu olarak verilen isimdir.

public : Her yerden erişilebilir. Class ve Class içindeki öğeler için kullanılabilir.

private : Sadece class içerisinden erişim yapılabilir. Class dışından erişim yapılamaz. private class öğelerini, bu class’ı inherit eden class’larda kullanamaz.

Eğer private bir class sözkonusu ise ancak aynı namespace içindeki classlar bu class’ı kullanabilir. Class’lar için geçerli olan bu durum field, method ve property’ler içinde geçerlidir.

protected : protected’ın kullanımı private’a benzemektedir. Yani yine sadece o class’ta kullanılabilir. Ama bunun yanında bu class’ı inherit eden classlarda bu property ve method'lardan(öğelerden) yararlanabilir. Bunun dışında hiçbir şekilde kullanılamaz.

Ayrıca sadece field, property ve method'lar protected tanımlanabilirler, class’lar protected tanımlanamazlar.

internal : internal olarak tanımlanan öğeye, bulunduğu assembly’nin (Dll,Exe) içerisinden erişilebilir, assembly dışarıdan erişilemez.

protected internal : protected internal access modifier'ı, protected ve internal access modifier'ların Veya (OR) işlemiyle birleştirilmiş halidir. protected internal olarak tanımlanmış öğeye, tanımlandığı class’ın içinden ve o class’tan türetilmiş diğer class’lardan erişilebilir. Ayrıca, aynı assembly içinde olmasa bile, tanımlandığı class’tan türetilmiş diğer class’ların içinde de erişilebilirdir.

Object Oriented Programming (6) - OOP Kavramları - Class ve Object

Class ve Object:


Class yazmaya başlamadan önce class ve object kavramlarını konuşalım. Class'a taslak ,object’e ise somut ürün diyebiliriz. Class ana hatları belirtirken object ise bu ana hatlardan yararlanılarak oluşturulmuş nesneleri ifade eder.

Class’ları bina yapımındaki krokiler olarak , binaları ise bu krokilerden türetilen object'ler olarak yorumlayabiliriz. Class’ların belirli Property,Method ve Eventları vardır. Ama bu öğelere (Property,Method ve Eventları) herhangi bir bilgi yerleştirilmesi sözkonusu değildir. Bu bilgileri yerleştiren Object’lerdir. O zaman binanın taslağından (class) yola çıkarsak her binanın(objenin) rengi farklı olacaktır. Çünkü her objenin kendi özellikleri sözkonusudur.

Class ve Object arasında ilişki aşağıdaki şekilde gösterilmektedir. Class’lar bir kere oluşturulur(Örneğin bir Araba Modeli) ve bu class’tan yararlanılarak bir çok object(Araba) oluşturulur.



 
 
 
 
 
 
 
 

Object Oriented Programming (5) - OOP Kavramları - Namespace

Namespace :


.NET içerisindeki tüm Assembly'ler(kütüphaneler), .NET Framework ismi verilen ortak çatı altında toplanır. Bu çatı altındaki tüm Assembly'ler amaçlarına göre namespace denilen isim alanı altında gruplandırılır. Bu isim alanı(namespace) içerisinde Class ve Interface'ler bulunur.

Örneğin, .NET içerisinde veritabanı uygulamaları geliştirmek için System.Data.dll kütüphanesine ihtiyaç duyulur. Bu kütüphane Visual Studio .NET içerisindeki tüm proje şablonlarında otomatik olarak yer alır. System.Data.dll kütüphanesi içerisinde;

• System.Data
• System.Data.Common
• System.Data.SqlClient
• System.Data.OleDb
• System.Data.SqlTypes
• System.Xml

namespace'leri yer alır.

Yeni Namespace Eklemek:

Yeni bir namespace oluşturmak için namespace anahtar kelimesi kullanılır.

namespace NameSpace_adı
{
...
}

Aşağıdaki örnekte NSBilgeAdam isminde bir namespace tanımladım ve bu namespace içerisine Egitim ve Ogrenci isminde claslar ekledik.

namespace NSBilgeAdam
{

//BilgeAdam namespace kullanılacak.
//Class ve Interface tanımlanabilir.

class Egitim
{


//...


}


class Ogrenci
{


//…


}

// vs...


}

BilgeAdam namespace içindeki Ogrenci Class'ını kullanmak için, Class ismini namespace ile birlikte belirtmek gerekir.

bilgeadam.NSbilgeadam.Ogrenci yeniogrenci;
yeniogrenci = new bilgeadam.NSbilgeadam.Ogrenci() ;

Proje ile aynı isime sahip bir namespace .NET derleyicisi tarafından yeni oluşturulan tüm projelere varsayılan olarak eklenir. Bu genel namespace'e root namespace denir. Dolayısıyla kendi oluşturduğumuz namespace'leri kullanırken, namespace'imizin önüne root namespace'in adını eklemeniz gerekmektedir.

Herhangi bir namespace içerisinde birden fazla alt namespace tanımlanabilir. Örnekte NSBilgeAdam namespace içerisine Idari, Egitim ve Ogrenci adında üç ayrı namespace ekledim.

namespace NSBilgeAdam
{


//BilgeAdam namespace kullanılacak.


//Class ve Interface tanımlanabilir.


namespace Idari
{


class Personel
{


}


}


namespace Egitim
{


class Grup
{


}


}


namespace Ogrenci
{


class Bilgi
{


}


}


// vs...


}


Projeye Namespace Dâhil Etmek

Bir namespace içerisinde yer alan Classları kullanmak için, Class'ın bulunduğu Assembly'nin yolunu eksiksiz olarak belirtmek gerekir. Ancak bu şekilde kullanımlar, kodun okunmasını oldukça zorlaştırır. Örnekte Classlar bu yöntemle tanımladık.

bilgeadam.NSbilgeadam.Idari.Personel kisi1;
kisi1 = new bilgeadam.NSbilgeadam.Idari.Personel();


bilgeadam.NSbilgeadam.Ogrenci.Bilgi Ogrencibilgi;
ogrencibilgi = new bilgeadam.NSbilgeadam.Ogrenci.Bilgi();

Her Class için Assembly yolunun tekrarını ortadan kaldırmak için, using anahtar sözcüğü kullanılır. using sözcüğü ile eklenen namespace'lerin Class'larına, proje içerisinden doğrudan erişilebilir.

Örnekte NSBilgeAdam namespace'nin projeye dâhil edilmesi gösterilmektedir.

using bilgeadam.Nsbilgeadam;

NSBilgeAdam namespace'nde bulunan bir Class'ı kullanmak için sadece ismini yazmak yeterli olacaktır.

Ogrenci.Bilgi ogrenciBilgi = new ogrenci.Bilgi();

İç içe namespace'lerin kullanımında, içteki namespace kolayca erişmek için kısaltmalar kullanılabilir. Örnekte, NSBilgeAdam namespace içerisindeki Ogrenci namespace'ine erişim gösterilmektedir.

using ogr = bilgeadam.NSBilgeadam.Ogrenci;


Public Class Form1:System.Windows.Forms.Form
{


// ...


ogr.Bilgi OgrBilgi = new ogr.Bilgi();


}

Object Oriented Programming (4) - OOP Kavramları - Assembly

Assembly :

Visual Studio .NET ortamında geliştirilen uygulamalar derlendiğinde, .exe veya .dll uzantılı dosyalar oluşur. .NET’in otomatik olarak oluşturduğu bu dosyalara assembly denir. Assembly içerisinde dosyaya ait başlık, açıklama ve telif hakkı gibi kritik bilgiler tutulur.

Visual Studio .Net içerisinde geliştirilen bir projeye, farklı kişiler tarafından geliştirilmiş assembly’ler eklenebilir. Özellikle gelişmiş projelerde assembly’ler ayrı programcılar tarafından yazılarak ortak bir proje altında toplanabilir.

Proje şablonlarında en çok kullanılan Assembly’ler şunlardır:

 System: Programın çalışması için gerekli en temel referanstır. System.dll kütüphanesi içerisinde tutulur.
 System.Data: Veritabanı bağlantılarının yapılması için gerekli referanstır. System.Data.dll kütüphanesi içerisinde tutulur.
 System.Drawing, System.Windows.Forms: Windows form ve kontrollerini içeren referanstır. System.Drawing.dll ve System.Windows.Forms.dll kütüphaneleri içerisinde tutulur.
 System.XML: XML teknolojisinin kullanılmasını sağlayan referanstır. System.XML.dll kütüphanesi içerisinde tutulur.

9 Mart 2010 Salı

Object Oriented Programming (3) - ValueType ve Reference Type Arasındaki Farklar

ValueType ve Reference Type Arasındaki Farklar





Şimdi örnek ile Value Type ve Referens Type'ı inceliyelim.

Örnekte, int türünde a ve b adlarında iki Value Type değişken tanımladık. Değişkenlere başlangıç değeri atadıktan sonra a değişkenin değerini b değişkenine atadık. Sonra her iki değişkeni de yazdırdık. Her iki değişken Stack de ayrı alanlarda depolandığı için birbirinden bağımsız kendi değerlerini depolayabildiler.

int a = 0;
int b = 0;
a = 10;
b = a;
b += 5;
MessageBox.Show("a=" + a.ToString());
MessageBox.Show("b=" + b.ToString());

Örnekte StringBuilder Class'ından sb1 ve sb2 adlarında iki Reference Type tanımladık. Daha sonra StringBuilder Class'ından türettiğim sb1 isimli nesnemin içerisine (Append Metodunu kullanarak) "Tamer " değerini ekledik ve sb1 isimli nesnemi sb2 nesnesine atadık. Atama işleminden sonra sb1 ve sb2 nesneleri Stack bölümünde aynı adresi kullandıkları için nesneler birbirlerine eşitlenirler.


StringBuilder sb1 = new StringBuilder();//RAM’de heap oluştur
StringBuilder sb2 = new StringBuilder();//RAM’de heap oluştur
sb1.Append("Tamer "); //sb1 e değer ata
sb2 = sb1; //sb1 değerini sb2 ye ata
MessageBox.Show("string 1=" + sb1.ToString());//sb1 oku
MessageBox.Show("string 2=" + sb2.ToString());//sb2 oku
sb1.Append("ŞAHİNER"); //sb1 değerine ekleme yap
MessageBox.Show("string 1=" + sb1.ToString());//sb1 oku
MessageBox.Show("string 2=" + sb2.ToString());//sb2 oku

Object Oriented Programming (2) - Common Type System(CTS)

Common Type System(CTS)

OOP'a başlamadan önce Visual Studio .NET de kullanılan veri tiplerinden bahsedelim. .NET içerisinde kullanılan tiplerin tümü ortak bir isim altında toplanır. Bu isme "Common Type System(CTS)" denir. CTS iki bölümde incelenir. Bunlar;

• Value Type
• Reference Type

dır.

Value Type : Bu türdeki veri tiplerinin en önemli özelliği RAM de Stack bölümünde saklanmasıdır. Value Type en iyi örnek string hariç standart değişken tipleridir.(int,long,bool).















Value Type değişkenler tanımlandığı zaman RAM de(Stack bölümünde) ,değişken tipinin boyutları ölçüsünde, belirli bir alan(int için 4 byte, long için 8 byte gibi) reserve edilir. Değişkenin kullanımı sona erdiği zaman o değişken için ayrılmış alan serbest bırakılır.


Reference Type : Bu türdeki veri tiplerinin en önemli özelliği Ram de Heap bölümünde saklanmasıdır. Reference Type'ları C++'da ki Pointerlara benzetebiliriz. Reference Type en iyi örnek Class'lardır.

 
 
 
 
 
 
 
 
 
 
 



Value Type değişkenlerin en önemli özelliği bu tür değişkenlerin sınırlarının belli olmasıdır. Yani int bir değişken tanımladığınız anda alacağı değer yaklaşık olarak -2 Milyar ile + 2 Milyar arasında(-2.147.483.648 ile +2.147. 147.483.647) bir değerdir. Oysa Referens Type değişkenlerin alacağı değerler değişebilir. Bu durumun en güzel örneği string değişkenlerdir. Herhangi bir string değişkenin değeri program içerisinde sürekli değişebilir. Özellikle bir Text dosyadan satır satır veri okuyorsanız, her okuduğunuz satır için string değişkenin değeri farklı olacaktır. Bu yüzden Referens Type değişkenler RAM'de Heap bölümünde tanımlanır. Çünkü Heap bölümü program çalışırken, belirli bir bölümü reserve edebilme ve serbest bırakabilme işlemlerini yapabilen genel bir bölümdür.


Referens Type değişkenlerde, değişkenin kendisi Stack bölümünde, değişkenin referansı ise Heap bölümünde saklanır. O zaman değişkenin değeri, ilgili referansın tutulduğu Heap bölümünde saklanır. Heap bölümü değişkenin alacağı değerlere göre büyüyüp küçülebilir, fakat Stack bölümü sabittir.

Bir örnekle bu durumu açıklamaya çalışalım. Örneğin string bir değişken(string metin;) tanımladığınız anda stack bölümünde 4 byte'lık(İşletim Sistemini 32 bit varsaydım) yer reserve edilir. Tanımladığımız metin değişkenine bir değer atamadığımız sürece Heap bölümünde bir alan reserve edilmez.

Şimdi bu değişkene bir atama işlemi yapalım.

metin = "tamers";

Artık Heap bölümünde string ifadenin tamamı için bir alan reserve edildi. Böylece metin değişkenimizin kendisi Stack, değişkenin referansı ise Heap bölümünde depolanır.

Önemli bir noktadan bahsetmeden geçmeyelim. Null string ile boş string aynı şey değildir. Bir string null ise stack bölümünde saklanan değer yoktur ve heap bölümünde bir alan reserve edilmez. Fakat değişkeninizin değeri boş bir string'e(metin ="";) eşitse, değişkenimizin kendisi Stack, değişkenin referansı ise Heap bölümünde saklanır.

İki veri türü arasındaki bir farkta bu verilerle işimiz bittiğinde geri iade ediliş şekilleridir. Value Type'lar ile işimiz bittiğinde bunların Stack de kapladıkları alanlar otomatik olarak Stack'lere geri verilir. Ancak Referans Type'larda sadece Stack'lerde ki başvuru sisteme geri verilir. Verilerin tutulduğu Heap'de ki alanlar, Garbage Collector’un denetimindedirler ve ne zaman sisteme iade edilicekleri tam olarak bilinmez.

 
 
 
 

Object Oriented Programming (1) - Giriş

Object Oriented Programming(Nesne Tabanlı Programlama) - OOP


OOP, günümüzde bir çok programlama dilinin desteklediği bir yaklaşımdır. Bu yaklaşımın amacı uygulama geliştirmeyi daha dinamik ve hızlı bir hale getirmektir.

OOP ilk olarak 1960 yılların sonunda kullanılmaya başlanmıştır. Gitgide artmaya başlayan yazılım karmaşaları ve boyutları OOP'un doğmasına sebep olmuştur.

OOP'dan önce, procedurel programlama olarak adlandırdığımız, bir komut dizisi veya bir fonksiyon kümesi içeren yaklaşımlar(C# için void ve fonksiyon diyebiliriz) kullanılmaktaydı. Oysa OOP ile artık birbiriyle etkileşim içersinde olabilen ve kendi içerisinde veri işleyebilen, bir nesne kümesi modeli kullanılmaya başlanmıştır.

OOP'un başlıca önemli özelliklerine;

• Yazılımda moduler yapı sağlama
• Bilgi gizleme(Information Hiding)
• Veri Soyutlama (Data Abstraction) (Bir nesnenini belirli değerlerini kapsülleyerek dışarıdan ulaşma imkanı verilmemesi)
• Çok Şekillilik (Polymorphism)
• Kalıtım (Inheritance)
• Birden çok kişinin aynı anda uygulama geliştirmesini kolaylaştırma

sayılabilir.

OOP'un bize sağladığı en önemli avantajlara;

• Yeniden kullanılabilirlik. (Hem aynı uygulamalarda hem diğer uygulamalarda)
• Versiyonlama (Uygulamaların yeni versiyonlarının hazırlanmasını hızlandırır.)

sayılabilir.

Object Oriented Programming(OOP) Makaleleri

Object Oriented Programming(OOP) ile ilgili bir dizi makale yazmaya başladım. Seri halinde devam edecek makalelerim toplam 4 bölümden oluşacak. Bunlar;

  • Temel OOP Kavramları(Class,Struct v.s.)
  • Inheritance
  • Interface
  • Event ve Delagate