27 Mart 2014 Perşembe

İnternet ve eposta yazılımlarını Kullanmak

                         MİCROSOFT OUTLOOK 2010

Outlook yalnızca e-pota göndermenize, almanıza ve yönetmenizi sağlayan bir yazılım değildir, aynı zamanda takviminizi ve arkadaşlarınız iş ilişkileriniz gibi kişileri de yönetmenizi sağlar.

Bunlara ek olarak, takviminizi internet aracılığıyla aileniz ve çalışma arkadaşlarınızla paylaşabilirsiniz. Outlook ürüne belge, elektronik tablo, sunu oluşturma ve e-posta yönetme için farklı türden yazılımların birleştirildiği “Office” ürün paketinin bir parçasıdır.



Outlook’ da Dosya , Giriş , Gönder, Klasör, Görünüm sekmeleri bulunmaktadır.







Dosya Sekmesi

Dosya sekmesinde, Outlook Hesap Ayarlarına erişebiliriz. Açılacak olan e-posta hesabını buradan değiştirebilir yenisini ekleyebiliriz.




Giriş Sekmesi

Giriş sekmesinde Gelen Kutusu, Gönderilmiş Öğeler, Silinmiş Öğeler, bulunaktadır.

Gelen Kutusu: E-posta hesabına karşı taraftan gönderilmiş olan maillerin bulunduğu kısımdır.
Gönderilmiş Öğeler: Karşı tarafa gönderilen maillerin bulunduğu kısımdır.
Silinmiş Öğeler: Outlook hesabından silinmiş maillerin bulunduğu kısımdır.
Taslaklar, Arama Klasörleri, Önemsiz E-Posta, RSS akışları da bulunmaktadır.










 Posta kısmına tıklandığında maillerin olduğu kısım açılmaktadır.
Aynı şekilde Takvim Kişiler Görevler kısımlarına tıklandığında ilgili kısımlar açılmaktadır.









Outlook yazılımında sadece mail değil takvim ve kişiler bölümleri de yer almaktadır.



Giriş Menüsü;
Yeni mail göndermek için Yeni E-posta sekmesinde imkan sağlanır. E-postalarla ilgili işlemlerin bulunduğu kısımdır.



Klasör Menüsü:
Klasör menüsünde Gelen Kutusu, Gönderilmiş öğeler gibi klasör ekleyebiliriz. Kısacası Outlook’ un klasör ayarlarını yapabileceğiniz yerlerdir.





Görünüm Menüsü
Görünüm menüsünde Outlook’un arayüzü ile ilgili ayarların bulunduğu kısımdır.


Bileşenler Oluşturmak

BİLEŞENLER OLUŞTURMAK


Metotlar İle Kapsülleme

Alanları gizlemenin (kapsüllemenin) yollarından bir tanesi de metotları kullanmaktır. Bilgisayar ekranındaki bir noktayı x ve ye koordinatları ile gösteren bir yapı olsun. X koordinatı için geçerli aralığın 0 ile 1280 arasında olduğunu y koordinatları ise geçerli aralığın 0 ile 1024 arasında olduğunu varsayalım.

struct  EkranPozisyonu{
Public EkranPozisyonu(int x, int y)
this.X=aralikDenetleX(x);
this.Y=aralikDenetleY(y);
}
public int X;
public int Y;
private static int aralikDenetleX(int x){
if(x<0 || x>1280)
{
throw new ArgumentOutOfRangeException(“X”);
}
return x;
}
private static int aralikDeneleY(int y){
if(y<0 || y>1024)
{
throw  new ArgumentOutOfRangeException(“Y”);
}
return y;
}
}

Bu yapı ile ilgili veri tipi özel (private). Ortak (public)  veri kullanımı sınırlılıkları olan bir uygulamadır. Çünkü kullanımı denetlemez. Örneğin Ekran Pozisyonu kurucu aralığı parametreleri denetler. Ancak böyle bir denetim ortak alanlara (X ve Y) uygulamaz.


Özellikleri Kullanma

Bir özelliği bir deyimde kullandığınızda onu ya bir okuma bağlamında (değerini değiştiremediğiniz durumlar) ya da bir yazma bağlamında (değerini değiştirdiğiniz durumlar) kullanırsınız.
Bir özelliği okuma bağlamında kullandığınızda derleyici alan benzeri kodunuz otomatik olarak o özelliğin get erişimcisine yapılan bir çağrıya dönüştürür. Benzer biçimde de bir özelliği yazma bağlamında kullanırsanız derleyici kodu otomatik olarak set erişimcisine yapılan bir çağrıya dönüştürür.


Sadece Okunabilir

Sadece get erişimcisi olan özellikleri bildirmesine izin verir. Bu durum özelliği yalnızca okuma bağlamında kullanabilirsiniz.

Örnek:

struct EkranPozisyonu2
{

public int X
{
get
 {
 return this.X;
}
}
}

X özelliği bir set erişimcisi içermez. Bu yüzden x değişkenine değer atayarak bir yazma bağlamında kullanmak için yapılan her girişim başarısız olur.


Sadece Yazılabilir

Benzer biçimde yalnızca set erişimcisi olan bir özellik bildirebilirsiniz. Bu durumda özelliği yalnızca yazma bağlamında kullanabilirsiniz.

Örnek:

struct EkranPozisyonu2
{
 ……..
public int X
{
set
{
this.X=aralikDenetlex(value);
}
}
}

Arayüz Özellikleri

Arayüzler yöntemlerin yanında özellikler de belirtebilir .Bunu yapmak için get veya set anathar
sözcüğü kullanılır. ;Ancak arayüzler uygulama kodları barındıramayacakları için get ve set erişimcilerinin
gövdeleri yerine noktalı virgül kullanılır.

Örnek:

