Derinlemesine yazılım eğitimleri için kanalımı takip edebilirsiniz...

C# 7.0 – Local Functions

Merhaba,

Biliyorsunuz ki, son zamanlarda SQL Server 2016’nın yeniliklerine dalmış durumdayım. Bu durum, göz bebeğimiz C#’ın yeniliklerini göz ardı ettiğimiz anlamına gelmemektedir. Piyasaya C# 7.0 sürümünde sunulan yeniliklerin pişip kavrulması için biraz beklemeyi, zaman içinde neyin kalıcı neyin gidici olacağını görebilmek için sabredip biraz geç olsada doğru şekilde yeniliklere değinmeyi tercih ettim. Bu içeriğimizde C# 7.0 ile gelen Local Functions yapısına değineceğiz.

C# dışında bazı diller, metod içerisinde metod oluşturmaya izin verirken C#’ta 7.0 versiyonuna kadar izin verilmemekte, biz de bu ihtiyacı Anonymous Methodst, Delegate yahut Expression yapılarıyla gidermekteydik.

7.0 versiyonu ile gelen Local Functions özelliği sayesinde metod içerisinde metod oluşturabilmekte ve daha temiz ve kullanışlı bir inşa süreci geçirebilmekteyiz.

Neden Metod İçerisinde Metod?

Evet… İlgili yeniliğin nasıl tatbik edildiğinden çok bu sorunun cevabı daha çok önem arz etmektedir. Biz yazılımcılar; uzun, maliyetli ve bakımı zor olan senaryolarda çalıştığımız metodun içerisinde tüm inşayı gerçekleştirmeyiz. Fonksiyonellik arz eden bölümleri farklı metodlara ayırır daha sonra bu metodları ilgili metod içerisinde çağırarak parçalardan oluşan ve yönetilebilir bir bütün elde ederiz.

Bu dışarıya taşıdığımız ufak metodlara helper(yardımcı) metod diyelim. Şöyle bir düşünürsek eğer, bu helper metodlar classta tanımlandıkları halde tek bir metot tarafından kullanılırlar. Buna rağmen classın üyesi oldukları için class içerisinde veyahut nesne üzerinde bu metodların yanlışlıkla çağrılma ihtimali, yahut çalışırkende IntelliSense’de lüzumsuz yer işgal etmesi çokta göz ardı edilebilir olası bir hata değildir. “ya hocam, metodu o halde public değil private yaparız” diye düşünebilirsiniz. private olarak tanımlasak bile class içerisinde çalışırken bu metodu yanlışlıkla kullanabilir, class içerisinde IntelliSense’de bu metod yer işgal edebilir.

İşte bu tür olası durumların aşılabilmesi için Local Functions’lara ihtiyaç vardır.

Şimdi biraz önce bahsettiğim durumu örneklendirelim.

    class Banka
    {
        public void ParaSay(string Kisi, int Adet, double Deger)
        {
            Console.WriteLine($"{Kisi} kişinin parası sayılmaya başlıyor.");
            Console.WriteLine($"{Kisi} kişisinin toplam parası {Say(Adet, Deger)}");
        }

        double Say(int Adet, double Deger)
        {
            double ToplamPara = 0;
            for (int i = 0; i < Adet; i++)
                ToplamPara += Deger;

            return ToplamPara;
        }
    }

Gördüğünüz gibi “Banka” sınıfı içerisinde “ParaSay” metodu içerisinde “Say” metodu çağrılarak verilen parametrik değerlere göre belirli işlemler gerçekleştirilmektedir.(evet, Adet * Deger şeklinde de bir işlem yapabilirdik ama takılmayın oraya, maksat iki satır kod gözüksün…) Doğal olarak “Say” metodu “ParaSay” metodu dışında kullanılmayacaktır.

    class Banka
    {
        public void ParaSay(string Kisi, int Adet, double Deger)
        {
            Console.WriteLine($"{Kisi} kişinin parası sayılmaya başlıyor.");
            Console.WriteLine($"{Kisi} kişisinin toplam parası {Say(Adet, Deger)}");
        }

        double Say(int Adet, double Deger)
        {
            double ToplamPara = 0;
            for (int i = 0; i < Adet; i++)
                ToplamPara += Deger;

            return ToplamPara;
        }

        public string MusteriyeSelamSoyle()
        {
            return "Anlık faizlerimizle hep arkanızdayız..."
        }
    }

