Clear        


                
                    namespace _23_ValueAndReferenceTypes.ReferenceTypes
{
    /// <summary>
    /// Değer tiplerin referanslarının methodlarda kullanımı
    /// </summary>
    public class ReferenceTypesDemo4
    {
        public void Calistir()
        {
            int sayi1 = 10;
            int sayi2 = 5;

            int carpim = 0; // ref kullanarak değişkeni methoda parametre olarak göndereceğimizden ilk değer ataması yapmalıyız

            int toplam = ToplaVeCarp(sayi1, sayi2, ref carpim); // carpim referansı method içerisinde çarpım sonucu olarak güncellenecek
                                                                // ve biz de bu sonucu aşağıda yazdırabileceğiz,
                                                                // dolayısıyla method hem toplama hem de çarpma sonuçlarını döndürmektedir

            Console.WriteLine($"{sayi1} + {sayi2} = {toplam}, {sayi1} * {sayi2} = {carpim}");
            // konsola "10 + 5 = 15, 10 * 5 = 50" yazdırır

            int bolum; // out kullanarak değişkeni methoda parametre olarak göndereceğiz, ilk değer ataması yapmamıza gerek yoktur

            int fark = CikarVeBol(sayi1, sayi2, out bolum); // bolum referansı method içerisinde bölüm sonucu olarak güncellenecek
                                                            // ve biz de bu sonucu aşağıda yazdırabileceğiz,
                                                            // dolayısıyla method hem çıkarma hem de bölme sonuçlarını döndürmektedir

            Console.WriteLine($"{sayi1} - {sayi2} = {fark}, {sayi1} / {sayi2} = {bolum}");
            // konsola "10 - 5 = 5, 10 / 5 = 2" yazdırır
        }



        int ToplaVeCarp(int sayi1, int sayi2, ref int carpim)
        {
            carpim = sayi1 * sayi2; // ref ile carpim parametresinin değerini değil adresini kullan dediğimizden
                                    // çarpma işlemi sonucu carpim'in refere ettiği adrese atanır
                                    // ve sonuç hem bu method içerisinde geçerlidir, hem de method dışına yansır,
                                    // ref kullanımı için method çağrılmadan önce aynı tipte değişken tanımlanıp
                                    // ilk değer ataması yapılmalıdır ve method çağrılırken değişken başında
                                    // ref yazılarak parametre olarak gönderilmelidir

            return sayi1 + sayi2; // toplam sonucunu da methoddan dönüyoruz
        }

        int CikarVeBol(int sayi1, int sayi2, out int bolum)
        {
            bolum = sayi1 / sayi2; // out ile bolum parametresinin değerini değil adresini kullan dediğimizden
                                   // bölme işlemi sonucu bolum'un refere ettiği adrese atanır
                                   // ve sonuç hem bu method içerisinde geçerlidir, hem de method dışına yansır,
                                   // out kullanımı için method çağrılmadan önce aynı tipte değişken tanımlanması
                                   // yeterlidir, ilk değer ataması yapılmasına gerek yoktur ve method çağrılırken
                                   // değişken başında out yazılarak parametre olarak gönderilmelidir

            return sayi1 - sayi2; // çıkarma sonucunu da methoddan dönüyoruz
        }
    }
}