interface IEkranPozisyonu
{
int X { get; set;}
int Y {get; set;}
}

Bu arayüzü kullanan tüm sınıf ve yapılar get ve set erişimci yöntemleri ile birlikte X ve Y özelliklerini de kullanmak zorundadır.

Otomatik Özellikler

Özelliklerin başlıca amacı alanların kullanımı uygulamasını dış dünyadan saklamaktadır. Özelliklerin amacına yönelik kullanımı önemlidir.

Veriyi ortak (public) alanlar olarak göstermek yerine özellikler tanımlamanız için en az iki neden vardır.
Uygulamalarla Uygunluk: Alanlar ve özellikler, derlemelerde farklı meta veri kullanarak kendilerini ortaya koyar. Bir sınıf geliştiriyorsanız ve ortak alanlar kullanmaya karar verdiyseniz bu sınıfı kullanan bir uygulama, alanlar olarak bu öğelere başvuracaktır. Bir özelliği okurken ve yazarken kullandığınız söz dizimini bir alanı okumak ve yazmak için kullanabilseniz de derlenen kod gerçekte çok farklıdır.
Arayüzlere Uygunluk: Bir arayüz gerçekleştiriyorsanız ve arayüz özellik olarak bir öğe tanımlıyorsa özellik sadece özel (private) alanlardaki veriyi okuyor ve yazıyor olsa bilr arayüzdeki şartlara uyan bir özellik yazmanız gerekir.


Özellikler İle Nesneleri Başlatma

Bir nesneyi başlatmak için kurucuları tanımlamayı öğrenmiş olmalısınız. Bir nesne birden çok kurucuya sahip olabilir ve bir nesnedeki farklı öğeleri başlatmak için çeşitli parametrelerle kurucular tanımlayabilirsiniz. Ancak bu pratik bir yaklaşım değildir.
Bir sınıfın kaç adet alan içerdiğine ve alanları başlatmak için istediğiniz çeşitli bileşimlere bağlı olarak çok sayıda kurucu yazmaya son verebilirsiniz. Bir sınıf oluşturulduğunda, set erişimlere sahip ortak (public) özellikler için değerler belirleyerek bu oluşumu başlatabilirsiniz.

26 Mart 2014 Çarşamba

Kalıtım ve Arayüz

KALITIM


Kalıtım nesne tabanlı programlama dünyasında kilit öneme sahip bir kavramdır. Nesne tabanlı programlamada gerçek dünya problemlerini bilgisayar uygulamaları yardımıyla çözmek için bu problemleri modellemek gerekir. Sınıflar, modellemenin yapı taşlarıdır. Bu noktada devreye kalıtım girmektedir.


Temel Sınıflar ve Türetilmiş Sınıflar

Nesne tabanlı programlama ile problemleri gerçek dünyadakine benzer tarzda nesneler şeklinde modelleyerek çözmeye çalışır. Önce sınıflar tasarlanır. Bir uygulama çok fazla sayıda sınıf yardımıyla modellenebilir.
Bu sınıflardan bazıları temel sınıf bazıları da türetilmiş sınıflardır.

Örnek:
class Insan
{
//temel sınıf üyeleri
}
class Ogrenci: Insan
{
//türetilmiş sınıf üyeleri
}
Bazı sınıf doğrudan en fazla bir sınıftan türetebilir. İki ya da daha fazla sınıftan türetilemez. Eğer böyle bir ihtiyaç olursa arayüzleri kullanmak gerekir. Ancak tüm sınıflar dolaylı olarak System.Object sınıfından türetilmektedir.

Türetilmiş bir sınıftan başka sınıflar da türetilebilir. Ancak bunun bir şartı vardır. “Sealed” olarak tanımlanmış bir sınıftan başka bir sınıf türetilemez.





Temel Sınıf Kurucularını Çağırma


Türetilmiş bir sınıf, temel sınıfın tüm alanlarına sahiptir. Bu alanların başlangıçta ilk değerlerinin belirlenmesi gerekir. Bu amaçla metotlar çağrılır. Türetilmiş bir sınıftan temel sınıfa ait kurucu metodu çağırmak için “base” anahtar sözcüğü kullanılır.


class Insan
{
 //temel sınıf üyeleri
 public Insan(string ad)//temel sınıf için kurucu metot
 {
 //...
 }
 //...
}
class Ogrenci : Insan
{
 //türetilmiş sınıf üyeleri
 public Ogrenci(string ad)
 : base(ad)//Insan(ad) temel sınıf kurucu metodunu çağırır
 {
 //...
 }
 //...
}  


Bu şekilde temel sınıf kurucusu çağırılmazsa derleyici varsayılan temel sınıf kurucusunu çağırmaya çalışır. Bu da başarılamazsa bir derleyici hatası oluşur.



New Metodu

Programcının çok zorlandığı durumlardan bir tanesi de sınıflara ve sınıfların üyelerine benzersiz ve anlamlı adlar bulmaktır.
class Insan {
//temel sınıf üyeleri
 public double Boy, Kilo;
 public string Ad;
 public Insan(string ad)//temel sınıf için kurucu metot
 {
 this.Ad = ad;
 this.Boy = 0.45;
 this.Kilo = 3.5;
 }
 public void Buyu()  {
 Boy += 0.5;
 Kilo += 0.5;
  }
 }
 class Ogrenci : Insan {
 //türetilmiş sınıf üyeleri
 public Ogrenci(string ad)
: base(ad)//Insan(ad) temel sınıf kurucu metodunu çağırır
 {
 }
new public void Buyu()  {
 this.Boy += 1.5;
 this.Kilo += 1.5;
 }
 public void Oku()  {
 //Oku metodu kodları
 }
}


