Memik Yanık - Kişisel Web Sitesi Ana Sayfa | Hakkımda | Kitap Önerileri | Fotoğraflarım | RSS RSS | İletişim

Zirveye Çıkaran Programcılık Teknikleri : 4


Out Bildirili Değişkenler - Zirveye Çıkmak İsteyenler İçin

Bu makalede her C# programcısının çok faydasını gördüğü out bildirisinden söz edeceğim. Daha önce sözü edilen tekniklerde işaret edildiği gibi C#’taki procedure’ler fonksiyonlardan daha gelişmiş bir yapıya sahip olduğu için out bildirisini fonksiyonlar yerine Procedureler üzerinde anlatmayı tercih ettim.

En başta belirtelim ki out bildirili parametreler yani out bildirisi ile deklare edilen değişkenlerin soluna “=” yazılamaz. Bazen insana komut gibi görünün bu bildiri hakkında bilgi vermek için aşağıdaki gibi güzel bir kodlama yaptım. Aşağıda verdiğim kodda şartları zorlayıp out bildirisiyle tanımladığım değişkenin soluna eşittir yazdım. 

namespace
uzayli_zekiye
{
    class hakiki_sinif
    {
        public voidbenzersiz_metot(out stringstr)
        {
            stringilimiz;
            ilimiz = str; // Hata meydana gelir, çünkü solunda ‘=’ var.

            str = "ADANA";
        }
    }
}

Bu kodu yazıp işletmek istediğinizde hata meydana gelir. Çünkü Out bildirisiyle tanımlanıp deklare edilen değişkenlerin soluna “=”, eşittirin sağına ise out bildirili değişken yazılamaz. Bu kodda “=” operatörünün sağına burada “str” adını verdiğim out bildirili yani out olmuş değişkenin adını yazdığım için hata meydana gelmektedir. Başka bir anlatımla out bildirisiyle tanımlanan değişkenlerin değeri başka bir değişkene aktarılamaz.

 

Out Bildirili Değişkenler – Çukura İnmek İsteyenler İçin

Yukarıda out anahtar kelimesiyle ilgili olarak zirveye çıkmak isteyenler yazılanları okudunuz. Bakalım yukarıda yazılanları okuduktan sonra yanlış bildiğinizde ısrar mı edeceksiniz yoksa Visual Studio’yu açıp zirveye çıkmak için yazılanları üç beş dakikada test edip gerçeği görmeyi deneyecek misiniz? İlk olarak yukarıda zirveye çıkmak için yazılan koddaki out bildirisini silip değişen bir şeyin olup olmadığını görmekle Out anahtar kelimesiyle ilgili gerçekleri görmeye başlayabilirsiniz.

 

namespaceuzayli_zekiye

{

   class hakiki_sinif

    {

        public voidbenzersiz_metot(stringstr)

        {

            stringilimiz;

            ilimiz = str; // Yine hata meydana gelir

            str = "ADANA";

        }

    }

}

Tabi out anahtar kelimesinin işlevini tam olarak anlamak için reference tipler nedir, Value tipler nedir sorularına verilecek cevabınızın olması gerek. Sizleri çukura çekmeye kararlı olduğum için işe aşağıdaki gibi basit bir sınıf hazırlayacak başladım.

class
in_out

  {

      public static voidmetot_bir(intx)

        {

            x = 200;

            return;

        }

  }

Dikkat ederseniz bu Class’in metot_bir adını verdiğim bir metodu bulunmakta ve kendisine parametre olarak verilen değişkenin içeriğini değiştirmektedir. Bu sınıfı ve metodunu test etmek için üzerinde çalıştığım projenin formuna bir düğme ve ListBox yerleştirip düğmenin Click olayını temsil eden metodunu aşağıdaki gibi düzenledim.

private
voidbutton1_Click(objectsender, EventArgse)

  {

     intrakam = 100;

     listBox1.Items.Add(rakam);

     in_out.metot_bir(rakam);

     listBox1.Items.Add(rakam);

  }

 

Bu kod işletildiğinde tahmininizde yanılmazsınız ve ListBox’a 2 kez 100 yazılır. Çünkü “rakam” adını verdiğim değişkenin içeriğini (yani referansını değil) metoda parametre olarak verdim. 



