Volkan Atasever

Founder of inhoftec Solutions - Bilgisayar Mühendisi - Yazılım Uzmanı & Danışmanı - PCWorld Dergisi Yazarı - INETA User Group Lead - Technologist - Speaker - Technology Researcher

Türkçe İçerikli C# Kodlama Standartları

clock Aralık 26, 2010 13:30 author Volkan Atasever tarafından yayınlanmıştır

Türkçe içerikili C# kodlama standarları gönüllü bir proje ekibi ile gerçekleşti. Proje Koordinatörü ve Editör Kadir Çamoğlu önderliğinde gerçekleştiğimiz bu proje ülkemizdeki bir eksikliği kapattı. Bende Yazar olarak ekipteki yerimi alarak bu projeye destek verdim. Oldukça kaliteli bir içerik ile ortaya faydalı bir C# Kodlama Standartları dökümantasyonu ortaya çıktı. Herkes kendi deneyimlerinen yola çıkarak bu standartları geliştirdi.


C# Kodlama Standartlarını indirmek için: tiks_cs_v1.0.pdf (1,84 mb)

Orjinal link: http://www.mediafire.com/?7umxy0eumpja8

Proje ekibi aşağıdaki gibidir. 20'te yakında döküman gözden geçiricii bu projede yer almıştır.

Proje Koordinatörü
Kadir Çamoğlu
Editör
Kadir Çamoğlu
Kapak Tasarımı
Hakan Çamoğlu
Yazarlar
Volkan ATASEVER
Merve CEYLAN
Burhan ÇETİNKAYA
Bahtiyar DİLEK
İrfan MEVSİM
Can YAPAN
Hakan YAVUZ
Yücel YILDIRIM

 



Dizideki sayılar kaç defa tekrar etmiş ! (C ile yazılmıştır)

clock Eylül 27, 2008 23:39 author Volkan Atasever tarafından yayınlanmıştır

 C ile girilen sayının kaç defa tekrar ettiğini bulan dizideki yerini veren küçük uygulama.

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
int *hesapla(int *adr);
int *tut;
int main()
{
  int *p,*sonuc,i,say;
 
  do{
    p=(int *)calloc(sizeof(int),10);
  }while(p=='\0');

  for(i=0;i<10;++i)
  {
 do{
   scanf("%d",(p+i));
 }while(*p<=0 | *p>100); 
  }
 p-10;
  for(say=0;say<10;++say)
     printf("%d. Sirada % d numarali Sayi vardir\n",say+1,*(p+say));
  sonuc=hesapla(p);

            for (say = 0; say < 10; ++say)
            {

              if (*(sonuc+say) == -2)
                    printf("%d.Sayi Tekrar etmemis\n",say+1);
                else if(*(sonuc+say)==-1)
                   printf("%d. Sayinin istatistigi verilmisti\n",say+1);
                else
                  printf("%d. Siradaki %d kadar Tekrar Etmistir\n",say+1,*(sonuc+say));
              
            }    
 getch();
return 0;
}
int *hesapla(int *adr)
{
   int i,j;
   tut=(int *)calloc(sizeof(int),10);
  for (i = 0; i < 10; ++i)
            {
              
                for (j = i + 1; j < 10; ++j)
                {
                    if (*(adr+i) != '\0')
                        if (*(adr+i) == *(adr+j))
                        {
                            *(tut+i) = *(tut+i) + 1;
                            *(adr+j) = '\0';
                            *(tut+j)=-1;
                        }
                   
                   }
                   if(*(tut+i)==0)
                     *(tut+i)=-2;
               
            }
         
  return tut;
}



C# ile textbox'a saat girişi

clock Eylül 24, 2008 02:02 author Volkan Atasever tarafından yayınlanmıştır

Textbox'ın textchange event'ine aşağıdaki kodu yazdığınızda saat girişlerinizde : eklenir ve saat,dakika, saniye sınırlarının aşılmasını engeller. C# ile yazılmış bu kod VS 2005 ile denenmiştir. Bir ara lazım olmuştu o zaman yazmıştım. Arada aklıma geldikçe küçük kod parçaları paylaşacağım. Sizde sorularınızı iletişim bölümünden bana ulaştırabilirsiniz.

 int i=0;

          ++i;
            char[] ayrac ={ ':' };
            string[] strarray = textBox1.Text.Split(ayrac);
            try
            {
                switch (i)
                {
                    case 1:

                        break;
                    case 2:
                        textBox1.Text += ":";
                        textBox1.SelectionStart = 3;
                        if (Convert.ToInt32(strarray[0]) >= 24)
                        {
                            textBox1.Text = "";
                            i = 0;
                        }

                        break;
                    case 4:
                        break;
                    case 5:
                        textBox1.Text += ":";
                        textBox1.SelectionStart = 6;
                        if (Convert.ToInt32(strarray[1]) >= 60)
                        {
                            textBox1.Text = "";
                            i = 0;
                        }
                        break;
                    case 7:
                        break;
                    case 8:
                        break;
                    case 9:

                        i = 0;
                        textBox1.Text = "";
                        if (Convert.ToInt32(strarray[2]) >= 60)
                        {
                            textBox1.Text = "";
                            i = 0;
                        }
                        break;
                    default:
                        break;
                }
            }
            catch
            {
                textBox1.Text = "";
                i = 0;
            }