Virtual(Sanal) Metodu
Temel sınıfa ait bir metodun bazen türemiş sınıfta farklı bir şekilde kullanılması gerekebilir. Bu durumda temel sınıfın söz konusu metodu türemiş sınıfın değiştirip kullanabileceği yönünde izin vermesi gerekir. Bu izin metodun temel sınıfta “virtual” olarak tanımlanması sonucu verilmektedir. Diğer bir ifadeyle temel sınıfta “virtual” olarak tanımlanmış bir metodun türemiş sınıfta yeniden yazılabileceği belirtilmiş olunuyor.

Override (Geçersiz Kılma) Metodu

Temel sınıfta “virtual” tanımlanmış bir metodun türemiş sınıfta yeniden yazılması için “override” sözcüğü kullanılır. Temel sınıfta “virtual” tanımlanmamış ya da “static” tanımlanmış olan üyeler (metot,özellik,dinleyici ya da olay) türemiş sınıfta yeniden yazılamaz.

Protected (Korumalı) Erişim

“Protected” sözcüğü bir erişim belirtecidir. Yani bir sınıfın üyelerine kalıtım hiyerarşisi içinde o sınıftan türemiş diğer sınıfların erişebileceğini belirtir. Hiyerarşi dışından ise kimse “proctected” üyeleri erişemez.

                                                    ARAYÜZLER

Bir sınıftan kalıtımla almak güçlü bir mekanizmadır, asıl kalıtımın gücü bir arayüzden kalıtımla almasında yatar. Bir sınıf kalıtımla sadece bir sınıftan türetilebilir ancak bu bu kısıtlama kalıtımla arayüzden türetme söz konusu olduğunda ortadan kalkar.

Arayüz Tanımlama
Arayüz tanımlamak için “class” ya da “struct” sözcükleri yerine “interface” sözcüğü kullanılır. Arayüz içinde metotları bir class yada struct içerisinde olduğu gibi bildirilir. Farklı olarak herhangi bir erşim belirteci “public”,”private”,”protected” kullanılmaz ve metot gövdesi noktalı virgülle(;) ayrılır.
Örnek
interface IComparable
{
 int CompareTo(object obj);
}
Arayüzlerin sahip olabileceği üyeler:
Özellikler (properties)
Metodlar (methods)
Olaylar (events)
İndeksleyiciler (indexers)

Arayüzlerin sahip olamayacağı üyeler: 
Yapıcılar (constructors)
Yok ediciler (destructors)
Alanlar (fields)


Arayüz Kısıtlamaları
1. Bir arayüz için herhangi bir alan tanımlanamaz.
2. Bir arayüz içinde kurucu tanımlamaya da izin verilmez.
3. Arayüz içinde bir yıkıcı da tanımlanamaz.
4. Metot çin bir erişim belirteci de belirtemez.

Bir Arayüz Uygulamak
Bir arayüzü uygulamak için arayüzden kalıtımla alan ve arayüzde belirtilen tüm yöntemleri sağlayan bir sınıf ya da yapı bildirir.

Bir Sınıfa Arayüz İle Ulaşma
Hiyerarşide üst sıralarda tanımlanmış bir sınıf değişkeni ile bir nesneye başvurulabildiği gibi sınıfın uyguladığı bir arayüz olarak tanımlanmış bir değişken kullanarak da nesneye ulaşılabilir.

Mühürlenmiş (Sealed) Sınıflar

Kalıtımı her zaman akıllıca kullanmak çok kolay olmamaktadır. Bir arayüz ya da soyut bir sınıf oluşturulursa gelecekte kalıtımla alınacak bir şeyler yazılıyor demektir.

Nesne Tabanlı Programlama Ortamını Kullanarak Programlamaya Başlamak

NESNE TABANLI PROGRAMLAMA ORTAMI

1.Arayüz

Nesne tabanlı programlama yazılımı çalıştırıldığında aşağıdaki ekran ile karşılaşılır.



Menü Çubuğu: Yazılıma ait komutlar ve alt seçenekleri bulunmaktadır.

Başlangıç Sayfaları: Visual Studio’da başlangıç sayfalarının bulunduğu yerdir.

Son Açılan Projeler: En son hangi projeyi açılmış ise o projelerin bulunduğu yerdir.

New Projects: Yeni proje amcamıza imkan sağlar.

Open Projects: Daha önce oluşturulan projelere erişim imkanı sağlar.

Properties:Özellik sayfasıdır.





Yeni Proje Oluşturma

File menüsünden New seçeneğini seçeriz. Daha sonra Project seçeneğine tıklarız.

Kısayol olarak;
Ctrl + Shift + N




Daha sonra istediğimiz şekilde uygulama sayfası açıp kaydedebiliriz.





Konsol Uygulaması Oluşturmak

1-File menüsünden New seçeneği açılır ve Project tıklanıp New Project sayfası açılır.
2-Visual C# seçilip ConsoleApplication seçildikten sonra konsol uygulamamız açılır.

Konsol Ekranından Kod Yazmak
Konsol uygulaması, grafiksel kullanıcı arayüzünden çok, komut satırı penceresinde çalışan uygulamadır.

UYGULAMA
Ekrana “ Hello World “  mesajı yazan program yazılsın.


ÖNEMLİ NOKTALAR
1.Program büyük-küçük harf duyarlıdır. Kodlar yazılırken bu durum göz önünde bulundurulmalıdır.
2.Program kodu static void Main ifadesi altındaki küme parantezleri içerisinde yazılmalıdır.
3.Kod satırının sonuna noktalı virgül (;) konulmalıdır.
4.Console.WriteLine ifadesi çift tırnak(“ ”) içerisine yazılan metni ekrana mesaj olarak yazmaktadır.

Yazılan kodlar test edilmelidir. Bunun için F5 kısayol tuşu kullanılabilir ya da araç çubuklarındaki “StartDebugging” butonu veya menüden Debug-Start Debugging seçeneği de kullanılabilir.

