Örnek vermek gerekirse; Yığın ve Kuyruk programcılar tarafından sıkça kullanılan veri yapılarıdır. Bu veri yapılarına ait sınıfları her programcının yazmak zorunda kalması istenmeyen bir durumdur. Bu yüzden .Net Platformu programcılar tarafından sıkça kullanılan yapıları sisteme entegre ederek, hazır bir şekilde sunmaktadır. Platform tarafından bize sağlanan bu çözümleri Koleksiyon Sınıfları başlığı altında ele alacağız.
Koleksiyonların Sağladığı Avantajlar
Bir dizi nasıl birden fazla elemanı temsil ediyorsa, bir koleksiyon nesnesi de aynı şekilde birden fazla nesneyi temsil etmektedir. Diziler ile koleksiyonlar arasındaki farklılıklardan bahsedecek olursak;
1. Diziler sabit boyutludur ve eleman sayısının önceden belirtilmesi gerekir. Koleksiyonlar ise dinamik yapıdadır yani sabit boyutlu değildir. Eleman eklendikçe boyutu dinamik olarak artmaktadır.
2. Diziler aynı veri tipindeki elemanları içermektedir. Koleksiyonlarda ise böyle bir kısıtlama bulunmamaktadır. Farklı veri tipindeki elemanları genel amaçlı koleksiyonlar üzerinde tutabiliriz.
Koleksiyonların Dezavantajları
.Net Platformunda kullanmış olduğumuz veri tipleri, Değer tipleri ve Referans tipleri olarak ikiye ayrılmaktadır. Değer Tipleri stack bölgesinde tutulurken, Referans Tipleri heap bölgesinde tutulmaktadır.
1. Değer Tipleri: “int”, “long”, “float”, “double”, “decimal”, “char”, “bool”, “byte”, “short”, “struct”, “enum”
2. Referans Tipleri: “string”, “object”, “class”, “interface”, “array”, “delegate”, “pointer”
Bir Değer Tipinin, Referans Tipine dönüştürülmesi işlemine Boxing, tersi bir işlemede Unboxing denmektedir. Koleksiyonlar verileri object olarak tutmaktadır. Bu yüzden koleksiyonlara her değer tipli eleman eklediğimizde Boxing işlemi gerçekleşecektir. Yani verimiz object’e dönüştürülecektir. Koleksiyona eklenen verileri değer tipli bir değişene aktarmak istediğimizde de Unboxing işlemi gerçekleşecektir. Koleksiyonun eleman sayısındaki artışa bağlı olarak boxing ve unboxing işlemleri artacaktır ve buna bağlı olarak da uygulamamızın performansı düşecektir. Boxing ve Unboxing işlemlerinin performans üzerindeki etkisini daha detaylı incelemek için bu bağlantıyı ziyaret edebilirsiniz.
Koleksiyon Tipleri
.Net Platformu 3 koleksiyon tipini desteklemektedir.
1. Genel Amaçlı Koleksiyonlar: Her tipten veriyi saklamak için kullanılabilirler.
• ArrayList
• Dictionary
• HashTable
• Queue
• SortedList
• Stack
2. Özel Amaçlı Koleksiyonlar: Belirli bir veri tipi veya çalışma şekli için optimize edilmişlerdir.
• CollectionsUtil
• ListDictionary: Anahtar-Değer çiftlerini bir bağlı liste içinde saklar. Küçük veri kümeleri için tercih edilir.
• HybridDictionary: Belirli bir büyüklüğü geçene kadar Anahtar-Değer çiftlerini ListDictionary koleksiyonunda tutmaktadır, geçtikten sonra otomatik olarak bir Hashtable koleksiyonuna geçiş yapar.
• NameValueCollection: Anahtar-Değer çiftlerinin her ikisininde string tipinde olduğu durumlarda tercih edilebilir.
• StringCollection: Karakter katarlarını saklamak için optimize edilmiş bir koleksiyondur.
• StringDictionary: Anahtar-Değer çiftlerinin her ikisininde string tipinde olduğu bir hash tablodur. Anahtar-Değer çiftleri küçük harflere çevrilerek saklanır.
3. Bit Tabanlı Koleksiyonlar: İsminden de anlaşılacağı üzere bu koleksiyonlar bir grup biti içerisinde saklamaktadır. Bit tabanlı koleksiyonlara örnek olarak BitArray‘i verebiliriz. BitArray bitleri saklamak haricinde VE – VEYA gibi mantıksal işlemleri de gerçekleştirebilmektedir.
Koleksiyonları kullanım tekniği açısından Generic ve Generic olmayan olarak 2 tür üzerinde de inceleyebiliriz.
Generic koleksiyonlar System.Collections.Generic namespacei altında mevcutturlar.Non-Generic koleksiyonlarda tip güvenliği yoktur ancak Generic koleksiyonlar tip güvenliği vardır.Boxing – Unboxing işlemleri yapmamıza gerek kalmadığından performans açısından artış sağlayacaklardır.
Öncelikle Generic koleksiyonların Non-Generic koleksiyonlardan artısı eksisi nedir bir bakalım.Non-Generic koleksiyonlar elemanları object tipten aldıkları için Boxing işlemine uğruyorlar.Haliyle elemanlara erişirkende Unboxing işlemi yapıyoruz.Bazen koleksiyonumuzda tek tipten elemanlar olduğu durumlar olur.Bu amaçla Non-Generic koleksiyonları kullanarak Boxing-Unboxing işlemleri performans açısından bizi olumsuz etkileyecektir.Halbuki Generic koleksiyonları kullanırsak, o tipten bir koleksiyon oluşturup , hem tip güvenliğini sağlarız hemde Boxing – Unboxing işlemine gerek duymamış oluruz. Buda performans açısından bize katkı sağlayacaktır.
Aşağıda Non-Generic kolleksiyonlara karşılık gelen Generic kolleksiyonlar listelenmiştir.