Döküman Güncellemesi: 02.02.2010

Kodun saniye kısmında hata yapılmış. Yorumu yazan arkadaşa teşekkür ederim. Yeni Kod açıklaması ile birlikte aşağıdadır. VS 2008 ile de test edilmiştir. 

    public partial class Form1 : Form
    {
        int i = 0;
        public Form1()
        {
            InitializeComponent();
        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {

            ++i;
            char[] ayrac = { ':' };
            string[] strarray = textBox1.Text.Split(ayrac);
            try
            {
                switch (i)
                {
                    case 1:

                        break;
                    case 2:
                        textBox1.Text += ":";
                        textBox1.SelectionStart = 3;
                        if (Convert.ToInt32(strarray[0]) >= 24)
                        {
                            textBox1.Text = "";
                            i = 0;
                        }

                        break;
                    case 4:
                        break;
                    case 5:
                        textBox1.Text += ":";
                        textBox1.SelectionStart = 6;
                        if (Convert.ToInt32(strarray[1]) >= 60)
                        {
                            textBox1.Text = "";
                            i = 0;
                        }
                        break;
                    case 7:
                        break;
                    case 8: 
                        if (Convert.ToInt32(strarray[2]) >= 60)
                        {
                            textBox1.Text = "";
                            i = 0;
                        }
                        break;
                       
                    case 9:
                        textBox1.Text = "";
                        i = 0;
                        break;
                    
                    default:
                        break;
                }
            }
            catch
            {
                textBox1.Text = "";
                i = 0;
            }

        }
    }

Görüldüğü gibi saat, dakika ve saniye zaman dilimleri dışına çıkarsa textbox silinecektir. Zaman dilimi tam girildikten sonra ekstradan giriş yapılmaya çalışırsa'da textbox silinecektir.



C# ile Oyun Yapımı Tekniklerine Giriş

clock Haziran 18, 2007 07:44 author Volkan Atasever tarafından yayınlanmıştır
Yıllardır programcılar C,C++ veya java gibi oldukça dezavantajları olan programlama dilleri ile oyun kodlamaya çalışmaktadırlar. Bunlar arasında C yapısal bir programlama dili olduğu için programcıyı en zorlayan ve karmaşık kodlar arasında programcının kaybolmasını sağlayan bir yapıya sahiptir. C++ ve Java için aynı şeyi söylemek mümkün değilken yinede bazı dezavantajları bulunmaktadır.

            C# için ise aynı şeyi söyleyemeyeceğim. Çok kullanışlı bir dil olmasına rağmen programcılar daha çok database programlamada bu dile rağbet etmektedir. Bizim üstünde duracağımız konu ise C# ile C++ veya Java’ya nazaran daha kolay bir şekilde oyun programlama yapabileceğimizdir. Bu kolaylıklar getiren ve durmadan gelişmekte olan dilin sadece Database programlamada kullanılması biraz saçma olurdu zaten. Şu anda DirectX veya diğer SDK lar ile kolayca programlama yapabilmekteyiz. Fakat oyun programlamaya yeni başlayan biri için DirectX biraz karmaşık gelebilir. En azından hiç oyun yazmamış birinin bu mantığı programa oturtmasında zorluklarla karşılaşılabilir. Bunun içinde temel bir oyun programlama mantığı ile “oyunları nasıl programlayabiliriz ? “ soru cümlesinin üstünde durmak isterim.

           Sıradan bir Jackpot düşünün kolu çekiyorsunu ve simgeler sırayla dönüyor ve rasgele bir şekilde 3 sıralama karşımıza çıkıyor. Bu sayının 3 olması standart bir işlem olmayıp 3,4 veya 5 li kombinasyonlara görede sıralama yapabiliyoruz.

          3 sıralı bir jackpotun karmaşıklığını ele alırsak ve her bir sırada da 4 adet simgenin ardarda döndüğünü düşünürsek toplamda elimizde 4 adet simge olacaktır ve biz bu 4 simgenin 3 lü sıralanışlarını ele alacağız. Olasılığımız ise 64 olacaktır.

          Jackpot gerçek hayatta mekanik bir yapıyla hareket etmekteyken biz yazılımsal bir yöntemle yaklaşacağımız için bu mekanişk yapının mantığını kağıda aktarmamız gerekecek. Olasıklarımız 64 adet olduğuna göre ve bu 64 olasılığı tutacağımız bir dizi işimizi görecektir. Mekanik yapıda şans devredeyken yazılımsal yapıda da aynı metodu ve rasgeleliği programımıza uygulamak için randomize ifadeler işimize yarayacaktır.

         Oyun tekniğimiz bu kadar basitken görselliğimizde oyun yapımcısının ellerindedir. İster çok kötü bir kullanıcı arayüzü ile bu işi halledelim, ister Las Vegas’dan alınmış bir jackpot görünümü verelim Arka planda en iyi teknikleri kullanmış olsanızda çok kötü gözüken bir oyun hiç tutmayacaktır. . Oyunun kullanıcı arayüzü de oyun programlamada geniş bir yer tutmakta olup bu yazımız da bunu gözardı etmek durumunda kalacağız. Oyunun görünümü kullanıcının oyunun başında ne kadar kalacağı ve oynama sıklığı ile doğru orantılıdır.

       Basit bir Jackpot programlamaya kalktığımızda öncelikle ortaya koyduğumuz kombinasyonları basit bir ifade ile diziye aktarmak olacaktır. Bu olasılıklar dizisini basit bir kod parçasıyla yazmamız mantıklıyken kombinasyonları görmemiz açısından tek tek elle yazmak bizim için daha yararlı olacaktır.

        Her bir resmimize bir rakam verelim bunlar sırasıyla 0,1,2,3 olsun. Birinci resmimiz 0, ikinci resmimiz 1 , üçüncü resmimiz 2 ve son resmimiz ise 3 numaralı sayı ile temsil edilmektedir. Toplam olasılığımızı ve resimlerin değişik kombinasyonlarını 3 lü sırada yazalım;

0,2,0
 0,2,1
 0,2,1
 0,2,3
1,0,0
 1,0,1
1,0,2
1,0,3
2,0,0
 2,0,1
 2,0,2
 2,0,3
 3,0,0
3,0,1
3,0,2
3,0,3
0,1,0
0,1,1
0,1,2
0,1,3
1,1,0
1,1,1
1,1,2
1,1,3
2,1,0
2,1,1
2,1,2
2,1,3
1,2,0
 1,2,1
1,2,2
1,2,3
0,3,0
0,3,1
0,3,2
 0,3,3
 3,3,0
3,3,1
3,3,2
3,3,3
3,1,0
 3,1,1
3,1,2
3,1,3
2,2,0
2,2,1
2,2,2
2,2,3
1,3,0
1,3,1
1,3,2
1,3,3
0,2,0
 0,2,1
 0,2,2
 0,2,3
3,2,0
3,2,1
3,2,2
3,2,3
2,3,0
2,3,1
2,3,2
2,3,3

  Bu 4’lü gruplarımızdan toplamda 16 adet bulunmaktadır. Önemli olan ise bizim için 64 sayısıdır çünkü jackpotun kolunu çevirdiğimizde bunlardan herhangi biri karşımıza gelmektedir. Randomize bir sayı oluşturup ardından 1 ile 64 arasında bize bir rakam verirse karşımızda rasgele koluna başılmış ve gerçek hayatta jackpotun işini yani içerdiği simgelerin rasgele sırlanışını elde etmiş oluruz.

         Artık temel oyun mantığımız hazır ve sırada sadece bu mantığı kodlamak kaldı bu mantığıda kod becerimize göre bir kabiliyetle kodlayabiliriz. Oyunda 4. Resim 3 tane çıkarsa oyuncu kazanır şeklinde bir mantık eklememiz çok kolay 64 sayısını randomize komutuyla elde ettiğimiz de oyuncu kazanacaktır veya birinci resim ilk iki karede çıkarsa 3. Nolursa olsun parasının iki katını kazanması için [1,1,0][1,1,1][1,1,2][1,1,3] kombinasyonlarından birisinin gelmesi yeterlidir.

         Aslında bunun Jackpot uygulaması için zor bir yol olduğunu ve C# programlama dili ile daha basit bir yolunun olduğunuda söylemek isterim. Klasik olarak yolumuz bu şekildeyken bir Timer nesnesi işimizi dahada kolaylaştırabilir. Peki, “bu timer nesnesi nedir ve nasıl bu işi daha kolay bir şekilde yapabiliriz ? ” sorusunu C# kodumuzun üstünde açıklamak isterim.

        Öncelikle Windows projesi oluşturup basit bir kullanıcı arayüzü yapalım burada para atacağımız bir kısım, bir kol, 3 adet imagelerimizi barındıracağımız bir picturebox, 4 veya daha fazla jetonlarımız ve birde kasamızda ne kadar bulunduğunu gösteren label veya textbox ile bu işe başlayalım. Yaptığım örnek uygulamanın görüntüsü aşağıdaki gibidir;

  Öncelikle oyunumuzu hazırlamak için alanlarımızı ve metodlarımızı belirleyelim ve windows uygulamasına ekleyeceğimiz bileşenleri inceleyelim;

      4 adet timer kontrolü ekleyelim ve bir tanede imagelist kontrolü. Bu imageliste göstereceğiniz 4 adet resim ekleyin.

      Alanlarımız;

      int[] tut;

      int para = 0;

      int oyun = 0;

      Çekeceğimiz kolun ters bir görünümünü alıp form load’un da bu picturebox’ın visible özelliğini false yapmamız gerekmektedir. Böylece kolu çekteğimizde oyuncu kolun aşağıya indiğini görecektir.

      Ardından bir baslangic metodu tasarlayalım;

     private void baslangic()

    {

        int[] timrand = new int[3];

        tut = new int[3];

       for (int i = 0; i < 3; ++i)

       {

              tut[i] = 0;

       }


 

      Random rast = new Random();

      timrand[0] = rast.Next(100, 250);

      timrand[1] = rast.Next(100, 250);

      timrand[2] = rast.Next(100, 250);

      timer1.Interval = timrand[0];

      timer2.Interval = timrand[1];

      timer3.Interval = timrand[2];

      timer4.Interval = 1000;

   }


 

           Timer1,timer2,timer3 ve timer4 eklediğimiz timerların isimleri. Timrand isimli integer dizimiz ve tut isimli dizimiz 3 boyutludur. Bir döngü ile tut dizimizin bütün indislerini sıfır yapıyoruz. Rast isminde bir Random nesne nesne oluşturup 100 ile 250 arasında bir değer tutmasını istiyoruz. Randomize rakamları timrand dizilerinin indislerine sırayla atıyoruz. Timerlarımızın interval özelliğini bu rakamlarla belirliyoruz. Böylece yaşam döngüsü birbirinden farklı timerlarımız oluyor.

           Bu arada cash sistemini yapmak amacıyla Sürükle-Bırak işlemlerini pictureboxlarımızla ve textbox için yapılandırıyoruz.

         private void pictureBox5_MouseDown(object sender, MouseEventArgs e)

         {



 

                if (e.Button == MouseButtons.Left)

               {

                      pictureBox5.DoDragDrop("10", DragDropEffects.All);

                      para += 10;

                }

}


 

         Yukarıdaki sarı,kırmızı,mavi ve yeşil para görünümde kutucuklar için bu işlemi yapıyoruz. Farklı olan değerimiz sadece para+=10 işaretindeki 10 sayısı olacaktır çünkü her paranın farklı değeri olacaktır.

          DragDrop işleminde textbox için ekleyeceğimiz kod ise aşağıdaki gibidir;

private void textBox2_DragDrop(object sender, DragEventArgs e)

{

          int t;

          textBox2.Text = e.Data.GetData(DataFormats.Text).ToString();

          t = (Convert.ToInt32(textBox1.Text) - Convert.ToInt32(textBox2.Text));

          if (t =< 0)

          {

                MessageBox.Show("Not Enough Coin");

          }

         else

              textBox1.Text=t.ToString();


 

}

         Kasamızda para kalmamışsa “Not Enough Coin” hatası alacağız. Textboxın dragover event’ine ise şu kodu ekleyelim;

private void textBox2_DragOver(object sender, DragEventArgs e)

{

        if (e.KeyState == 1)

       {

               e.Effect = DragDropEffects.Copy;

         }

}

         Randomize seçtiğimiz ilk 3 timer’ın tick event’ine ise aşağıdaki kodları ekleyelim;

private void timer1_Tick(object sender, EventArgs e)

{


 

          pictureBox1.Image = ımageList1.Images[tut[0]];

          tut[0]++;

          if (tut[0] == 3)

           tut[0] = 0;

}


 

private void timer2_Tick(object sender, EventArgs e)

{

           pictureBox2.Image = ımageList1.Images[tut[1]];

           tut[1]++;

            if (tut[1] == 3)

            tut[1] = 0;

}



 

private void timer3_Tick(object sender, EventArgs e)

{

         pictureBox3.Image = ımageList1.Images[tut[2]];

         tut[2]++;

        if (tut[2] == 3)

               tut[2] = 0;

}

               Ardından çekeceğimiz kolun yani picturebox’ın üstüne çift tıklayıp aşağıdaki kodu yazalım;

private void pictureBox4_Click(object sender, EventArgs e)

{


 

          if (para != 0 & textBox2.Text!="")

          {

                 baslangic();

                 pictureBox10.Visible = true;

                 pictureBox4.Visible = false;

                    timer1.Start();

                    timer2.Start();

                    timer3.Start();

                    timer4.Start();

         }

         else

         {

                MessageBox.Show("Please Take Coin.");

          }

}

              Dikkat ederseniz ilk 3 timer’ın tick event’leri için belirli bir kod yazmıştık fakat aynısını 4. ve en önemli olan timer4 ün click evet’i için yapmadık. Çok önemli bir event ve oyunu sağlayan en önemli eventlerden biri. Kod aşağıda;

private void timer4_Tick(object sender, EventArgs e)

{

         oyun++;

          if (oyun == 8)

          {

                  timer1.Stop();

                  timer2.Stop();

                  timer3.Stop();

                  timer4.Stop();

                 if (tut[0] == 0 & tut[1] == 0 & tut[2] == 0)

                 {

                              MessageBox.Show("You WIN");

                              int temp1 = Convert.ToInt32(textBox1.Text) + (para * 10);

                              textBox1.Text = temp1.ToString();

                  }

                 else

                 {

                         MessageBox.Show("You Loose");

                  }

                pictureBox4.Visible = true;

                 pictureBox10.Visible = false;

               oyun = 0;

               para = 0;

              if (Convert.ToInt32(textBox1.Text) <= 0)

              {

                           MessageBox.Show("game over");

                          Application.Exit();

               }

          }

}

            Bundan sonra kazanca ve kayba göre her kolu çektiğimizde oyunumuzu oynayabiliyoruz. Her birisi farklı hızda dönüp farklı zamanlarda duruyorlar. Timer kontrolümüzünde önemli bir kullanımı göstermiş olduk.

            Başlangıç kısmında anlatmış olduğum olasılık ile ilgili probleminde kullanım alanları vardır mesela bu mantığı aynısını bulma oyunu için uyarlayabilirsiniz.



Kural Dışı Durum Yönetimi

clock Ocak 20, 2007 07:34 author Volkan Atasever tarafından yayınlanmıştır

         Bu makalemde sizlere kural dışı durumlardan bahsedeceğim. Gerçekten kolaylıkla her projenizde ve uygulamanızda kullanabileceğiniz çok önemli bir kavram. İstisnai durumlarda olayları kontrol etmenize kontrol altına almamız açısından göz ardı edilmeyecek , edilemeyecek bir konu. Örneğin, Drag Drop işlemi yapıyorsunuz ve bir listbox’ınızdan diğer listbox’ınıza elemanlardan birini sürükleyip bırakacaksınız. Listbox’ımızın boş bir yerine tıkladığımızda orada bir hata oluşacaktır peki bunu nasıl yok edebiliriz ? (İlerleyen kısımlarda ve uygulamamızda bu istisnai duruma değindik) Cevap aslında çok basit işlemlerimize bir try ve catch anahtar kelimelerinden oluşan standart kullanımımızı eklediğimiz zaman bu istisnai ve olası tek hatayı kontrol altına almış bulunuyoruz. Try , catch dediğimiz zaman artık kural dışı durumlarımızın anahtar kelimelerine girmiş bulunuyoruz. Kural dışı durumlarda toplam 4 anahtar kelimemiz bulunuyor ve bunların incelikleriyle her istisnai durumu yakalayabiliyoruz.
Anahtar Kelimeler: Try, Catch, Finally, Throw .

      Try Catch kullanımın temel örneğini verecek olursak,
         
         try
                //Hata oluşan veya duruma göre oluşabilecek kod bloğu 
         }
        catch{
               //Hataların yakalandığı yer
        }

                try bloğundaki her türlü hatayı catch ifadesi kısmında yakalanacaktır. Burada her türlü hatayı yakalayabilmektedir fakat biz 2 hata çıkma olasılığı görüyoruz ve bu hata ihtimallerine göre farklı işlemler yaptırmak istersek tek catch ifadesi yetersiz kalacaktır. İki catch ifadesi kullanabilmeliyiz yine de iki ayrı durumu ele almalıyız işte burada devreye Exception sınıfı diye bir kavram giriyor ve bahsetmeden geçmek silahımızı kuşanmadan düello yapmaya benzemektedir. O zaman Exception sınıfımız ve standart türetilmiş exception’larımıza(kural dışı durum) değinelim.