Program çalışmaktadır. Fakat program çıktısının göremeden konsol ekranı kaybolmaktadır. Bunun için CTRL + F5 kısayol tuşu kullanılabilir veya yazılan kod satırının altına Console.ReadLine(); ifadesi eklenir.

Ekran Görüntüsü:









IntelliSense Kullanarak Kod Yazmak 

IntelliSense, nesne tabanlı programlama yazılımın kod tamamlama özelliğidir. Bu özellik daha hızlı ve hatasız kod yazma olanağı sağlar. Bir intellisense önerisini kabul etmek için açılan listeden ok tuşları yardımıyla seçtikten sonra Tab, Enter ya da boşluk tuşlarından birisine basılarak kullanılabilir. Bu işlem Mouse ile de yapılabilir.

NOT: Herhangi bir durumda intellisense öneri listesini görmek için Ctrl + Boşluk tuş kombinasyonu kullanılabilir.
Console ifadesini yazarken IntelliSense özelliğinden yararlanarak nasıl yazıldığı aşağıda gösterilmiştir.





İSİM UZAYLARI

Namespace

  Namespaceler (isim uzayları) nesneye dayalı, hiyerarşik ve birleşik, içinde çok sayıda sınıf, arayüz ve yapı bulundurabilen kütüphaneler olarak tanımlanabilir.
İsim uzayları program yazmanın en önemli parçasıdır ve daha çok yazılın kodların tekrar kullanabilirliğini artırmak için geliştirilmiştir. Yazılan kodlarla program büyüdükçe iki sorun ortaya çıkar. Birincisi büyük programları anlamak ve bakımını yapmak küçük program parçacıklarına göre daha zordur. İkincisi ise daha fazla kod, ad , metot sınıf demektir. Programda kullanılan ad sayısı arttıkça iki ya da daha fazla adın çakışma ihtimali, dolayısıyla projenin hata verme olasılığı da artar.
Örnek : Meyveler ve Sebzeler iki farklı alan olsun. İki program parçacığının içinde de “Islem” adlı sınıf olsun.

namespace meyveler
{
Class Islem
}
namespace sebzeler
{
Class Islem
}

Şuan projenin içerisinde, farklı isim uzayları (ad alanları) içerisinde kullanılan aynı sınıfların, birbirine karıştırılmasından nasıl kullanıldığı görülsün.
“meyveler” adlı isim uzayı içerisindeki “Islem” adlı sınıfı kullanmak için yazım şeklimiz,

meyveler.Islem

“sebzeler” adlı isim uzayı içerisindeki “Islem” adlı sınıfı kullanmak için yazım şeklimiz,
sebzeler.Islem
olmalıdır.
Görüldüğü gibi projenin herhangi bir yerinde sebzeler işlemi yapmak için “sebzeler.Islem” meyveler işlemi yapmak için “meyveler.Islem” ifadelerini kullanmak yeterli olacaktır.

Using İfadesi

Nesne tabanlı programlama yazılımı ortamının etkin bir şekilde kullandığı yazılım geliştirme paketi .NET Platformu içinde her bir sınıf, bir ad alanı içinde yer alır. Örneğin, Console sınıfı System ad alanı içerisinde yer alır. Bu, sınıfın tam adının aslında System.Console olması demektir.

Ancak console adlı sınıfın her kullanımda System ön ekinin eklenmesi isim uzayı (az alanı) kavramının anlamsızlaşmasına yol açacaktır. Neyse ki bu problem proglarda “using” yönergesi kullanılarak çözülebilir.
Using ifadesi , kapsama ad alanı getirir yani kullanılacak nesneleri ve sınıfları, artık ait oldukları ad alanları ile nitelendirmek gerekmez. İşaretlenmiş alandaki dört ad alanı, her yeni proje oluşturulduğunda nesne tabanlı programlama yazılımı tarafından otomatik olarak eklenir ve oldukça sık kullanılan sınıfları kapsar.

Grafiksel Arayüz

Şimdiye kadar basit konsol uygulaması oluşturuldu ve çalıştırıldı. Nesne tabanlı programlama yazılımı ortamı, aynı zamanda grafiksel Windows tabanlı uygulamalar oluşturmak için ihtiyaç duyulan her şeyi kapsar. Windows tabanlı uygulamanın forma dayalı kullanıcı arayüzü etkileşimli olarak tasarlanabilir.

Nesne tabanlı programlama yazılımı grafiksel uygulamanın iki görünümü sağlar. Tasarım görünümü ve kod görünümüdür.

Not: Nesne tabanlı programlama yazılımı grafiksel uygulamalar için iki şablon sağlar. Windows Form Application şablonu ve WPF Application şablonudur. WPF daha geliştirilmiş bir teknoloji olduğu için birçok ek özellik ve kapasite sağlar.

1-“File” menüsünden “New Project” seçeneği seçiliyor.
2-İlgili programlama dili ve WPF Application seçilmelidir.
 



Design sekmesinde formun grafiksel tasarımı kolaylıkla yapılır ve ilgili kodlar nesne tabanlı programlama yazılımı tarafından otomatik oluşturulur.
XAML ise “Genişletilebilir Uygulama İşaretleme Dili” (Extensible Application Markup Language) anlamına gelir ve XML benzeri bir dildir. Oluşturulan forma ve daha sonra form üzerinde yerleştirilecek nesnelere XAML ile müdahale edilebilir.



NESNE EKLEME
Programın sol tarafında bulunan Toolbox sekmesinin Common bölümündeki Label nesnesine tıklatılıp formun herhangi bir yerine tıklanarak “Label” nesnesi eklensin. Forma eklenen “Label” nesnesi seçiliyken Properties sekmesindeki Content yazan yere şu mesaj yazılsın.
“İsminizi Giriniz:”