“rakam” adlı değişkenin içeriği yerine referansını metoda göndermiş olsaydım durum farklı olurdu. Metotlara değişkenlerin içerikleri yerine referansları yani adreslerini parametre olarak göndermek istiyorsanız ref anahtar kelimesinden yararlanmanız gerekir. Ref anahtar kelimesinin nasıl kullanıldığını aşağıda görebilirsiniz.

 

public partial class Form1: Form

  {

     publicForm1()

      {

         InitializeComponent();

      }

     private void button1_Click(objectsender, EventArgse)

      {

         intrakam = 100;

         listBox1.Items.Add(rakam);

         in_out.metot_bir(refrakam);

         listBox1.Items.Add(rakam);

      }

    }

 

class in_out

  {

     public static void metot_bir(intx)

      {

        x = 200;

        return;

     }

 }

 

Metot_bir adını verdiğim metodu işletirken parametrenin önüne ref anahtar kelimesini yazdığım için hata meydana gelir. Çünkü metodun yapısında metoda parametre aracılığıyla bilgiler değer gönderilmek üzere hazırlık yapılmış. Bu nedenle metodun yapısında aşağıdakş gibi değişiklik yaptım.

 

class in_out

  {

     public static void metot_bir(ref intx)

        {

           x = 200;

           return;

        }

   }

Bu hazırlıktan sonra formdaki düğme tıklanıp button1_Click() metodu işletilirse bu kez ListBox’a önce 100 sonra 200 yazılır. Çünkü “rakam” değişkeni metoda referans olarak gönderildi ve “metot_bir” adını vermiş olduğum metotta bu bellek adresinin içeriği değiştirildi.




refanahtar kelimesi sayesinde metotlara parametre ile değer yerine referansı gönderilir. Referans derken “rakam” değişkenin bellekteki adresinden söz etmekteyim. Bu uygulamada int tipindeki “rakam” değişkenine ilk değer vermeden aşağıdaki gibi metodu işletmiş olsaydım hata meydana gelirdi.

 

private void button1_Click(objectsender, EventArgse)

  {

     int rakam;

     in_out.metot_bir(refrakam); // Hata meydana gelir.

     listBox1.Items.Add(rakam);

   }

 

Bu metodu düz mantıkla incelediğinizde hata meydana gelmemesi gerekir diye düşünebi­lirsi­niz. Çünkü referans olarak gönderilen değişkene metotta zaten bilgi aktarılı­yor ve bilgi akta­rıldıktan sonra bu bellek adresinin içeriği ListBox’a aktarılmaya çalışılıyor. Buna rağmen bu kod çalıştırıldığında hata meydana gelir. Çünkü değişkenlere ilk değer aktarılmadan kendilerine tahsis edilen bir adresleri olmuyor. Bu tip hataların önüne geçmek için ref yerine out anahtar kelimesini kullanabilirsiniz. Out anahtar kelimesinin nasıl kullanıldığını aşağıda görebilirsiniz.

 

namespace WindowsFormsApplication1

{

    public partial class Form1: Form

    {

        public Form1()

        {

            InitializeComponent();

        }

        private void button1_Click(objectsender, EventArgse)

        {

            int rakam;

            in_out.metot_bir(outrakam);

            listBox1.Items.Add(rakam);

        }

    }

   class in_out

    {

        public static void metot_bir(out intx)

        {

            x = 200;

            return;

        }

    }

 }

 

Şimdi gelelim Zirveye Çıkmak isteyenler için yazılan metindeki ender rastlanılan hatadan söz etmeye. Aşağıda verilen kodu tek gözüyle bile inceleyenlerin hatanın nedeninin out bildirisi olmayıp str adlı değişkene ilk değer aktarılmadan içeriğinin okunmak istenmesidir.

 

namespace uzayli_zekiye

{

    class hakiki_sinif

    {

        public voidbenzersiz_metot(out stringstr)

        {

            str = "ADANA";

            stringilimiz;

            ilimiz = str; // Hata meydana gelmez

        }

    }

}

Dolayısıyla zirveye çıkmak isteyenler için hazırlanan metindeki “out bildirisi ile deklare edilen değişkenlerin soluna “=” yazılmaz” cümlesi şeytanın katkısıyla yanlışlıkla kullanılmıştır.

C#.NET 26.05.2009 00:25:12

YORUM YOK


YorumlarYorum Yaz
Ana Sayfa | Hakkımda | Kitap Önerileri | Fotoğraflarım | RSS | İletişim
Memik Yanık 2004-2009 © Tüm Hakları Saklıdır.
Hazırlayan www.semgoksu.com