Bir önceki derste Not Defteri ile kısa bir C#
programı hazırlayıp “ilk.cs” adıyla kaydetmiştik. Devamında bu CS uzantılı C#
programını derleyip EXE dosya hazırlamıştık. Hatta örneğimizin son hali
beklediğimiz sonucu vermemişti. Bu dersimizde ilk olarak o derste yaptığımız
örneği düzelteceğiz. Bir önceki dersimizde hazırladığımız örneğin son şeklini
aşağıda verdim.

 

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 koda dikkat ederseniz konsoldan bilgi okuma
işlemi Read() metodu ile yapılmaktadır. Read() metodu konsoldan okuma
yaparken girilen bilginin ilk karakterinin ASCII kodunu geriye göndermektedir.
Bu örnek program çalıştırılıp “Hangi Yıldayız :” sorusuna “A” ile cevap
verilirse ekrana 65 yazılır. Çünkü “A” hafinin ASCII kodu 65’dir.

 

Console
sınıfının ReadLine() metodu ise farklı
bir şekilde çalışmaktadır ve konsoldan yani DOS penceresinden okuduğu bilginin
String tipte olduğunu varsaymaktadır. Bu nedenle yukarıda verdiğimde
örnekte değişiklik yapıp okuma işlemini Read() yerine ReadLine() metodu ile
yapmaya çalıştım.

 

class Deneme

 {

   static void Main(string[] args)

    {

       int yil;

       System.Console.Write("Hangi Yıldayız : ");

       yil = System.Console.ReadLine();

       System.Console.Write("Girdiğiniz Yıl :");

       System.Console.WriteLine(yil);

    }


 }
  
    

 

Bu şekilde değiştirdiğimiz C# programını
derlemeye çalışırsak hata meydana gelir. Çünkü ReadLine() metodu tarafından
okunup geriye gönderilen bilgi String tipte olmasına rağmen burada int
tipindeki değişkene aktarmaya çalışıyorum. Bu hatanın önüne geçmek için “yil”
adını verdiğim değişken yerine string tipte bir değişken tanımlayıp kullandım.

 

class Deneme

 {

   static void Main(string[] args)

    {

       string str;

       System.Console.Write("Hangi Yıldayız : ");

       str = System.Console.ReadLine();

       System.Console.Write("Girdiğiniz Yıl :");

       System.Console.WriteLine(str);

    }


 }      

 

Bu hali ile programımız istediğimiz sonucu
verir. Bu örnekte konsoldan girilen “yıl” bilgisi matematiksel işlemlerde
kullanılmadığı için rakamlardan meydana gelse bile string yani karaktersel bilgi
olarak değerlendirmenin bir sakıncası olmaz.

 
Şimdi bu örnekte değişiklik yapıp kullanıcıdan iki sayısal bilgi isteyip bunları birbirleri ile çarptıktan sonra sonucu ekrana
yani konsola yazacağım. Bu amaçla önce iki string değişken tanımlayıp
ReadLine() metodu ile okunan bilgileri bu değişkenlere aktardım.

 

Bu program bu hali ile kaydedilip
çalıştırılırsa konsoldan girilen bilgiler string değişkenlere aktarılır. Bu
örnekteki amacımız kullanıcının sayısal bilgi girmesini ve bu sayıları birbiri
ile çarpıp ekrana getirmek olduğu için matematiksel işlem öncesi String
değişkenlerin içeriğini int tipindeki değişkenlere aktarmak gerekir. Bu amaçla
bu C# programına ekleme yapıp int tipinde iki değişken tanımladım. Ardından string
değişkenlerin içeriklerini dönüştürüp int tipindeki bu değişkenlere aktardım.

 