Nesneye Kod Yazma

Form’ a buton ekleyip üzerine çift tıklandığında MainWindows.xaml.cs dosyası açılacaktır. Oluşturulan grafiksel form uygulamasında bulunan tüm nesnelere ait kodlar bu dosya içerisinde tutulur.


Numaralandırma ve Yapılar ile Değer Türleri Oluşturmak

NUMARALANDIRMA



Numaralandırma (enumeration) belli bir sözcüklerin, belli tamsayıları temsili durumlarında kullanılan bir yapıdır. Değişkenlerin alabileceği değerlerin sabit olduğu durumlarda kullanılır.

Numaralandırma (Enum) Tanımlama

Numaralandırmaları tanımlamak için ‘enum’ anahtar kelimesini kullanırız.

Örneğin, içindeki ay isimlerini barındıran bir numaralandırma tanımlayalım.

enum enumadi

{

sabit1,

sabit2,

...

}

Örnek:

enum aylar{

Ocak,Şubat ,Mart,Nisan,Mayıs,Haziran,Temmuz,Ağustos,Eylül,Ekim,Kasım,Aralık
}









Örnekte Ocak ayı 0 değerini alacak ve ondan sonra gelen sabitlerin değeri birer artarak devam edecektir.
Duruma göre tanımladığımız sabitlere farklı sayısal değerler de atayabiliriz. Bu işlem için “=” işlecini kullanmalıyız.

enum aylar{
Ocak=1,Şubat ,Mart,Nisan,Mayıs,Haziran,Temmuz=1,Ağustos,Eylül,Ekim,Kasım,Aralık
}

Yukarıda yazan örnekte ki tanımlamayı yaparsak sabitlerimizin değerleri aşağıdaki gibi olur.









Numaralandırma (Enum) Yapısını Kullanma  

Bir önceki başlıkta numaralandırmaların nasıl tanımlandığını belirttik. Şimdi ise tanımladığımız numaralandırma yapılarının program içinde nasıl kullanacağımızı belirtelim.

Öncelikle aylar adında bir enum tanımlayalım.

enum aylar  {
 Ocak, Şubat, Mart, Nisan, Mayıs, Haziran, Temmuz,
 Ağustos, Eylül, Ekim, Kasım, Aralık
 }

Şimdi de enum’u program içinde çağıralım.

class Program
 {
 static void Main(string[] args)
 {
 aylar ay = aylar.Şubat;
 Console.WriteLine(ay);
 Console.Read();
 }
 }

Ekran görüntüsü:







 YAPILAR (STRUCT) 


Nesne tabanlı programlama beş veri tipini destekler. Bunlar Class, Struct, Enum, Interface ve Delegate tipleridir. Aralarında mantıksal bir ilişki bulunan ama farklı türdeki verilerin bir arada bulunması gereken durumlarla karşılaşılabilir. Bu durumlarda belli bir grup verinin bir arada tutulması için oluşturulan yeni birime Yapı (struct) denir.

Yapılar değer türündedir. Dolayısıyla belleğin yığın(stack) bölümünde tutulurlar.. Bellek kullanım bakımından yığın (stack) ve öbek (heap) olmak üzere ikiye ayrılır.

Yığın bölümünde veriler üst üste gelecek şekilde depolanır. Yeni bir veri eklendiğinde bu belleğin en üst bölgesine yerleştirilir. LIFO (Last In First Oust) mantığına göre çalışır. Yani son giren ilk çıkar. Verilere erişim basit olduğu için hızlıdır.

Öbek kısmında ise boş bir alan oluşturulur ve veriler rastgele yerleştirilir. Vereilere erişim karmaşık olduğundan daha yavaştır.

Değer türleri belleğin yığın(stack) bölümünde tutulurken; referans türler belleğin öbek (heap) bölümünde tutulur.

Örneğin; sınıflar (class) referans türünde olduklarından dolayı belleğin öbek(heap) bölümünde tutulur.

Yapı (Struct) Tanımlama  

Yapıları tanımlamak için “struct” anahtar sözcüğünü kullanırız. Bir yapının genel tanımlama şekli aşağıdaki gibidir.

struct yapi-ismi
 {
 yapi-elemanlari-listesi;
 }

Örnek:

struct Ogrenci
 {
 int okulNo;
 string ad, soyad;
 }

Yapı ve Sınıf Arasındaki Farklar

Yapılar değer türünde olduklarından belleğin yığın (stack) bölümünde, sınıflar ise referans türünde oldukları için belleğin öbek (heap) bölümünde depolanırlar.





Sınıflar için varsayılan (default) yapıcı (constructor) metotlar yazılabiliyorken yapılarda bunu yapamayız. Fakat yapılarda parametreli yapıcılar tanımlayabiliriz.

 Burada dikkat edilmesi gereken nokta ise yapılarda tanımladığımız parametreli yapıcılara ilk değer ataması yapmak zorundayız. Sınıflarda ise buna gerek yoktur. Çünkü derleyici bizim yerimize ilk değer atamasını yapacaktır.






Diziler ve Koleksiyonlar Kullanmak

DİZİLER

Diziler için aynı tipteki verilerin tutulduğu bir koleksiyon diyebiliriz. Örneğin integer verinin bir yığın şeklinde tutulması için dizileri kullanırız. C# da diziler referans tipinde değişkenlerdendir. C# da tanımlanan tüm diziler System.Array sınıfından türemiş bir nesnedir.

Dizi tanımlama

<veri tipi>[] <değişken ismi> = new <veri tipi>[<dizinin boyutu>];

Tek bir tanımlama yapılarak istenilen sayıda veri girişi sağlanabilir. Dizi elamanları bir indis numarasına sahiptir. İndis numaraları varsayılan olarak sıfırdan başlar.