C# taki her kural dışı durum Exception sınıfından türetilmektedir. Her kral dışı durum Exception sınıfının bir alt üyesidir. C# ta Exceptionlar iki kategoriye ayrılmıştır uygulama programı(ApplicationException) üzerinde oluşan istisnai durumlar ve sistem istisnai durumları(SystemException).
System uzay alanında (Namespace) tanımlı Derleyiciyle birlikte gelen Exception’ların bir kısmına göz atacak olursak:
DivideByZeroException: Sıfıra bölme hatasında oluşan exception
IndexOutOfRangeException: Dizinin sınırı dışına çıkılmıştır ( C’ deki deyimiyle dizi taşmıştır)
NullReferenceException: Null referans üzerinde işlem yapılmaktadır. Başka bir nesneyi göstermemektedir.
İsterseniz bu kullanımları bir Windows uygulaması üstünde inceleyelim ve böylece teoride kalmaz ve işlemlerimizi pratiğe dökeriz.
          Tasarımımız aşağıdaki gibi olsun:
 

 

Visual Studio.NET imizi açıp Windows application’ı seçtikten sonra Formumuza standart gelen namespace’lere şunları da ekleyelim:
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
Bu isim alanlarımız SqlException denememiz için gerekli. Sqlserver’a bağlanmayı deneyeceğiz.
Ardından sınıfımızın içine şu alanları ekleyelim:

            public partial class Form1 : Form
           {
                   int[] iAdizi = new int[10];
                   int iTut = 0;
                   public Form1()
                   {
                         InitializeComponent();
                    }
            }
         Bu iki alan Dizi Taşması örneğimiz için eklenmiştir.
         DivideByZero denemesi isimli groupbox’ımızdaki butona çift tıklayalım ve şu kodları yazalım sırasıyla studio.NET le standart gelen isimleri kullandık.