class Deneme

 {

   static void Main(string[] args)

    {

      string str1;

      string str2;

      int sayi1;

      int sayi2;

      System.Console.Write("İlk sayıyı girin   : ");

      str1 = System.Console.ReadLine();

      System.Console.Write("İkinci sayıyı girin:
");                     

      str2 = System.Console.ReadLine();

      sayi1 = System.Int16.Parse(str1);

      sayi2 = System.Int16.Parse(str2);

    }


 }  
    

 

Bu kodda sizin için yeni olan System adlı
Namespace’de yer alan Int16 sınıfıdır. String bilgiyi int tipindeki
değişkene aktarırken bu sınıfın Parse() metodunu kullandım. Bu dönüştürme
işlemini yaparken Int16 yerine Int32 sınıfının Parse() metodunu
kullanabilirdim.

 

Hemen hatırlatmada bulunmak isterim: Her ne
kadar bu örnekte kullanıcıya sayı girin mesajı verilmiş olunsa bile kullanıcı
sayısal bilgi yerine karaktersel bilgi girerse Parse() metodu dönüştürme yapamayacağı için
hata meydana gelir. Bu tip muhtemel hataların önene geçmek için hata kontrol
blokları hazırlanır.

 
Bu şekilde konsoldan girilen bilgileri
Parse() metodu ile dönüştürüp int tipindeki değişkenlere aktardıktan sonra
matematiksel işlem yapabiliriz. Matematiksel işlem sonucu bulunacak değeri
aktarmak üzere int tipinde
3. bir
değişken tanımladım.

 

Bu kodu dikkatice incelerseniz bir satırda
aynı tipte birden fazla değişkeni tanımlamış olduğumuzu görürsünüz. Hemen
hatırlatmak gerekirse; bu programı derleyip çalıştırıp sonra 1. sayı ile 2.
sayının çarpımı sonucu elde edilen sayısal bilgi 2.147.483.647’den büyük olursa
hata meydana gelir.

 

Ayrıca string bilgileri Int16 sınıfının
Parse() metodu ile dönüştürdüğümüz için konsoldan girilen sayılar
32767’den büyük olmamalı. Int16 sınıfının Parse() metodu yerine Int32
sınıfının Parse() metodunu kullansaydım 1. veya 2. sayı 2.147.483.647 gibi büyük
bir değer olabilirdi.

 

Çarpma işlemi sonucu bulunan değeri WriteLine()
metodu sayesinde direk konsola yazmak mümkün olmasına rağmen amacım bazı
konuları anlatmak olduğu için üçüncü bir string değişken tanımlayıp çarpma
işlemi sonucu bulunan değeri dönüştürüp bu değişkene aktardım. Bu işlemi nasıl
yaptığımı aşağıda görebilirsiniz.

 

class Deneme

 {

   static void Main(string[] args)

    {

      string str1,str2, sonuc_str;

      int sonuc, sayi1, sayi2;

      System.Console.Write("İlk sayıyı girin   : ");

      str1 = System.Console.ReadLine();

      System.Console.Write("İkinci sayıyı girin:
");                     

      str2 = System.Console.ReadLine();

 

      sayi1 = System.Int32.Parse(str1);

      sayi2 = System.Int32.Parse(str2);

      sonuc = sayi1 * sayi2;

      sonuc_str = System.Convert.ToString(sonuc);

    }

 }

 

Dikkat ederseniz burada int tipindeki
değişkenin içeriğini string tipindeki değişkene aktarabilmek için
Convert sınıfının ToString() metodundan yararlandım. C# ile az çok
uğraşmış olanlar bu işlemin daha kısa bir yolunun olduğunu ileri sürebilirler.
Bu arkadaşlar haklıdırlar; dönüştürme yaparken Convert sınıfının ToString()
metodu yerine Object sınıfının ToString() metodunu
kullanabilirsiniz. Object sınıfının ToString() metodunun nasıl
kullanıldığını daha sonra anlatacağım. ToString() metodu ile integer bilgiyi
string bilgiye dönüştürdükten sonra WriteLine() metodu ile konsola yazdım.

 

class Deneme

 {

   static void Main(string[] args)

    {

      string str1,str2, sonuc_str;

      int sonuc, sayi1, sayi2;

      System.Console.Write("İlk sayıyı girin   : ");

      str1 = System.Console.ReadLine();

      System.Console.Write("İkinci sayıyı girin:
");                     

      str2 = System.Console.ReadLine();

 

      sayi1 = System.Int32.Parse(str1);

      sayi2 = System.Int32.Parse(str2);

      sonuc = sayi1 * sayi2;

      sonuc_str = System.Convert.ToString(sonuc);

      System.Console.WriteLine("Sayıların çarpımı  : " + sonuc_str);

      System.Console.Write("Devam etmek için bir tuşa basın");

      System.Console.Read();

    }


 }      

 

Biraz da Namespace’lerden Söz Edelim

 

Şimdi yukarıda uzun uzun anlatılan örneği bir
tarafa bırakıp başka bir örnek hazırlayacağım. C# programlarını Visual Studio veya C# için hazırlanmış Express Edition’dan
yararlanma yoluna henüz gitmediğimiz için CS uzantılı C# programını yine Not
Defteri ile hazırlayacağız. Hazırladığım basit C# programını aşağıda verdim. DOS
penceresinde derlenip DOS penceresinden bilgi alış verişi yapan C# programlarına
konsol uygulaması adı verilmektedir.

 

Class Sinif_1

{

  public static void Main()

   {

      System.Console.Write("Efes Pilsen Basketbol Takımı");

      System.Console.ReadLine();

   }

}

 

Bu şekilde hazırlanan C# programı DOS
ortamında derlenip çalıştırılırsa belirtilen bilgi Write() metodu
sayesinde DOS penceresine yazılır. Bir sonraki satırda kullanılan ReadLine()
metodu sayesinde enter tuşuna basılıncaya kadar program çalışmaya devam eder. Bu
örnekte ReadLine() yerine Read() metodu kullanılsaydı değişen bir şey
olmazdı.

 

.NET Framework adı verilen sınıf kitaplığı ile
gelen sınıfların Namespace adı verilen yapılarda saklandığını
biliyorsunuz. C# programlarında kullanmak istediğiniz Class hangi Namespace’in
içinde yer alıyorsa o Namespace’ı using deyimi ile programa dahil
etmelisiniz veya yukarıda yapıldığı gibi kullanmak istediğiniz Namespace’in
adını metodun önüne her seferinde yazmalısınız.

 

DOS penceresi ile ilgili Console sınıfı
System adlı Namespace’te yer aldığı için Write() metodundan önce bu
sınıfın yer aldığı Namespace’in adını yazdım. Söz konusu Namespace’teki
sınıfları programınızda çok kez kullanıyorsanız her seferinde Namespace’in adını
bu şekilde yazmak yerine aşağıda yapıldığı gibi ilgili Namespace’i using
deyimi ile koda dâhil edebilirsiniz.
using
deyimi ile olmayan bir namespace’i C# programınıza dahil etmek istemeniz halinde
derleme sırasında hata meydana gelir.

 

using System;

Class sinif_1

{

  public static void Main()

  {

    Console.Write("Efes Pilsen Basketbol Takımı");

    Console.ReadLine();

  }

}

 

C# programlarınızda .NET Framework ile gelen
Namespace’lerdeki hazır sınıfları kullanmanın ötesinde kendi hazırladığınız
class’ları bir Namespace’in içine koymanız gerekir. Yukarıda bunu yapmamış
olmamıza rağmen herhangi bir hata meydana gelmedi. Çünkü programcı yazdıklarını
bir Namespace’e yerleştirmediği zaman C# derleyicisi kendiliğinden bir Namespace
hazırlamaktadır. Şimdi yukarıda verdiğim programdaki “Sinif_1” adını verdiğim Class’ı
bir Namespace’e dahil edeceğim.

 

using System;

namespace SDN

 {

   class sinif_1

    {

      public static void Main()

       {

         Console.Write("Efes Pilsen Basketbol Takımı");

         Console.ReadLine();

       }

    }

  }

 

Yukarıda bold yapılan paragrafı ve bu kısa C#
kodunu; C++ veya Java gibi nesneye yönelik programlama dilleri hakkında az çok
bilgi sahibi olan birisine gösterseniz şaşırıp “bunda önemli olan nedir veya
üzerinde durulacak ne var ki?” diye size soru yöneltmesi yüksek ihtimaldir.
Çünkü konuya kendi açısından bakacaktır. Bu dersleri C# veya nesneye yönelik
programcılık konusunda yeni olanları düşünerek kaleme aldığım için yukarıda
verdiğim kısa kod ve kalın(bold) yapılan açıklama karşısında duraklamanız normaldir.
Bu düşünce ile aşağıda farklı renge boyanan paragrafı kaleme aldım.

 

C# veya Visual Basic’in .NET
uyumlu sürümü ile program yazanların kaçmakla kurtulamayacakları iki kavramdan
birisi Class, diğeri ise Namespace’tir. Nesneye yönelik
programcılığın temeli olan Class kavramı hakkında henüz doğru dürüst bilgi
verilmemiş olmakla birlikte sanırım Class kavramı hakkında kafanızda beliren
soruların üzerinde durmamayı şimdilik başarıyorsunuz Class bir yana bir de
Namespace’ten söz edilince kafanızdaki sorular önem kazanmaya başlamış olabilir. 

 

Birden Fazla Main() Metodu

 

Uygulamanızda birden fazla Class varsa Main()
metodunun hangi Class’ta olduğunun önemi yoktur. Çünkü C# derleyicisi Main()
metodunun hangi Class’ta olduğunu arayıp buluyor. Uygulamadaki birden fazla
sınıfta Main() metodu varsa hangisinin kullanılacağının belirtilmesi
gerekir. Bu konuda bilgi vermek için aşağıdaki gibi bir C# programı hazırladım.

 

using System;

class sinif_1

 {

   public static void Main()

   {

     Console.Write("Program İlk sınıftaki Main ile başladı");

     Console.ReadLine();

   }

 }

 class sinif_2

  {

   public static void Main()

    {

     Console.Write("Program İkinci sınıftaki Main ile başladı");

     Console.ReadLine();

   }

 }

 

Bu şekilde hazırlanan C# programı bilinen
şekilde derlendiğinde hata meydana gelir. Derleme satırında hangi sınıftaki
Main() metodunun kullanılmak istendiği belirtilmelidir. Bu konsol uygulaması
aşağıdaki gibi derlenirse uygulama ilk sınıftaki Main() metodundan itibaren
çalışmaya başlar.

 

 

Bu örneğe biraz dikkat ederseniz Main()
metodunun bu kez parametresiz olduğunu veya parantezin içine herhangi bir
değişken adı yazmadığımı görürsünüz. Ayrıca bu örnekte Namespace
hazırlamadığımı fark etmiş olmalısınız.

 

Write ve WriteLine Metotları

Yukarıda verdiğim örneklerde konsola yalnızca
bir bilgi yazdım. Şimdi konunun anlaşılmasına katkı olması için 4 bilgiyi yazacağım. Bu amaçla
aşağıda verdiğim C# programını hazırladım.

 

using System;

namespace SDN

 {

  class sinif_1

    {

     public static void Main()

      {

        Console.Write("Fenerbahçe");

        Console.Write("Galatasaray");

        Console.Write("Beşiktaş");

        Console.Write("Trabzonspor");

        Console.ReadLine();

      }

   }

 }

 

Bu programda Write() metodu ile konsola
4 bilgi arka arkaya yazılmakta ve ReadLine() metodu ile programın
işletimi askıya alınmaktadır. Write() metodu ile konsola bilgi yazıldıktan sonra
imleç yazma işleminin tamamlandığı yerde bekleyeceği için bu program derlenip
çalıştırılırsa aşağıdaki gibi bir sonuç elde edilir.

 

Bu bilgilerin ayrı satırlara yazılmasını
sağlamak için Write() yerine WriteLine() metodunu kullanabilirsiniz.
WriteLine() metodu kendisine parametre olarak verilen bilgiyi belirtilen
ortama(burada konsol) yazdıktan sonra imleci bir sonraki satırın başına alır.

 

using System;

namespace SDN

 {

  class sinif_1

    {

     public static void Main()

      {

        Console.WriteLine("Fenerbahçe");

        Console.WriteLine("Galatasaray");

        Console.WriteLine("Beşiktaş");

        Console.WriteLine("Trabzonspor");

        Console.Read();

      }

   }

 }

 

Write() metodu ile konsola yazılan metnin
sonuna satır başı karakterini(“n”) ekleyerek aynı sonucu alabilirsiniz. Satır
başı karakterinin nasıl kullanıldığını aşağıda görebilirsiniz.

 

using System;

namespace SDN

 {

  class sinif_1

    {

     public static void Main()

      {

         Console.Write("Fenerbahçen");

         Console.Write("Galatasaray n");

         Console.Write("Beşiktaş n");

         Console.Write("Trabzonspor n");

         Console.Read();

      }

   }

}

 

 


Yazan: Memik Yanık

SDN – http://shiftdelete.net