Ayrıca dizi tanımlaması yapıldığında dizinin eleman sayısı, kullanılacak eleman sayısından az ise dizi yeniden boyutlandırılabilir.

Dizi değişkeninin eleman sayısını belirtmek için new metodu kullanılır.

Bir dizinin boyutları sabittir ve kullanılmadan önce belirlenmelidir. Dizi boyutunu belirlemek için başka bir değişkende kullanabilirsiniz.

ÖRNEK:

int boyut = 10;
int[] integerDizi = new int[boyut];

Diziyi tanımlama ve başlangıç değerlerini atama işlemini ayrı satırlardada yapabilirsiniz.

        int[] integerDizi;
        integerDizi = new int[10];

        Ayrıca dizileri tanımlarken dizi içine atmak istediğiniz verileride belirterek dizi tanımlayabilirsiniz. Bunun için kullanacağınız very tipine uygun olacak şekilde, süslü parantez içinde bir virgule ayrılmış dizi elemanlarını yazmanız yeterlidir.

int[] integerDizi = {1,2,3,4,5,6,7,8,9};




Dizi Elemanlarına Ulaşmak

Dizi elemanlarına ulaşmak için [indeks] indeks operatörünü kullanırız. Dikkat edilmesi gereken nokta C# da dizilerin elemanları 0. İndeksten başlar, yani eğer 5 elemanlı bir dizimiz varsa bu dizinin birinci elemanı 0. İndekste son elemanı ise 4. İndekstedir. 5 elemanlı bir dizinin 3.elemanına aşağıdaki gibi erişebiliriz.

int[] integerDizi = { 1, 2, 3, 4, 5};
int ucuncuEleman = integerDizi[2];

Bir dizi içindeki elemanlara ulaşmak için basit bir örnek:


int[] integerDizi = { 4, 8, 23, 64, 35 };

for (int i = 0; i < 5; i++)
{
    Console.WriteLine("Dizinin {0}. Elemanının Değeri = {1} ", i, integerDizi[i]);
}


Ekran görüntüsü










Bütün diziler System.Arry sınıfından türemiş nesnelerdir. System.Array sınıfının Length diye bir özelliği vardır. Bu nedenle tüm dizilerinde bir Length özelliği olur. Dizimizin eleman sayısını dizininAdi.Length diyerek alabiliriz.Yukarıdaki örneği bu yöntemle yeniden yazacak olursak;

int[] integerDizi = { 4, 8, 23, 64, 35 };

for (int i = 0; i < integerDizi.Length; i++)
{
    Console.WriteLine("Dizinin {0}. Elemanının Değeri = {1} ", i, integerDizi[i]);
}

Yukarıdaki kodu çalıştırdığınızda bir önceki örneğimizle aynı sonucu üretir.


Örnek:

5 elemanlı bir küme dizisi tanımlanacak olursa;

İnt [] kume;
kume=new int[5]; komut satırları yazılarak tanımlama yapılmış olur.

Foreach Döngüsü

Diziler ve koleksiyonların elemanlarına erişmek için basit ve kullanışlı bir döngüdür. Foreach döngüsünün yapısı aşağıdaki gibidir

foreach(<dizi içindeki elemaların veri tipi> <değişken ismi> in <diziveyaKoleksiyonadi>)
{
    <Kod blogumu>
}


Yukarıda for döngüsü ile yaptığımız örneğimiz foreach döngüsü ile yapalım.

foreach (int diziElemanı in integerDizi)
{
    Console.WriteLine("Elemanın Değeri = {0} ", diziElemanı);
}

Foreach döngüsünü kullanırken ulaştığımız dizi elemanları readonly’ dir. Yani yukarıdaki örnek üzerinde gösterecek olursak foreach döngüsü içinde diziElamanlanı adlı integer değişkeninin içerdiği değeri değiştiremezsiniz. Eğer değiştirmeye kalkarsanız Cannot assign to ‘diziElemanı’ because it is a ‘foreach iteration variable’ hatasını alırsınız.

String tipindeki bir değişkende char tipindeki verilerin birleşmesinden oluşmuş bir dizidir. Öyleyse foreach döngüsü kullanarak aşağıdaki gibi bir stringin elemanlarına erişebiliriz.

string metin = "Yazılım Mutfağı";

foreach (char harf in metin)
{
    Console.WriteLine("Harf = {0} ", harf);
}


Çok Boyutlu Diziler (Multidimensional Array)

Çok boyutlu bir dizi ‘dizinin dizisi’ şeklinde tabir edilebilir. Her elemanı başka bir dizi olan diziler çok boyutlu bir dizidir. Çok boyutlu bir dizi veritabanında her satırında birden fazla kolon bulunan bir tabloya benzetilebilir.
Eğer her satırda bulunan her kolon kendi içinde başka bir dizi barındırmıyorsa bu tür dizilere 2 boyutlu digger bir değişle çok boyutlu diziler denir.
Eğer her kolonda kendi içinde başka bir dizi barındırıyorsa bu tür dizelere n boyutlu diziler denir . Burda n ifadesi dizinin derinliğini ifade eder.

Çok boyutlu diziler iki çeşittir;

        Düzenli Diziler: Her satırı aynı sayıda kolon barındıran diziler.
        Düzensiz Diziler (Jagged Array) : Her satırı farklı sayıda kolon barındıran diziler.




Tek Boyutlu Diziler:

//Dizinin Oluşturulması
int[] intDizi = new int[5];

//Dizi elemanlarına değer ataması
intDizi[0] = 36; //dizinin ilk elemanına 36 değeri atandı
intDizi[2] = 26; //dizinin ikinci elemanına 26 değeri atandı
intDizi[4] = 32; //dizinin son elemanına 32 değeri atandı

Çok Boyutlu Diziler:
//Dizinin Oluşturulması
int[,] intCokBDizi = new int[2, 3];