Kodlarımız:

            int iSayi1,iSayi2;
            try 
            {
                         iSayi1 = Convert.ToInt32(textBox1.Text);
                         iSayi2 = Convert.ToInt32(textBox2.Text); 
                         iSayi1 /= iSayi2;
                          MessageBox.Show("Herhangi Bir Hata Meydana Gelmedi ve Buraya Kadar Geldi Sonuç= " + iSayi1); 
             } 
            catch (DivideByZeroException)
           {
                         MessageBox.Show("Sıfıra bölme hatası Catch'e Düştü");
            }
           catch
           {
                         MessageBox.Show("İkinci catch: herhangi bir hata meydana geldi");
            }

                 Bu deneme amaçlı ve istediğiniz herşeyi deneyebilirsiniz bölüme sıfır girdiğinizde DivideByZeroException’a düşecektir. Diğer hata durumlarında ikinci catch’e yakalanacaktır. Tabiki de burada ardıardına iki catch kullandığımızı unutmamalıyız ikinci catch bütün hataları yakalamaktadır eüer ilk catch’den önce ikincisini yazsaydık yani DivideByZeroException lı catch’imizi ikinci catch olarak ele alsaydık oraya asla düşmezdi çünkü her hatayı yakalayan catch { } ifademiz hatayı yakalayıp çıkacaktı. Fakat DivideByZeroException kontrolümüz gerçekleşemeyecekti.
