Bu makalede işinize yarayacağını sandığım birkaç programcılık tekniklerinden söz edeceğim. Fırsat buldukça tekniklere yenilerini ekleyeceğim. Bu programcılık tekniklerinin bazılarını yazarken hedef okurları 2 ayrı guruba ayırdım: 1- Zirveye Çıkmak İsteyenler
2 -Çukura İnmek İsteyenler
Siz zirveye çıkmaya çalışan bir programcı iseniz Zirveye Çıkmak İsteyenler için yazılan metne bakmalısınız. Yok hayır ben çukura inmek istiyorum veya zaten çukurda olan bir programcıyım diyorsanız çukura inmek isteyenler için hazırlanan metne bakmalısınız. Her ikisini de okuyup kafası karşınlar için yapabileceğimiz bir şey yoktur.
Sınıfları Temizlemek, Belleği Pirüpak Yapmak - Zirveye Çıkmak İsteyenler İçin
Bu programcılık tekniğini bir süre önce C# konulu süper bir programcılık kitabında gördüm. Bu süper programcılık tekniğinin anlatıldığı kitabı alma imkanını bulamamış olanlar bundan mahrum kalmasın diye tekniği özetleyip sizinle paylaşacağım. Bu süper tekniğimizin konusu sınıfları temizlemek yani sınıfları bellekten temizlemek.
Şimdi bazılarınız diyecekler ki, bizim bildiğimiz nesneler bellekten temizlenirdi şimdi bellekten bir de sınıfları mı temizleyeceğiz? Sınıflarınız kirli ise bunları bellekten mutlaka temizlemeniz gerek. Yoksa bellek berbat olur. Bu işlem için yani sınıf temizleme işlemini GC sınıfının SuppressFinalize() metodu ile aşağıdaki gibi yapabilirsiniz.
System.GC.SuppressFinalize(this); // Bu sınıfı ter temiz yap
Sınıfınızda bu satırı içeren bir metot hazırlayıp kullanabilirsiniz. Sınıfınızda böyle bir metot hazırlayıp kullanmış olmanıza rağmen sınıf bir türlü bellekten temizlenmiyorsa bilgisayarınızı kapatıp tekrar açıp temizleyip bu metodu ikinci kez kullanmanız önerilir(!).
class kirli_sinif
{
public void sinifi_cilala()
{
System.GC.SuppressFinalize(this); // Bu sınıfı bellekten uçur
}
}
Programın ileri aşamalarında bu sınıfın örneğini alıp bu metodu işletirseniz bellek temizleme dertlerinizden kurtulursunuz. Bu tekniği bulan mesleğinin zirvesindeki bilim adamlarının, programcılık kitapları yazarlarının yalancısıyım. Sorumluluk kabul edilmez. Bu metot kullanıldıktan sonra belleğin temizlik kokması iyiye işarettir.
Bu arada C#'tan anlamayan bazıları çıkıp burada sözünü ettiğimiz SuppressFinalize() metodunun burada anlatıldığı gibi değil derslerse onlara inanmayınız. Tabi sizin programcılıkta zirveye çıkma yerine çukura inme gibi bir amacınız varsa bir şey diyemeyiz. Özetlemek gerekirse SuppressFinalize() metodunu bal gibi sınıfları temizlemektedir.
Sınıfları Temizlememek - Çukura İnmek İsteyenler İçin
Gereksiz nesne durumuna düşmüş nesneleri GC mekanizması uygun gördüğü bir zamanda bellekten silmektedir. Kullanılan kaynakların iadesi ve belleğin gereksiz nesnelerden temizlenmesi konusunda bazen GC yeterli olamamaktadır. Bu gibi durumlarda programcı Dispose() metodundan yararlanılır. GC sınıfının SuppressFinalize() metodu ise, Dispose() metodu ile yok edilmiş nesnelerin için yok edici metotlarının boş yere işletilmesi önlenmektedir. Bu metodun işlevi hakkında bilgi vermek için aşağıdaki gibi kısıtlı özelliklere sahip bir sınıf hazırladım.
public class Test : Component
{
~Test()
{
MessageBox.Show("Test sınıfının yok edici metodu işletildi");
}
}
Bu sınıfın yok edici metodu olduğu için Garbage Collector mekanizması tarafından uygun bir zamanda bellekten yok edildiğinde işletilir. Bunu test etmek için projenin formuna bir düğme yerleştirip sınıfın örneğini aldım. Tabi bu metodun sonuna gelindiğinde “Test” sınıfının örneği gereksiz nesne durumuna düşeceği için bir süre sonra bu nesne GC mekanizması tarafından bellekten silinir ve bu sırada yok edici metot işletilir.
private void button1_Click(object sender, EventArgs e)
{
Test nesne = new Test();
}
Burada “Test” adını verdiğim sınıfın örneğini aşağıda yapıldığı gibi SuppressFinalize() metoduna parametre olarak verseydim söz konusu nesne bellekten temizlenirken yok edici metodu işletilmezdi.
private void button1_Click(object sender, EventArgs e)
{
Test nesne = new Test();
GC.SuppressFinalize(nesne);
}
Bu metot asıl söz konusu nesne daha önce Dispose() edildiyse kullanılmaktadır. Böylece performans kazanılmış olunuyor. Her ne kadar burada SuppressFinalize() metoduyla ilgili her şeyi anlatmamış olsak bile en azından zirveye çıkanla için yazılan metinde bu metodu yanlış anlatıldığını öğrenmiş olduk.
private void button1_Click(object sender, EventArgs e)
{
Test nesne = new Test();
Nesne.Dispose();
GC.SuppressFinalize(nesne);
}
Procedure Kullan Gerisini Merak Etme Sen - Zirveye Çıkmak İsteyenler İçin
Programcılar yazdıkları programı överken bazen kullandıkları veritabanın sağlam olduğunu söylerler. Örneğin Access veritabanı SQL Server kadar sağlam ve güvenli değildir. Programlarını pazarlamaya çalışanlara bir önerim var: C# ile geliştirdiğiniz projelerde mümkün mertebe fonksiyon yerine Procedure kullanın ve programın özellikleri içinde bundan mutlaka söz edin. Çünkü procedureler fonksiyonlara göre daha gelişmiş bir yapıya sahiptirler.
Madem Procedureler daha gelişmiş bir yapıya sahiptir Procedure kullanarak programınızın gücüne güç katabilirsiniz. Ama hocam C#’ta procedure’ler yok gibi itirazları kabul etmem yoksa siz zirveye çıkmak istemiyor musunuz?. C# ile geliştirdiğiniz programlarınızı kalitesini artırmak istiyorsanız Procedure kullanmalısın. Sonra program paketinin üzerine "bu programda fonksiyon yerine procedure kullanılmıştır" diye yazmayı unutmayınız.
Olmayan Procedure Kullanmayın - Çukura İnmek İsteyenler İçin
Az çok kod yazmış olanların bildiği gibi nesneye yönelik programcılık önce programlama dillerine yordamsal diller denilirdi. Çünkü programlar yordam yani procedure yani sub rutin denilen kod parçalarından meydana gelirdi. Basic ve Pascal'da geriye değer gönderen kod parçalarına Function denilirken geriye değer göndermeyenlere ise Sub veya Procedure denilirdi. C'de ise Procedure ile Function ayrımı yoktu; bütün kod parçalarından Function diye söz edilirdi.
Sonraları nesneye yönelik programcılık yaygınlaşınca kod parçalarına Metot denilmeye başlandı. Bu durumda Pascal veya Basic geleneğinden gelen programcıların C# kodu içinde hazırlanan metotların geriye değer gönderenlerinden Function, değer göndermeyenlerden ise Procedure diye söz edilmesi bir bakıma normaldir. Ötesi Visual Basic'in .NET sürümünde geriye değer gönderen metotlar eskisi gibi Function anahtar kelimesi ile hazırlanırken değer göndermeyenler yine Sub anahtar kelimesiyle başlatılmaktadır. Özetlemek gerekirse C# kodu içinde olmayan Procedure'lerin daha gelişmiş yapıya sahip olduklarını ileri sürünler için yorum yapmak kolay değildir. Tabi .NET uyumlu Visual Basic kodu içinde hazırladığınız metot geriye değer göndermiyorsa illa fonksiyon hazırlayacağım diye inat etmemek gerekir.
Hakiki Dizi Değişken İşlemleri – Zirveye Çıkmak İsteyenler İçin
C# uzmanı olduklarını ileri süren yerli yabancı bütün C# bilmezler ListBox nesnesinin elemanlarının dizi değişkenlere nasıl aktarıldığı konusunda sizleri kandırıyorlar. C# uzmanı olduklarını beyan edenler orada burada şöyle açıklamalar yapıyorlar: ListBox’ın Items koleksiyonu object tipinde bilgi içermektedir. Bu durumda ListBox’ın içeriğinin aktarılması gereken dizi değişkenin tipinin object olması gerekmektedir.
Tabi bu C# uzmanı diye ortaya çıkanlar dizi değişkenlerin nasıl tanımlandığını yanlış bildikleri için sizleri de yanıltıyorlar. Bu konuda yanlış bildiklerinizi düzeltmek için adım adım bilgi vereceğim. Bu amaçla forma bir ListBox yerleştirip birkaç futbol takımının adını aktardım. Sizler Süper Lig takımları yerine 2. lig takımlarının adını tercih edebilirsiniz.