//Dizi elemanlarına değer ataması
intCokBDizi[0, 0] = 23;
intCokBDizi[0, 1] = 25;
intCokBDizi[0, 2] = 33;
intCokBDizi[1, 0] = 41;
intCokBDizi[1, 1] = 29;
intCokBDizi[1, 2] = 93;

Çok Boyutlu Dizilerin Elemanlarına Döngü İle Ulaşmak


For Döngüsü

//Dizi elemanlarını for döngüsü ile bulmak.
for (int row = 0; row < intCokBDizi.GetLength(0); row++)
{
    for (int col = 0; col < intCokBDizi.GetLength(1); col++)
    {
        Console.WriteLine("Dizinin {0},{1} indeksindeki değeri : {2}",row,col,intCokBDizi[row,col]);
    }
}


Ekran Görüntüsü:










          GetLength() fonksiyonu dizinin belirtilen boyutundaki eleman sayısını verir. Yukarıdaki örnekte görüldüğü gibi bir parameter olarak 0 veya  yazıyoruz. 0 dizinin birinci boyutundaki eleman sayısı yani satır sayısı 1 verdiğimizde ise dizinin 2.boyutu yani kolon sayısını verir.

2 boyutlu düzensiz dizilerde foreach döngüsü kullanılmaz. Foreach döngüsünü sadece tüm elemanlara erişmek için kullanabiliriz. Eğer her boyuttaki elemana farklı erişmek istiyorsak for döngüsü kullanmamız gerekiyor. Foreach döngüsü ile düzensiz 2 boyutlu dizilerin elemanlarına erişebilir.

Düzensiz foreach döngüsü tanımlanması 

//Dizinin Oluşturulması
int[][] intCokBDizi = new int[3][];

//İkinci boyutta bulunan her elemanda bir dizi olduğuna göre
//onlarıda new komutu ile ayarlamamız gerekir.
intCokBDizi[0] = new int[2];
intCokBDizi[1] = new int[4];
intCokBDizi[2] = new int[3];

//Dizi elemanlarına değer ataması
intCokBDizi[0][0] = 13;
intCokBDizi[0][1] = 15;

intCokBDizi[1][0] = 21;
intCokBDizi[1][1] = 29;
intCokBDizi[1][2] = 29;
intCokBDizi[1][3] = 23;

intCokBDizi[2][0] = 39;
intCokBDizi[2][1] = 39;
intCokBDizi[2][2] = 33;

Bir önceki anlattığımız düzensiz çok boyutlu dizide for döngüsü kullanarak elemanlara tek tek ulaşmıştık. Düzensiz dizilerde elemanlara tek tek ulaşmak istediğimizde for döngüsü yerine foreach döngüsü kullanıyoruz.

Foreach Döngüsü:

foreach (int[] row in intCokBDizi)
{
    foreach (int col in row)
    {
        Console.WriteLine(col);
    }
    Console.WriteLine("---------");
}


Ekran Görüntüsü:












Yukarıda anlattıklarımızın ışığında 3 boyutlu düzenli ve düzensiz dizileri nasıl tanımlarız ve bunlara nasıl değer ataması yaparız bir örnekle anlatalım.

//3 boyutlu düzenli dizi tanımlama
int[,,] intUcBDizi = new int[2,3,2];

//3 boyutlu düzenli diziye değer atama
intUcBDizi[0, 0, 0] = 1;
intUcBDizi[0, 0, 1] = 34;
intUcBDizi[1, 1, 0] = 156;

//3 boyutlu düzensiz dizi tanımlama
int[][][] intUcBDuzensizDizi = new int[2][][];

//3 boyutlu düzensiz dizinin alt elemanlarını ayarlama
intUcBDuzensizDizi[0] = new int[2][];
intUcBDuzensizDizi[0][0] = new int[3];
intUcBDuzensizDizi[0][1] = new int[4];

intUcBDuzensizDizi[1] = new int[3][];
intUcBDuzensizDizi[1][0] = new int[2];
intUcBDuzensizDizi[1][1] = new int[5];
intUcBDuzensizDizi[1][2] = new int[3];

//3 boyutlu düzensiz diziye değer atama
intUcBDuzensizDizi[0][0][0] = 129;
intUcBDuzensizDizi[0][0][1] = 65;
intUcBDuzensizDizi[0][1][0] = 119;
intUcBDuzensizDizi[0][1][1] = 35;
intUcBDuzensizDizi[1][1][1] = 30;
intUcBDuzensizDizi[1][2][1] = 37;

Örneklerimizde hep integer tipinde veri tutan dizilerden bahsettik. Örneklerle string değer tutan dizilerin nasıl kullanıldığını aşağıda verilmektedir.

string[] isim = new string[4];


Dizi elemanlarının değerlerini oluşturma anında vermek

string[] isim = new string[4]{"Sabri","Seher","Ali","Metin"};

//veya

string[] isim2 = new string[] { "Sabri", "Seher", "Ali", "Metin" };

//veya

string[] isim3 = { "Sabri", "Seher", "Ali", "Metin" };

//veya tanımlama ve değer oluşturma işlemini ayrı satırlarda yapma

string[] isim4;
isim4 = new string[4] { "Sabri", "Seher", "Ali", "Metin" };

İlk oluşturma anında elemanlara değer verme işlemini 2 boyutlu dizilerde de aşağıdaki gibi yapabiliriz.
string[][] isimListesi = { new string[] { "Sabri", "Seher" }, new string[] { "Ahmet", "Mehmet", "Zuhal", } };


                                 KOLEKSİYONLAR