Dizi Taşması örneği adlı groupbox’ımızdaki butona tıklayıp şu kodları yazalım:

            try
           {
                           iAdizi[iTut] = Convert.ToInt32(textBox3.Text); 
                           iTut++;
                           listBox1.Items.Add("" + iTut + " indise " + iAdizi[iTut-1] + " Eklendi"); 
            }
           catch (IndexOutOfRangeException)
           {
                           MessageBox.Show("Dizinin indeksini aştın 10 elemandan fazla Girdin ve catch'e yakalandım aslıdna istediğimizde buydu");
                           listBox1.Items.Add("Hata"); 
           } 
           catch
         {
                          MessageBox.Show("Diğer hata meydana geldi Sadece Sayı girmeliydin bu gerçekten beklenmedik bir hata");
                          listBox1.Items.Add("Diğer bir Hata");
         }

          Gördüğünüz gibi dizimizin sınırları dışına çıkarsak IndexOutOfRangeException tarafından bu hata yakalanmaktadır. Burada her tıkladığımızda ilk indisten başlayarak dizimize bizim girdiğimiz rakamları yerleştirmektedir. Dizimizi ve iTut alanımızı sınıfımızın başında tanımlamıştık. Diğer hatalar mesela textboxın boş bırakılması veya karakter girilmesi durumunda ikinci genel catchimiz tarafından yakalanacaktır.