“Banka” sınıfı içerisinde “MusteriyeSelamSoyle” isminde bir metod oluşturduk. Şimdi bu metod içerisinde çalışırken aşağıdaki gibi IntelliSense’de “Say” metodunun gözükmesi ne kadar doğrudur?
C# 7.0 - Local Functions
Peki gözükmesi bir yana, hadi o anda bir dalgınlığıma gelip yanlışlıkla aşağıdaki gibi alakasız metodu alakasız bir başka metod içerisinde çağırmış olsam…

    class Banka
    {
        public void ParaSay(string Kisi, int Adet, double Deger)
        {
            Console.WriteLine($"{Kisi} kişinin parası sayılmaya başlıyor.");
            Console.WriteLine($"{Kisi} kişisinin toplam parası {Say(Adet, Deger)}");
        }

        double Say(int Adet, double Deger)
        {
            double ToplamPara = 0;
            for (int i = 0; i < Adet; i++)
                ToplamPara += Deger;

            return ToplamPara;
        }

        public string MusteriyeSelamSoyle()
        {
            Say(100, 23);
            return "Anlık faizlerimizle hep arkanızdayız...";
        }
    }

Evet… Görüldüğü gibi bu tarz alakasız işlemleri, kod karmaşasına sebep olabilecek her türlü ihtimali ortadan Local Functions ile aşağıdaki gibi kaldırabilmekteyiz.

    class Banka
    {
        public void ParaSay(string Kisi, int Adet, double Deger)
        {
            double Say(int adet, double deger)
            {
                double ToplamPara = 0;
                for (int i = 0; i < Adet; i++)
                    ToplamPara += Deger;

                return ToplamPara;
            }

            Console.WriteLine($"{Kisi} kişinin parası sayılmaya başlıyor.");
            Console.WriteLine($"{Kisi} kişisinin toplam parası {Say(Adet, Deger)}");
        }
    }

“Say” metodu sade ve sadece “ParaSay” metodu içerisinde kullanılacağından dolayı yukarıdaki gibi metod içerisinde tanımlanmaktadır. “Say” metoduna erişebileceğimiz noktalara aşağıda göz atalım.

C# 7.0 - Local Functions

“ParaSay” scopeları içerisinde “Say” metoduna erişebilmekteyiz.

C# 7.0 - Local Functions

Doğal olarak “MusteriyeSelamSoyle” metodu içerisinde erişememekteyiz.

Expression Bodied Local Functions


Eğer ki local olarak tanımlayacağınız metod tek satırlık işlem barındırıyorsa Expression Bodied Functions olarakta tanımlanabilir.

    class Banka
    {
        public void ParaSay(string Kisi, int Adet, double Deger)
        {
            double Say(int adet, double deger) => Adet * Deger;

            Console.WriteLine($"{Kisi} kişinin parası sayılmaya başlıyor.");
            Console.WriteLine($"{Kisi} kişisinin toplam parası {Say(Adet, Deger)}");
        }
    }

Evet… Bir yazımızın daha sonuna gelmiş bulunmaktayız.
Bol bol faydalanmanız dileğiyle…

Sonraki yazılarımda görüşmek üzere…
İyi çalışmalar…

Bunlar da hoşunuza gidebilir...

5 Cevaplar

  1. Adil dedi ki:

    Təşəkkürlər

  2. okan dedi ki:

    Teşekkürler

  1. 21 Mart 2018

    […] varyasyonlarıyla bu yapıyı geliştirmektedir. Hatırlarsanız eğer geçtiğimiz yıllarda C# 7.0 – Local Functions başlıklı makalede ele aldığımız gibi C# 7.0 versiyonu metot yapılarına odaklı bir yenilik […]

  2. 17 Haziran 2019

    […] 7.0 ile hayatımıza giren Local Function yapıları ile metot içerisinde metot tanımlayabiliyorduk. Bunun üzerine C# 8.0 ile de Local […]

  3. 19 Temmuz 2021

    […] Local function olmamalıdır. […]

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.