Birçok uygulama için ilgili nesnelerin gruplarını oluşturmak ve yönetmek istersiniz. Nesneler iki şekilde gruplanabilir, nesne dizisi oluşturarak veya nesne koleksiyonu oluşturarak.
Diziler, türü kesin olarak belirtilmiş sabit sayıdaki nesneleri oluştururken veya bunlarla çalışırken ekseriyetle faydalıdır.
Koleksiyonlar nesne grupları ile çalışmak üzere daha esnek bir yol sağlar. Dizilerden farklı olarak çalıştığınız nesne grupları, uygulamanın ihtiyacına göre dinamik olarak büyüyebilir ve küçülebilir. Bazı koleksiyonlar için koleksiyona eklediğiniz herhangi bir nesne için bir tuşa atayabilirsiniz böylece tuşu kullanarak nesneyi kolayca çağırabilirsiniz.
Koleksiyon bir sınıftır, bu nedenle yeni bir koleksiyona öğeleri eklemeden önce bu koleksiyonun bildirmelisiniz.
Koleksiyonunuz tek bir veri türünde öğeler içeriyorsa System.Collections.Generic ad alanını içindeki sınıflardan birini kullanabilirsiniz. Genel koleksiyon tür güvenliği sağlar. Bu sayede başka bir veri türü eklenemez. Bir genel koleksiyondan öğe aldığınızda veri türünü belirlemeniz veya dönüştürmeniz gerekmez.


Koleksiyon Türleri
ArrayList
SortedList
HashTable
BitArray
Stack
Queue

Bunların System.Array altında bulunan klasik array gibidir fakat array’lerde kullanmadığımız bir çok metodu bu sınıflarda kullanabiliriz. Ayrıca array’lerde var olan oluştururken boyutunu verme zorunluğu veya boyutunu aşınca hata vermesi gibi canımızı sıkan şeyler burada yoktur. Fakat array’lar oluşturulurken boyutu verildiği için her ne kadar bellekte yer kaplıyor desekte casting işlemi yapılmadığı için yinede bir artışı vardır.




Array 

Yukarıda bahsettiğimiz klasik array’dir. Oluşturulurken boyutunun verilmesi   gerekmektedir. Boyutunu aşınca hata verir. Array sınıfı abstract bir sınıftır yani kullanılacağı zaman new sözcüğü ile instance’ının yaratılmasına gerek yoktur. Add,Remove,Sort,IndextOf,FindIndex gibi Collection’larda kullandığımız metolara sahip değildir.

Bu yüzden esnek bir yapıya sahip değildir.


ArrayList 

Index-base bir yapıdır. Aslında array gibidir fakat klasik array’den farkı oluştururken boyutunu vermemize gerek yoktur. Add metodu ile yeni öğeler ekledikçe boyutu otomatik artar. Bu yüzden bellekte boşuna yer kaplamaz.Bu bakımdan iyidir   fakat sadece object tipinde veriler sakladğı için obje dışında bir öğe eklenince boxing işlemi yani gönderilen öğenin objeye çevirilme işleminin yapılması zorunludur.
Bunu kendi içinde yapar fakar bu işlem performans kaybına neden olur.
Add,Remove,Sort,IndexOf,FİndIndex gibi metodları kullanabiliriz.
Object nesneler tuttuğu için programımızda kullandığımız bir strangle bir integer arraylist içine atabiliriz. Bu string ve integer arraylist tarafından objeye çevirip saklanır.

SortedList 

Key/Value adında iki adet very barındırırlar. Verilere verdiğiniz bu ‘Key’ değeri ile ulaştıkları için unique olmalıdır. Bu yüzden ‘Key ’ NULL olamaz. Sıralamayıda bu ‘Key’ değerlerini kullanarak yaparlar. Alfabetik bir sıralama söz konusudur. IndexOfKEy,IndexOfValue,RemoveAt,GetByIndex,SetByIndex gibi metodlara sahip olduğu için esnek bir yapısı vardır.


HashTable 

Yapı olarak SortedList’ e yine Key/Value yapısı vardır. Farkı sıralamayı alfabetir olarak değil, ‘Key’ üzerinde Has kodlarına gore yapmasıdır. Bu özelliği onun hız bakımından SortedList’in önüne geçirsede sıraladığı veriler karmaşık olur bu kötü bir özelliğidir. Ayrıca IndexOfKey,IndexOfValue,RemoveAt,GetByIndex,SetByIndex gibi metodlar HashTable’de mevcut değildir.

Bu yüzden SortedList HastTable’ a gore daha esnek bir yapıya sahiptir

BitArray 

Değişkenlerin Bit değerleriyle işlem yapılmak isteniyorsa tercih edilmelidir. İnt,boolean ve byte tiplerine izin verir. Array’lar gibi oluşturulurken boyut vermek zorunludur.

Stack

Stack LIFO (Last In First Out) mantığıyla çalışır. Yani Stact’ a son giren ilk çıkar. Veriler üzerinde dolaşmaya imkan sağlamaz. Stack yapısını bir depoya benzetebiliriz.Bir depo düşünün bu depoya mallar en son eklenen malın arkasına gelecek şekilde eklenir ve bir mal çıkarılacaksa ilk giren mala ulaşılmaz en son konulan mal çıkarılır.
Yani son giren ilk çıkar.Sadece en sondaki veriye ulaşabilir.Boyut belirtme zorunluluğu yoktur.Veri geldikçe kendi otomatik olarak arttırır.


Queue 

Queue ise FIFO (First In Fırst Out) mantığıyla çalışır. Queue’de işe ilk giren çıkar.Bunuda bir banka kuyruğuna benzetebiliriz. Bankya gittiğimizde sıraya gireriz ve ilk gelen ilk çıkar. Bunun dışında Stack yapısıyla aynı özelliklere sahiptir. Yine veriler üzerinde gezme yoktur. Boyut belirtme zorunluluğu yoktur.Veri geldikçe kendi otomatik olarak arttırır.