Üçüncü olarak throw groupboxımızın butonuna çift tıklayıp şu kodlarıda yazalım (Fırlat butonu) :
    try
    {
        kuraldisi();
    }
    catch
    {
        MessageBox.Show("İkinci Kez Yakalandı");
    }
            Örneğimizi ve throw’u anlamak için de kuraldisi adında bir metot yazmamız gerekli.
kuraldisi() metodumuz:
    private void kuraldisi()
    {
        try
        {
                MessageBox.Show("Kural Dışı Durum Fırlatılıyor");
               throw new IndexOutOfRangeException();
       }
        catch
        {
               MessageBox.Show("İstisnai Durum Yakalandı");
               throw;
        }
    }
          Fırlat butonumuza tıkladığımızda try bloğumuzuun içindeki kuraldisi(); metodumuz çalıaşcaktır ardından kuraldisi metodumuzda yeni bir exception new lenmekte yani oluşturulmaktadır. Ardından catch ifademize düşmekte ve oluşturduğumuz IndexOutOfRangeException istisnai durumumuz tekrar fırlatılmaktadır ve metodumuzun işleyişi bittiği için butonumuzun Click event’ında kod işleyişi yoluna devam etmektedir. Tekrar “throw;” anahtar kelimesi ile fırlattığımız istisnai durum bu sefer ikinci kez catch’e yakalanacaktır.

          Checked Uncheck denemesi adlı dene adlı butonuzumuzun click event’inede şunları yazalım:
int iCSayi1=2000000000,iCSayi2=2000000000;
int iSonuc;
if (radioButton1.Checked == true)
{
    try
    {
        checked
        {
        iSonuc = checked((int)(iCSayi1 * iCSayi2));
        }
    }
    catch (OverflowException)
    {
        MessageBox.Show("OverflowException meydana geldi");
    }
}
else
{
    try
    {
        unchecked
        {
        iSonuc = unchecked((int)(iCSayi1 * iCSayi2));
       MessageBox.Show("OverflowException a Düşmedi");
    }
    }
    catch (OverflowException)
    {
    MessageBox.Show("Buraya Düşmeyecek");
    }
}
            Bu örneğimizde eğer radiobutton1’i seçtiğimiz zaman check özelliği eklenerek çalışılmış, radiobuton2 yi seçersek ise uncheckd özelliği ile çalışılmış. Nedir bu checked ve unchecked ? Açıklayacak olursak her dilde her değişkenin belli bir sayı tutma kapasitesi var atıyorum C dilinde integer(tam sayılar) veri tipimiz 2 byte yer kaplıyor ve 32000 i geçemiyor diyelim eğer ikinci değilkenimiz de 32000 olur ve çarpma işlemine tabi tutulursa hesap makinelerinde gördüğüüz kapasite farklılıklarında çık 32323e+2 gibi yazılar yani overflow meydana gelir bunlar artimetik işlemlerde meydana gelme olasılığı olan durumlardır ve bir çok hataya sebebiyet verir. İşte checked özelliği bu kontrolü sağlamamızı unchecked ise gözardı etmemizi sağlar. Checked ve uncheck anahtar kelimelirimiz bu gibi durumlarda büyük bir kurtarıcı rolü oyanamaktadır. Genel kullanımını taslak olarak yazacak olursak:
          try{
                    checked{
                          //Meydana gelecek overflow lara sahip aritmetik işlem
                     } 
          }
         catch(OverflowException)
         {
                      //Overflow durumunda vereceğimiz mesaj 
          }
             Not: Aritmerik işlemimizin önüne yukarıda gördüğünüz gibi checkd veya unchecked ardından da veri tipini yazmamız gereklidir.
                SqlException istisnai durumunu ve database işlemlerinde meydana gelebilecek durumlar içinde SqlException istisnai durumunu kullanabiliriz. Butonumuzun click evventına yine şunları yazalım ( Bu cümleyi çok kullandığımın farkındayım ama hep click eventına yazmak zorundayız ne yapalım )