Bu koleksiyonlardan kullanılan en popülerlerini aşağıda örneklerle inceleyelim;
ArrayList


HashTable




List<T>


List ile 2. Örnek;



Dictionary<Key,Value>



Stack<T>


Queue<T>

NESNEYE YÖNELİK PROGRAMLAMA(OOP)
Nesne Yönelimli Programlama, 1990'lı yıllarda başlayan ve günümüzde de yoğun olarak kullanılan bir programlama teknolojisidir. Yine aynı yıllarda özellikle İnternet uygulamalarına yönelik özellikleriyle öne çıkan Java dili saf (pure) bir nesneye yönelik programlama dilidir.
Nesne nedir?
Nesne, içinde veri ve bu veriler üzerinde işlem yapacak olan metotları (fonksiyon) bulunduran yazılım bileşenidir. Nesne bu tanıma uygun olarak, kendi işlevselliğini de içinde taşır. Nesneler her uygulamada tekrar tekrar kullanılabilir. Veri ve metotlar, birlikte nesnenin üyeleri (members) adını alır. Bir nesne yapısı, bir sınıf (class) içinde tanımlanır. Sınıf içinde nesneyi oluşturan üye değişkenler ve metotlar açıkça tanımlanır.
Nesne Yönelimli Programlama dillerinin teknik özelliklerini gözden geçirmeden önce, yukarıda belirtilen nesne yönelimli dillerin oluşturulma nedenlerini anlayabilmek için Nesne Yönelimli Programlama dillerinin yararlı yönlerini gözden geçirelim.
Yazılımın bakım (maintenance) kolaylığı
Nesne Yönelimli Programlama dillerinde, nesneler ait oldukları sınıfların sunduğu şablonlarla temsil edilirler. Birbirinin benzeri ya da aynı konu ile ilişkili sınıflar bir araya getirilerek namespace ya da package (paket)adı verilen sınıf kümeleri oluşturulur. Bu durumda yazılımın bakımı, ya mevcut sınıflarda değişiklik ya da yeni sınıf eklenmesi anlamına gelir. Bu da yazılımın tümünü hiçbir şekilde etkilemeyecek olan bir işlemdir. Oysa klasik yapısal programlama dilleriyle geliştirilen programlarda yazılımın bakım maliyeti üretim maliyetinin çok önemli bir yüzdesi kadardır (%40'lar civarında).
Genişletilebilirlik (Extensibility)
Nesne Yönelimli Programlama'da mevcut bir sınıfa yeni özellik ve metotlar ekleyerek artan işlevsellik sağlamak çok kolaydır.
Üretilen kodun yeniden kullanılabilirliği (Reusability)
Nesnelerin üretildiği sınıflar, ortam içinde her uygulama geliştiricinin kullanımına açık olduğu için ortak bir kütüphane oluşturulmuştur. Her kullanıcı bu ortak kütüphanede bulunan sınıfları kullanarak gerekli kodu yeniden yazmaktan kurtulur ve uygulamaya özgü kod parçaları, ortak kullanımdaki sınıfların kod uzunluklarına göre göz ardı edilebilir boyuttadır.
Nesne Yönelimli Programlama Teorisi'nde 4 temel özelliğin gerçekleştirilmesi zorunlu sayılmıştır ve bu temel özelliklerden birini bile sağlamayan bir dil saf (pure) Nesne Yönelimli Programlama Dili sayılmaz.
Bu 4 temel özellik;
1. Soyutlama (Abstraction)
Soyutlama denilince, nesneyi bazı karakteristikleri olan ve bazı eylemleri gerçekleştirebilen bir veri tipi olarak genelleştirmek anlaşılmalıdır. Yeryüzü üzerinde bulunan her şey bir nesnedir. Bilgisayar yazılımı açısından nesne, bir varlığın temsil biçimidir. Örneğin; bina bir nesnedir. Binayı bilgisayar
yazılımı içinde temsil etmek istersek, öncelikle bu nesnenin yani binanın ayırt edici özelliklerini belirlemeliyiz.
Örneğin;
• Bina yüksekliği
• Dış yüzey rengi
• Kat sayısı
• Zemin alanı
• Zemin boyutları
gibi özellikler, binayı temsil etmek için ilk akla gelen birkaç özelliktir. O halde nesnenin bilgisayarda temsilinde, özellikleri kilit rol oynamaktadır.
Nesnenin karakteristikleri, özellikler ve gerçekleştirebileceği eylemler de metot adını alır. Bu anlamda, soyutlaştırmanın sonucunda bir nesne;
• Özellikleri (properties, member variables - Objective-C)
• Metotları (methods) ile temsil edilebilir.
Nesne Yönelimli Programlama Dilleri, soyutlamayı sınıf (Class) yapısı ile gerçekleştirirler. Sınıf yapısı içinde o nesneye ait özellikler ve metotlar tanımlanabilir.
Ancak sınıf soyut bir yapıdır ve doğrudan kullanılamaz. O sınıftan üretilen örnekler sınıfa ait tüm özelliklere ve metotlara sahip olurlar. Bunlar program içinde doğrudan kullanılabilirler. Sınıftan üretilen her örnek, aynı özellik ve metotlara sahip olacak ancak özelliklerin değerleri doğal olarak farklı olabilecektir.
Örneğin, insanı bir nesne olarak düşünürsek ve insan sınıfı olarak soyutlarsak, ilk akla gelen özellikleri; boy, kilo, IQ ve EQ değerleri, eğitim düzeyi vb. gibi özellikler olur. Bu özelliklerin değerleri doğal olarak her insan için farklıdır. İnsan için ilk akla gelen eylemler (metotlar) ise; yürüme, okuma-yazma, konuşma, araç kullanma vb. gibi metotlardır.
2. Sarmalama / Paketleme (Encapsulation)
Paketlemenin anlamı; sınıfı oluşturan metot ve özelliklerin gerçekleştirme biçiminin, bu sınıfı kullanacak olan kullanıcılardan gizlenmiş olmasıdır.
NESNE = VERİ + METODLAR
şeklinde ifade edilen bağıntı aslında Nesne Yönelimli Programlama'nın temelini açıklamaktadır. Veri (özellikler) ve veri üzerinde işlem yapan kod (metotlar) bir arada bulunur ve nesneyi oluşturur. Nesneyi tanımlayan sınıfın iç ayrıntıları, normal olarak programın artakalan kısmı için görünür değildir.
Bir nesne sınıfının gerçekleştirimini değiştirirsek, yani aynı sınıfı metot ve özellikleri aynı kalmak koşuluyla farklı bir programlama tekniğiyle oluşturursak, o sınıfın dış dünyaya olan arayüzü değişmediği sürece (metot ve özellikler aynı kaldığı sürece) bu sınıfı kullanan program kodlarınızda bir değişiklik yapmamıza gerek kalmayacaktır.
3. Miras Alma (Inheritance)
Nesneye yönelik programlamada, bir nesne, genellikle bir nesne sınıfına ait bir örnektir (instance).
Örneğin, Albert Einstein, insan sınıfının bir örneğidir. Bir nesne sınıfından alt sınıflar (subclasses) oluşturulabiliyorsa, türetme özelliği (derivation) var demektir. Örneğin insan sınıfı, canlı sınıfının bir alt sınıfıdır.
Kendisinden alt sınıf üretilen sınıfa, temel sınıf (base class) veya süper sınıf (super class) veya ana sınıf (parent class) adı verilir.
Subclass yerine child class terimi de kullanılmaktadır.
Alt sınıfın nesneleri, türetildikleri temel sınıfa ait özellikleri alıyorsa, burada miras alma (inheritance) özelliği vardır denir.
Bu anlamda, miras alma özellikli bir nesne yönelimli programlama dilinde, bir nesne sınıfından türetilen alt nesne sınıfına ait nesneler, üst sınıfın özelliklerini (properties) ve metodlarını (methods) aynen alırlar.
4. Çok Biçimlilik (Polymorphism)
Farklı nesnelerin, aynı mesaja (olaya ya da uyarıma) farklı şekillerde cevap verebilme yeteneğidir.
Her nesne sınıfı, kendi metotlarını paketlediği için ve bu metotlar programın kalan kısmı için gizli olduğundan, farklı sınıflar aynı isimde bazı metotlara sahip olabilirler.
Örneğin ŞEKİL adlı bir süper sınıfımız (super class) olsun. Bu sınıftan, DAİRE, KARE ve ÜÇGEN adlı 3 alt sınıf türettiğimizi varsayalım. Bu alt sınıfların her biri kendi örneklerini çizmek için ÇİZ adlı bir metoda sahip olabilir. Fakat, her bir alt sınıf için bu metot aynı olmasına karşın, bu metodu devreye sokmak için gönderilecek mesajdan sonra her alt sınıfa ait nesne farklı bir şekil (yani kendini, yani bir üçgen, daire veya kare) çizecektir.
Nesne Yönelimli Programlamanın sınıf türetebilme özelliği sayesinde, bir nesne hiyerarşisi oluşturma imkânı bulunnmaktadır.
Sınıf (class) yapısının bu sınıftan üretilecek nesneler için bir şablon görevi gördüğünü söyleyebiliriz.
Constructor (Kurucu Metod);
Oluşturulan bir class üzerinden nesne türetildiğinde ilk olarak çalışan metoddur. Burada metodun adı ile class’ ın adı aynı olmak zorundadır. Parametreli veya parametresiz olarak kullanılabilir.
Örnek :


Miras Alma – Kalıtım Örneği;



Miras Alma – Kalıtım 2. Örneği;








