Günümüzün modern programlama dillerinde programlar genellikle Class’lar şeklinde paketlenmekte, Class’lar şeklinde düzenlenmektedir. Programları Class’lar halinde paketlenmenin sayısız yararları vardır. Ancak bunları burada anlatmayacağım. Class’lar hakkında bilgi sahibi olmadan Visual Basic 6 ve Delphi gibi diller ile program geliştirmek mümkün iken C++, C# ve Java gibi diller Class’lar hakkında bilgi sahibi olmanızı zorunlu kılmaktadır.
Quick Basic, Pascal ve C gibi klasik programlama dillerinde kod dosyaları içinde fonksiyonlar ve procedure’ler bulunuyordu. Hatta C’de fonksiyon procedure ayrımı da yoktur. Başka bir deyişle programcılar yapmak istedikleri işlemlere uygun fonksiyonlar yazıp gerek duydukça bunları çağırırlardı.
Zamanla programlar büyüyüp karmaşıklaştıkça paketlenmesi ihtiyacı doğdu. Fonksiyon ve metotların Class’lar halinde paketlenmesi ile birlikte Class içinde bulunan fonksiyonların kullanılması, organize edilmesi ihtiyacı doğdu. Günümüzde yaygın olarak kullanılan programlama dillerinin Class’ları metotlardan başka Interface’leri, Olayları, Özellikleri, Delegate’leri ve Yapıcı metotları içerebilmektedir. Lütfen olay nedir özellik nedir ki diye sormayın. Zamanı gelince bu konular hakkında bilgi verilecektir.
Nesneye Yönelik Örnekler
Yerli yabancı ayrımı yapmadan bugüne kadar hangi kaynağa baktıysam konu nesneye yönelik programcılık olduğunda ilk birkaç sayfada biyolojiden, memelilerden, ütülerden arabalardan vs. söz edilmektedir. Her yazar nesneye yönelik programcılığın 3 temel kavramını kendince anlatmaktadır. Hemen belirtmek isterim ki kişisel görüşme göre bu anlayış öğrenmeyi zorlaştırmaktadır.
İstediğiniz ayrıntıda polimorfizm’den söz edin, istediğiniz kadar biyolojiden memelilerden örnek verin bu kavramların kod karşılığı görülmeden verilen bilgiler havada kalıyor. Bu nedenledir ki bu derste nesneye yönelik programcılığın temel kavramlarının adını ağzıma almadan, bir daha "nesneye yönelik programcılık" sözünü etmeden bu konuyu anlatmak istiyorum. Esasında burada bilim yapmıyoruz, olsa olsa sizlere C# programlama dili ile nasıl program yazabileceğinizi anlatmak istiyoruz. Amacımız en basit şekilde programcılık tecrübesi olmayanları programcılığa alıştırmaktır, onları C# ve diğer programlama dillerini öğrenebileceklerine inandırmaktır.
Aşağıda en basit veya en kısıtlı, en az satıra sahip bir C# programı bulunmaktadır. Bu kodu Not Defteri penceresine yazıp CS uzantısı ile kaydedip .NET Framework ile gelen C# derleyicisi ile derleyip EXE yapabilirsiniz. Bu işlemin nasıl yapıldığı ileriki sayfalarda anlatılacaktır.
class Deneme
{
static void Main(string[] args)
{
}
}
Buna göre C# ile program yazmak istiyorsanız önce mutlaka bir Class bloğu hazırlamanız gerekmektedir. C, C++ ve C# programlarının başlangıç noktası Main() metodu olduğundan Main() metoduna yer vermek zorundasınız. Bu C# kodu CS uzantılı bir dosyaya yazılıp kaydedilip derlenip hazırlanan EXE dosya çalıştırılırsa herhangi bir hata ile karşılaşılmaz. Ancak bu program bu hali ile herhangi bir işlem yapmaz.
En az satıra sahip bu C# programındaki Main() metodunun hem static hem de void olduğunu işaret ettim. C# programlarının başlangıç noktası olan Main() metodu(C programlama dilinde Main’den fonksiyon diye söz edilir) statik olmak zorundadır ama void olması zorunlu değildir. Metot geriye bir değer göndermeyecekse metot adından önce void yazılır. Daha sonra metotların geriye nasıl değer gönderdikleri konusunda bilgi verilecektir. Lütfen biraz sabır.
Metodlar, Class’lar
Bu kısacak programda bile Class’tan söz ettik, metottan söz ettik. Size önerim başlangıçta verdiğim kısacak kodlarda kullanıp ancak sözünü etmediğim deyimlere, metotlara veya satırlara kayıtsız kalmanızdır. Örneğin bu kısacak örnekte bile sözünü etmediğim, dikkatinizden kaçırmak istediğim bir şeyler var. Dikkat ederseniz Main() metoda adından sonra parantezlerin arasına "string[] args" yazdım. Bu parantezin içine yazdıklarım gerçekte dizi değişken tanımlamaktan başka bir şey değildir Ancak şu anda bundan söz etmeyeceğim. Bu nedenle bu derslerden azami verimi almak istiyorsanız anlatılmayanlara değil anlatılanlara odaklanmalısınız.
Bu programı C’de yazmış olsaydım yine Main() olurdu ama bu kez Class bloğu olmazdı. Ayrıca Main’den bu kez fonksiyon diye söz ederdim. Çünkü C programları Class’lar şeklinde düzenlenmez ve metotlar fonksiyon olarak bilinir. İleriki günlerde C++ derslerini hazırladığımda C++ ile birlikte ister istemez bazen C’den de söz edilecektir. C++ derslerinde C++’ı C gibi anlatmayacağımı bilmenizi isterim. C++ derleyicileri yapıları gereği C kodlarını destekledikleri C++ konulu yerli yabancı kaynaklarda ne hikmetse C++ kitaplarında C’den bolca söz edilir.
Kaldığımız yerden devam edelim. Şimdi C# programının başlangıç noktası olan Main() metodu içinde bir değişkene yer vereceğim. Bu değişkeni Main() metodu içinde tanımladım. Değişkeni Main() metodu tarafından sınırlanan kod bloğu yerine Class bloğu içinde tanımlayabilirdim.
class Deneme
{
static void Main(string[] args)
{
int yil;
}
}
Gördüğünüz gibi C# programlarında değişken tanımlanırken önce değişkenin tipi sonra adı yazılmaktadır. Buradaki int bu değişkenin integer yani tamsayı tipindeki bilgileri saklayabileceğini işaret etmektedir. Programcılıkta değişken tanımlamayı günlük hayatta telefon edip bir otelde yer ayırmaya benzetmek mümkündür. Bu değişkeni tanımlamakla derleyiciye demiş oluyorum ki, programın ileriki safhalarında elimdeki integer bilgileri bellekte tutma gereğini duyabilirim. Bu nedenle bana bellekte yer ayırt.
Bu kısacak kodu yorumlamak gerekirse, bu programdaki "Deneme" adlı Class’ın Main() adında bir metodu bulunmaktadır. Main() metodu içinde yaşayabilecek "yil" adında ve Integer tipindeki bilgilerin aktarılabileceği bir değişken tanımlanmıştır. Fark etmiş olabileceğiniz gibi C# programlarında Class ve metot başlatılan satırlar hariç her satırın sonuna ";" konulmaktadır.
Bu kodu VB.NET için yazsaydım biraz farklı olurdu. Ancak temel mantıkta pek farklılık yoktur. VB.NET’te de uygulamalar Class halinde düzenlenmekte ve Class’ların içinde metotlar, alanlar(yani değişkenler), özellikler, olaylar, Interface’ler olabilmektedir. Lütfen olay nedir, özellik nedir, interface nedir gibi sorularla şimdilik meşgul olmayın.
Yukarıda belirtildiği gibi Class’lar metotları barındırabilmektedir. Ayrıca C# projelerinde Main() metodunun bulunması zorunludur. Yukarıda verdiğim en kısıtlı C# programı içinde hazırladığım Class’ta 2. bir metot hazırladım. Herhangi bir satır içermeyen bu metot bu hali ile herhangi bir işlem yapmaz. Bu metodu da hem statik hem de void olarak işaret ettiğimi fark etmiş olmalısınız.
class Deneme
{
static void Main(string[] args)
{
int yil;
}
static void Mesaj()
{
}
}
Konsoldan Mesajlar
Daha önce C#, C++, Delphi gibi bir programlama dili ile program geliştirmiş iseniz bu derste anlatılanlar size son derece basit gelecektir. Bu derslerdeki amaçlarımdan birisi C# gibi bir programlama dilinin nasıl kolay öğrenilebileceğini kanıtlamaktır.
Programcılıkta tecrübeli arkadaşlara bir önerim var; sizler bu yazıda ne anlatıldığı ile değil nasıl anlatıldığı ile ilgilenebilirsiniz. Belki bir üniversitenin öğretim görevlisisiniz, belki bir Microsoft eğitim merkezinde eğitmensiniz.
Şimdi ise yukarıda verdiğim basit C# kod dosyası içinde Mesaj() adını verdiğim metodu işleteceğim. Hazırladığım metot aynı sınıfın içinde olduğu için herhangi bir hazırlık yapmadan direk adıyla çağırıp işletmek mümkündür.
class Deneme
{
static void Main(string[] args)
{
int yil;
Mesaj();
}
static void Mesaj()
{
}
}
Bu hali ile bu C# programı veya CS uzantılı dosya DOS penceresinde derlenip EXE hazırlanıp çalıştırılırsa Main() metodu otomatik olarak işletilir. Çünkü yukarıda söylendiği gibi C# programları Main() metodundan itibaren çalışmaya başlarlar.
Bu programı aşağıdaki gibi düzenlemiş olsaydım değişen bir şey olmazdı. Bu kısa örnekte "yil" adını verdiğim değişkeni hiç kullanmadığım için C# derleyicisi derleme sırasında uyarı mesajı verir.
class Deneme
{
static void Mesaj()
{
}
static void Main(string[] args)
{
int yil;
Mesaj();
}
}
Şimdi bu Mesaj() adını verdiğim metoda müdahale edip işletildiği zaman ekrana bilgi yazılmasını sağlayacağım. Konsolda yani DOS penceresinde çalışan C# projelerinde ekrana bilgi yazma işlemleri .NET Framework ile gelen Console sınıfında tanımlı olan Write() veya WriteLine() metotları ile yapılmaktadır.
Tam bu noktada elime fırsat geçmişken biraz kendimden bahsetmek isterim. Yıllardır Memik Yanık aleyhine konuşanların en genel geçer suçlaması şuydu: "Memik Yanık kitaplarını ekran görüntüleri ile doldurup kitapları şişiriyor". Gördüğünüz gibi yukarıda Not Defteri ile hazırladığım toplam 12 satırdan meydana gelen kodun kendisini vermek yerine kodu yazmış olduğum Not Defteri penceresinin ekran görüntüsünü verdim. Bu metni kitap için yazmış olsaydım ekran görüntüsünü belli bir oranda küçültüp kitapta daha az yer kalmasını sağlardım.
Aşağıda ise bu Not Defteri penceresine yazmış olduğum kodun kendisi var. Sizce kitap metni içinde hangisi çok yer kaplar, ekran görüntüsü mü yoksa kodun kendisi mi? Seçilen puntoya bağlı olarak değişse bile aralarında önemsenecek bir farkın olmadığını söyleyebilirim. Ne ki ekran görüntüsü şeklinde verilen kısa kodları incelemek daha kolaydır.
class Deneme
{
static void Main(string[] args)
{
int yil;
Mesaj();
}
static void Mesaj()
{
System.Console.WriteLine("Fenerbahçe");
}
}
Bu şekilde düzenlenen C# uygulaması DOS penceresinde derlenip çalıştırıldığında ekrana "Fenerbahçe" yazdırılır. Mesaj() metoduna yazdığım satır hakkında biraz konuşmak gerekirse; "System.Console.WriteLine("Fenerbahçe");" satırındaki System bir Namespace’tir. Şimdi diyeceksiniz Namespace nedir? Cevabım hazır: Lütfen merakınızı sonraya saklayın; halk dili ile söylemek gerekirse "üzümü ye bağını sorma".
Kısaca anlatmak gerekirse Class’lar Namespace’lerin içine yerleştirilmektedir. System adlı Namespace .NET Framework ile gelen en önemli Namespace’tir ve çok sayıda Class’ı barındırmaktadır. DOS penceresine veya konsola bilgi yazmak üzere hazırladığım satırdaki Console bir Class’tır. Çok sayıda metoda sahip olan bu Class’ın sayesinde konsol yani DOS penceresi ile ilgili istenen işlemler yapılabilmektedir. Bu satırdaki WriteLine() ise Console sınıfının bir metodudur.
Yazdırma Metodları
Bu konuyu bir okulda, bir dershanede veya seminerde anlatıyor olsaydım C# hakkında biraz bilgisi olanlar "Memik bey WriteLine() static bir metot değil mi?" diye sorabilirlerdi. Soruyu soranlara cevabım "evet, WriteLine() metodu statik bir metottur". Tabii dersi veya semineri izleyenlerin bazıları "statik olanla olmayan metot arasında ne fark vardır" diye soru soracaklardı, bazıları ise keşke bu konuşulanları anlasaydım diye iç geçireceklerdi. Fırsat bu fırsat deyip hemen statik olan ve olmayan metotlar hakkında uzun açıklamalar yapmayacağım. Arkadaşlar lütfen biraz sabır.
Bazılarınız bu kısacak örneği bile hemen denemek, bu CS uzantılı dosyayı derleyip EXE dosya hazırlamak istiyor olabilir. Bu isteğe uyup CS uzantılı kod dosyasını derleyip EXE yapma üzerinde duracağım. Not Defteri ile hazırlayacağınız kod dosyalarını yerleştirmek üzere ayrı bir klasör hazırlamanızı öneririm. Bu klasör "C:" sürücüsünün kök klasöründe olursa ulaşılması kolay olur.
C#’ın kurallarına uyarak yazdığınız programları derleyip EXE dosya hazırlayacak program dosyası(CSC.EXE) Windows’un kurulu olduğu klasörün altında "Microsoft.NETFramework" klasöründe yer almaktadır. .NET Framework’ün başka sürümünden yararlanıyorsanız bu klasörün adı farklı olabilir.
Hazırlayacağınız CS uzantılı dosyaları ya CSC.EXE dosyasının bulunduğu bu klasöre kaydetmeli ya da Denetim Masasındaki Sistem seçeneği ile ekrana getirilen Sistem Özellikleri diyalog kutusunda Gelişmiş sekmesindeki Sistem Değişkenleri seçeneğinden yararlanmalısınız. Path seçeneğinin içeriğine aşağıda verdiğim satırı ekleyip bilgisayarı yeniden başlatırsanız istediğiniz yerden CS uzantılı program dosyalarını derleyebilirsiniz.
"C:WINDOWSMicrosoft.NETFrameworkv2.0.50727;"
Şimdi sıra geldi bu programı derlemeye. Bu amaçla bir DOS penceresi açıp komut satırına "CSC ILK.CS" yazıp Enter tuşuna basınca C# programı derlenmeye başlandı. Yazdığım programda herhangi bir hata olmadığı için EXE dosya hazırlandı.
Yazdığım programda Main() metodu içinde "yil" adında ve int tipinde bir değişken tanımlamış olmama rağmen bu değişkeni hiç kullanmadığım için derleyici uyarıda bulundu. Bu uyarı ILK.CS dosyasından yola çıkılıp ILK.EXE dosyasının hazırlanmasına engel değildir. Derleyici uyarı yerine hata mesajı vermek zorunda kalsaydı EXE dosya hazırlanmazdı.
Tekrarlamak gerekirse derleme işlemi sonucu CS uzantılı C# programı ile aynı ada sahip bir EXE dosyası hazırlanır. Aşağıda verdiğim ekran görüntüsünü bu EXE dosyayı çalıştırdıktan sonra aldım. Derleme sonucu hazırlanan EXE dosya ancak .NET Framework kurulu bilgisayarda çalışır. Bu EXE dosyayı alıp .NET Framework kurulu olmayan başka bir bilgisayara götürdüğünüzde çalışmaz. Aşağıda verdiğim ekran görüntüsünü hazırladığım EXE dosyayı çalıştırdıktan sonra aldım.
Hazırlayıp derlediğim C# programı ekrana bu bilgiyi yazdıktan sonra çalışması otomatik olarak sona erer. Şimdi bu örmekte öyle bir ayarlama yapalım ki programın veya EXE dosyanın çalışması Enter tuşuna basıncaya kadar devam etsin. Programın çalışmasının Enter tuşuna basıncaya kadar devam etmesini sağlamak üzere koda bazı eklemeler yaptım.
class Deneme
{
static void Main(string[] args)
{
int yil;
Mesaj();
System.Console.WriteLine();
System.Console.Write("Çıkmak için Enter Tuşuna Basın");
System.Console.Read();
}
static void Mesaj()
{
System.Console.WriteLine("Şampiyon Fenerbahçe");
}
}
Gördüğünüz Console sınıfının WriteLine() metodunu Mesaj() adını verdiğim metodun içinden başka bir de Main() metodu içinde kullandım. Bu örnekte Main() metodu içinde önce Mesaj() adını verdiğim metot çağrıldığı için ekrana önce "Şampiyon Fenerbahçe" yazılır. Mesaj() metodunun çağrıldığı satırdan sonra yine WriteLine() metodu kullanılmaktadır. Bu kez WriteLine() metoduna ekrana yazılmak üzere bilgi parametre olarak verilmediği için ekranın o satırı boş kalır. Bir sonraki satırda ise WriteLine() yerine Write() metodunu kullandım.
WriteLine() metodu kendisine parametre olarak verilen bilgiyi ekrana yani DOS penceresine yazdıktan sonra imleci bir sonraki satırın başına alır. Write() metodu ise WriteLine() metodundan farklı olarak imleci bir sonraki satırın başına almaz. Burada programın çalışmasının kendiliğinden sona ermesini engelleyen metot ise Read(). Bu şekilde düzenlenen C# programı derlenip çalıştırıldığında aşağıdaki gibi bir sonuç alınır.
Read() metodu gerçekte kullanıcının gireceği bilgileri programa veya bir değişkene aktarılırken işlevsel olmaktadır. Bu örnekte kullanıcının bilgi girmesini istemediğimiz için Read() metodundan önce herhangi bir değişken adı yazmadım. Diğer yandan yukarıda verdiğim örnekte asıl anlatmak istediğim şuydu: C# programları Class’lar şeklinde hazırlanmakta ve Class’larda kod blokları metot şeklinde düzenlenmektedir.
Bu düşünce ile hazırladığım kısacık örnekte Main() metodundan başka Mesaj() adında bir metot hazırlayıp Main() metodu dahilinde işlettim. Şimdi bu örnekte değişiklik yapıp Mesaj() adını verdiğim metodu silip çalışma anında "yil" adını verdiğim değişkene bilgi aktarmaya çalışacağım.
class Deneme
{
static void Main(string[] args)
{
int yil;
System.Console.Write("Hangi Yıldayız : ");
yil = System.Console.Read();
}
}
Bu şekilde değiştirdiğim C# programında önce Write() metodu ile kullanıcıya mesaj verdikten sonra bir sonraki satırda Read() metodu sayesinde kullanıcıdan istenen bilgiyi "yil" adını verdiğim değişkene aktardım. Aşağıda verdiğim ekran görüntüsünü bu kısa programı derleyip çalıştırdıktan sonra aldım.
Ekrana mesaj yazarken Write() yerine WriteLine() metodunu kullansaydım imleç bilgi girişi için bir sonraki satırda beklerdi. Şimdi bu C# programına ekleme yapıp kullanıcıdan istenip "yıl" değişkenine aktarılan bilgiyi WriteLine() metodu ile tekrar ekrana yazacağım.
class Deneme
{
static void Main(string[] args)
{
int yil;
System.Console.Write("Hangi Yıldayız : ");
yil = System.Console.Read();
System.Console.WriteLine();
System.Console.Write("Girdiğiniz Yıl :");
System.Console.WriteLine(yil);
}
}
Bu şekilde düzenlenen örnek derlenirken hata vermediği gibi çalıştırıldığında da hata vermez ama girilen yıl bilgisi ile sonradan Write() metodu ile ekrana yazılan yıl bilgisi birbirinden farklı olur. Aşağıda verdiğim ekran görüntüsünü bu C# programını derleyip çalıştırdıktan sonra aldım.
Bu hatanın nasıl düzeltileceğini hemen anlatmak yerine bir sonraki derste C# ile ilgili temel bilgileri kaldığımız yerden vermeye devam edeceğim.
Bu Dersin Özeti
Birkaç cümle ile yukarıda yazılanları özetlemek gerekirse; Not Defteri ile yazdığımız ilk programda önce Class bloğuna yer verdik. Bildiğiniz gibi C# programlarında blok başı "{" ile ve blok sonu ise "}" ile işaret edilmektedir. C# programları çalışmaya Main() metodundan itibaren başladıkları için Class’ın sınırları içinde Main() metoduna yer verdik. Main() metodu içinde Console sınıfının WriteLine() metodu ile konsola yani DOS penceresine bilgi yazmayı denedik. Ayrıca .NET Framework ile gelen C# derleyicisi ile yani CSC.EXE ile CS uzantısı ile kaydettiğimiz C# programlarını derleyip EXE dosya hazırladık.
Yukarıda yazılanları okurken kafanızda bazı soruların belirdiğini tahmin etmek zor değil. Programcılık biraz da bisiklet sürmeyi öğrenmek gibidir: Önceler sık sık bisikletten düşersiniz, insanların 2 teker üzerinde nasıl düşmeden gittiklerine hayret edersiniz. Sonra 50 metre düşmediğinizde; bisiklet sürmesini öğrendiğinizi fark edersiniz. Birçok kişi programcılığa nereden başlayacağı konusunda tereddüde düşüyor. Bu soruların cevaplarını bu dersler boyunca birlikte araştıracağız.
:: Derste takıldığınız yeri forumlarımızda sorun.
Yazan: Memik Yanık
SDN – http://shiftdelete.net
İşte tam aradığım şey.Hocam çok teşekkürler…
hocam ben dos ta sizin verdiginiz komutu yazinca bisey olmuyo (csc ilk.cs)
bende javaya yeni başlayan biri olarak aynı zamanda sizin derslerinizi de takip ediyorum. Teşekkürler…
“hocam ben dos ta sizin verdiginiz komutu yazinca bisey olmuyo (csc ilk.cs)” büyük bir olasılıkla CSC.EXE dosyasının bulunduğu klasörü arama yoluna dahil etmemişsindir. Sistem özellikleri penceresinde Gelişmiş Sekmesindeki Ortam Değişkenleri düğmesini tıklayıp Path seçeneğine ait metne “C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727; ” eklemeniz gerekebilir
hocam merakla devamını bekliyoruz:) süpersiniz
Merhaba Bunu yayınlamak zorunda değilsiniz.
Hocam ben şunu anlamıyorum burada C# öğrenenlerin çoğu daha onceden C yada C++ bilmiyor. O yüzden neden hala C den C++ geçene öğretir gibi C de şöyleydi bunda böyleydi diye anlatıyorsunuz.
İkinci bir konuda çok fazla dilbilgisi hatası var okuma zevkini kırıyor.
Saygılar
hocam vallahi buradan programlamayı artık iyice öğrenmeye başladım:D
Yeterince açık 🙂 Tebrikler 🙂 Anlamaya çalışmamamız gerektiğini söylediğiniz yerler inatla gözüme batsa da çok verimli görünüyor 🙂
“C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727; yi eklememe rağmen dos penceresinde çalıştıramıyorum.