Kod:
        string con = "Data Source=(local);Initial Catalog=benneredeyim;Integrated Security=True"
        SqlCommand InsertCurrencyCommand = new SqlCommand();
        SqlConnection conn = new SqlConnection(con);
        InsertCurrencyCommand.CommandText =
        "INSERT tablom(deger)" +
        " VALUES('selamlar')";

       InsertCurrencyCommand.Connection = conn;
       try
      {
                  conn.Open();
                  InsertCurrencyCommand.ExecuteNonQuery();
                  MessageBox.Show("Hata Olmadı Burayı Görmen biraz Zor :)");
       } 
       catch (SqlException hata)
      {
                  MessageBox.Show(hata.Message.ToString());
                  MessageBox.Show(" >Hata< !");
      }
       finally
      {
                   conn.Close();

       }

                 Diğer database connectionları SqlCommand üzerinde fazla durmayacağım burada şunu bilmeniz yeterli, büyük ihtimalle sizin Sql Server’ınızda benneredeyim isimli bir database olmadığı ve bir ihtimal olsa bile, içinde tablom isimli ve deger adlı kolona sahip bir tablo olamdığı için hata meydana gelecektir. Buradaki her türlü hatayı SqlException ile yakalayabiliriz. Mesaj kutumuzun içinde hata.Message.ToString() yapmamızın nedeni ise gelen hatayı MessageBox içinde yazdırmak içindir en azından karşınıza Continu veya Quit gibi programın büyük bir hataya sebebiyet verdiği gibi kaba bir kutucuk yerine güzel bir messagebox ile bu işi çözümleyebiliriz. Finally anahtar kelimesindende söz etmek gerekirse hata çıksada çıkmasada o kod bloğu işleyecektir sanırım kolay ama etkileyici bir özelliğe sahip.
                  Uygulamamızdaki son örneğimiz ise sürükle bırak işlemleri ile ilgili iki listbox arasında veya bir listbox’dan herhangi bir yere sürükle bırak yaparken başıma gelen ve beni çıldırtan listbox’ın boş bir yerine tıkladığımızda meydana gelen bir hata bunuda kolayca try-catch bloğuyla bertaraf edebiliriz.

Sürükle bırak örneğimiz için hazırlanmış olan kodlarımız:
         private void listBox2_MouseDown(object sender, MouseEventArgs e)
        {
                   try 
                   {
                            Point pTut = new Point(e.X, e.Y);
                             int iIndeksNo = listBox2.IndexFromPoint(pTut);
                              if (e.Button == MouseButtons.Left)
                              {
                                  listBox2.DoDragDrop(listBox2.Items[iIndeksNo].ToString(), DragDropEffects.All);
                               }
                    }
                   catch
                  {  
                           MessageBox.Show("Lütfen Boş Bir Yere Tıklamayınız"); 
                  }
       } 

       private void listBox3_DragOver(object sender, DragEventArgs e)
      {
                     if (e.KeyState == 1)
                    {
                                     e.Effect = DragDropEffects.Copy;
                     }
      }

      private void listBox3_DragDrop(object sender, DragEventArgs e)
     {
                   listBox3.Items.Add(e.Data.GetData(DataFormats.Text).ToString());
      }

          Yukarıdada belirtilen her event a altında yazan kodlarımızı yazalım ve örneğimizi tamamlayalım. Sürükleme işlemi mouse’un sol tuşuna basmamızla gerçekleşecektir. Boş bir yere tıkladığımızda ise artık messagebox’ımızla belirttiğimiz uyarıyı kendimiz verebileceğiz isterseniz orayı boş bırakıp hiç bir şey olmamış gibi yolunuza devam edebilirsiniz.
Böylece makalemizde kural dışı durumları ve onları yönetmeyi irdelemiş olduk. Eğer makale hakkında soru, görüş veya önerileriniz olursa inhoftec@gmail.com adresine mail atabilirsiniz elimden geldiğince cevaplamaya çalışacağım. Programın çalışan versiyonunu ise örnek kodlar kısmından  indirebilirsiniz.
Yazan: Volkan Atasever


Volkan Atasever Kimdir ?

E-Mail: volkan@volkanatasever.com

Founder of inhoftec Solutions
Bilgisayar Mühendisi
Yazılım Uzmanı&Danışmanı
PCWorld Dergisi Yazarı
DeveloperMania.Net Topluluk Lideri
Technology Speaker
Teknoloji Uzmanı&Danışmanı





Kitapları

Sosyal Ağlarım

    

 

Twitter

Calendar

<<  Mayıs 2012  >>
PaSaÇaPeCuCuPa
30123456
78910111213
14151617181920
21222324252627
28293031123
45678910

View posts in large calendar

Son Yorumlar

Comment RSS

Son Yazılar

Yasal Bilgi

Sitedeki yazıları,kodlar ve diğer materyaller Volkan Atasever'e aittir. Yazarı ve siteyi kaynak göstererek yazıları paylaşabilirsiniz.  Copyright(c)2008-2011

Giriş

Yazılım