Şimdi sırada bu ListBox’ın içeriğini dizi değişkene aktarmak var. Bu işlemi yaparken yararlanmak üzere forma bir buton yerleştirdim. Ardından aşağıdaki gibi bir event hazırladım. Bazı C#’ı bilmeyenler burada hazırlanan event değildir diyeceklerdir ama onlara kulak asmayın. Bu eventta bir dizi değişken tanımladım.
privatevoid button1_Click(object sender, EventArgs e)
{
ArrayList hakiki_dizi_degisken = new ArrayList();
}
Sonra bu eventa ekleme yapıp ListBox’taki bütün takımların adını dizi değişkene aktardım. Bununlada yetinmedim yazdığım kodun garanti çalıştığını kanıtlamak için dizi değişkenin ikinci elemanını formun başlığına yazdım. Tabi burada işi asıl yapan AddRange adlı ArrayList Class Fonksiyonu’dur.
privatevoid button1_Click(object sender, EventArgs e)
{
ArrayList hakiki_dizi_degisken = new ArrayList();
hakiki_dizi_degisken.AddRange(listBox1.Items);
this.Text = hakiki_dizi_degisken[1].ToString();
}
Burada ArrayList Class fonksiyonu görevini hakkıyla yapmaktadır. İsterseniz bu kodu aşağıdaki gibi yazıp C# uzmanı diye ortalıkta gezinenlerin bir yanlışını daha ortaya koyabilirsiniz.
privatevoid button1_Click(object sender, EventArgs e)
{
string[] sahte_dizi = new string[] { "fener", "galata", "beşiktaş" };
ArrayList hakiki_dizi_degisken = new ArrayList(); // dizi değişken tanımlandı
hakiki_dizi_degisken.AddRange(sahte_dizi);
this.Text = hakiki_dizi_degisken[1].ToString();
}
Uydurma Dizi Değişken İşlemleri – Çukura İnmek İsteyenler İçin
C# ve diğer birçok programlama dillerinde dizi değişkenler mevcut tiplerden yararlanılarak tanımlanır. Örneğin C#’ta string bilgileri saklamak üzere 5 elemanlı bir dizi değişken tanımlamak istiyorsanız aşağıdaki gibi bir kod satırı yazmanız yeterlidir.
privatevoid button1_Click(object sender, EventArgs e)
{
string[] hayirsiz_dizi = new string[5];
}
Bu şekilde tanımlanan dizi değişkenin elemanlarına string bilgileri aşağıdaki gibi aktarabilirsiniz. Dizi değişkenlere bilgi aktarılırken indeksleyiciden yararlanılmaktadır. Bildiğiniz gibi C#'ta indeksleyici olarak köşeli parantezler kullanılmaktadır.
privatevoid button1_Click(object sender, EventArgs e)
{
string[] hayirsiz_dizi = new string[5];
hayirsiz_dizi[0] = "Fenerbahçe";
hayirsiz_dizi[1] = "Tranzonspor";
}
Sizleri programcılığın zirvesine çıkarma iddiasındaki başka kaynaklarda ArrayList adlı koleksiyon sınıfının örneğini almaktan dizi değişken tanımlama diye söz edilse bile kulak asmayınız. Aşağıda verilen satırda ArrayList nesnesi hazırlanmaktadır.
privatevoid button1_Click(object sender, EventArgs e)
{
ArrayList hakiki_liste = new ArrayList();
}
Gerçekte bir koleksiyon sınıfı olan ArrayList sınıfının Items adlı koleksiyonun elemanları Object tipindedir. .NET Framework ile gelen koleksiyon sınıflarının bazılarına eleman ekleme işleminin Add() metodu ile yapıldığını tahmin edebilirsiniz.
privatevoid button1_Click(object sender, EventArgs e)
{
ArrayList hakiki_liste = new ArrayList();
hakiki_liste.Add("Fenerbahçe");
hakiki_liste.Add("1907");
hakiki_liste.Add("Cemil Turan");
}
Dizi değişkenler ile ArrayList adlı koleksiyon sınıfını birbirine karıştırıp sonra da Türkiye’nin en iyi C# kitabını yazıp okurlarını zirveye çıkaranları taktir etmek gerekir. ArrayList nesnesine mevcut bir dizi değişkeni veya koleksiyon nesnesini bir seferde aktarmak istiyorsanız AddRange() metodunu kullanabilirsiniz. Bu metodun nasıl kullanıldığını anlatmak için önce object tipinde bir dizi değişken tanımladım. Ardından bu dizi değişkenin bütün elemanlarını AddRange() metodu ile ArrayList nesnesine aktardım.
privatevoid button1_Click(object sender, EventArgs e)
{
object[] dizi_dizi = new object[] { "Fenerbahçe", 1907, "Aziz Yıldırım" };
ArrayList hakiki_liste = new ArrayList();
hakiki_liste.AddRange(dizi_dizi) ;
}