Bir önceki makalemizde ref anahtar sözcüğünün detaylarından bahsetmiştim. out ile parametre göndermek, referans göndermek ile aynıdır.ref anahtar sözcüğünden tek farkı,  parametreye metot içerisinde bir değer atanması zorunluluğudur. Amaç, alınan parametrenin metot içerisinde değer kazandırılarak dışarıya gönderilmesidir.

Basit bir örnek ile incelemeye çalışalım. out parametre alan bir metot alarak, aldığı parametreyi ekrana yazdıran bir metot yazalım.

class Program

    {

        static void Main(string[] args)

        {

            int sayi = 99;

            Test(out sayi);

        }

 

        static void Test(out int sayi)

        {

            Console.WriteLine(sayi);

        }

    }

Test metodu aldığı out parametreyi içeride değer atamadan kullanmaya çalıştığından dolayı aşağıdaki gibi bir hata mesajı ile karşılaşacağız.

Error    1  :  The out parameter 'sayi' must be assigned to before control leaves the current method  

Error    2  :  Use of unassigned out parameter 'sayi' 

Giriştede bahsettiğim gibi, parametreye metot içerisinde değer atamadan kullanmamıza izin verilmemektedir. Zaten out parametrenin farkı da budur. Amaç metot içerisinde değer kazandırılarak, bu değeri dışarıya göndermektir.

Kodumuzu aşağıdaki gibi değiştirerek programı çalıştıralım.

class Program

    {

        static void Main(string[] args)

        {

            int sayi;

            Test(out sayi);

        }

 

        static void Test(out int sayi)

        {

     sayi=99;

            Console.WriteLine(sayi);

        }

    }

Main metodu içerisinde tanımlanan ve herhangi bir değer atanmayan “sayi” adlı değişken, Test metodu içerisinde 99 değerine sahip olmuştur.

image

Şimdi de DiziAnaliz adında bir metot yazalım. Metot parametre olarak bir integer dizisi alsın. Bunun yanında toplam,ortalama,enBuyuk ve enKucuk adında 4 adet out parametre alsın ve içeride bu değişkenlere uygun değerleri atayarak dışarı göndersin.

class Program

    {

        static void Main(string[] args)

        {

            int[] sayilar = { 22, 63, 44, 13, 25, 60, 87, 68, 79 };

           

            int enBuyuk, enKucuk, toplam;

            double ortalama;

           

            DiziAnaliz(sayilar, out toplam, out ortalama, out enBuyuk, out enKucuk);

           

            Console.WriteLine("Eleman sayısı : {0}\nToplam : {1}\nOrtalama : {2}\nEn büyük sayı : {3}\nEn küçük sayı : {4}", sayilar.Length, toplam, ortalama, enBuyuk, enKucuk);

        }

 

        static void DiziAnaliz(int[] dizi, out int toplam, out double ortalama, out int enBuyuk, out int enKucuk)

        {

            enBuyuk = dizi[0];

            enKucuk = dizi[0];

            toplam = 0;

 

            foreach (int sayi in dizi)

            {

                toplam += sayi;

 

                if (sayi > enBuyuk)

                {

                    enBuyuk = sayi;

                }

 

                if (sayi < enKucuk)

                {

                    enKucuk = sayi;

                }

            }

 

            ortalama = (double)toplam / dizi.Length; //sonucu double olarak alabilmek için cast işlemi yaptık. iki integer'ı birbirine böldüğümüzde sonuç küsüratlı çıkarsa, integer'a cast edilerek küsüratı atılır.

        }

    }

Ekran çıktısı aşağıdaki gibi olacaktır.

image



0 yorum:

Yorum Gönder