C# 7 Lokal Fonksiyonlar / Local Functions
Lokal fonksiyonları, herhangi bir metod, bir sınıfın yapıcısı(constructor) olarak veya bir property içinde tanımlayabiliriz. C# derleyicisi tarafından derlendiğinde ise private bir metod haline dönüştürülür.
Lokal fonksiyonları incelerken bir makalede benim gibi eskiyseniz “GOSUB” ifadesini bilirsiniz yazıyordu.O an bende açıkçası eskidiğimi anladım. Benim gibi Pascal’dan geliyorsanız “GOSUB” sizin için “GOTO” terimidir. Bu komutlar belirtilen işlemleri yapmanıza ve daha sonra o noktaya dönmenize izin verirdi. Mecbur kalınmadıkça da pekte kullanılması önerilmezdi. Tabii ki Lokal Fonksiyonlar bu değil. Çalışma mekanikleri ve mimarisel yapısı farklı olmakla birlikte benzer bir alan.
Lokal fonksiyonları, herhangi bir metod, bir sınıfın yapıcısı(constructor) olarak veya bir property içinde tanımlayabiliriz. C# derleyicisi tarafından derlendiğinde ise private bir metod haline dönüşmektedir. Pascaldan bahis edince bende bir Pascal uygulaması koymak istedim.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
program denemeGoto; label atla; var a : integer; begin a := 0; atla: repeat if( a = 5) then begin a := a + 1; goto atla; end; writeln('a'nın değeri : ', a); a:= a +1; until a = 20; end. |
Açıkçası uygulama geliştirilirken tekrar kullanılmayan yöntemler oluşturmamız gerekebiliyor. Bu yöntemlerde ileride bir kabus gibi üzerinize çökebiliyor. Bundan dolayıda yöntemlerin uzun süre kullanılmasını istemeyebiliyoruz. Bununla birlikte, yeniden kullanılmayacak pek çok özel yöntemde kullanıyoruz. İşte bu noktada Lokal Fonksiyonların en güzel avantajlarından biri sadece o işe özel bir metodu yaratmanız ve orada kullanılmasıdır. Ardınızdan gelecek olan programcıların farklı yerlerde bu metodu kullanmasının da önünü kesmiş olacaksınızdır. Tabii ki kendi önünüzü de kesmiş olursunuz. Hadi birazda kod yazalım.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
class Customer { public string Name { get; set; } public int Balance { get; set; } public bool Vip { get { return CustomerPriority(); bool CustomerPriority() { return Balance > 1000 ? true : false; } } } public override string ToString() { return String.Format("{0} {1} öncelikli bir müşteridir. ", Name, CustomerPriority(Balance)); // local function: string CustomerPriority(int balance) { return balance > 1000 ? "H" : "L"; } } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
class Program { static void Main(string[] args) { // Local Function 1 DisplayCustomerListData(); // Local Function 2 Customer cust = new Customer { Name = "Bilisim.io", Balance = 100000 }; Console.WriteLine(cust.ToString()); Console.ReadKey(); } private static void DisplayCustomerListData() { int listSize=20; // Hatalı kullanım fakat göstermek için List<Customer> PopulateCustomer() { List<Customer> list = new List<Customer>(); for (int i = 0; i < listSize; i++) { list.Add(new Customer { Name = "Customer " + i.ToString(), Balance = 500 * i }); } return list; } List<Customer> listOfCutomer = PopulateCustomer(); foreach (var cust in listOfCutomer) { Console.WriteLine(string.Format(" Customer : {0} - {1}- {2}", cust.Name, cust.Balance,cust.ToString())); } } } |
Şimdi, yukarıda verilen kod örneklerine bakalım. PopulateCustomer yöntemi bir dizi oluşturuyor. Dikkat ederseniz oluşturacağı dizinin büyüklüğünü içinde olduğu metodun tanımlarından alabiliyor.Lokal fonksiyonlar tanımlı oldukları metodların değişkenlerini kullanabilirler. Güzel bir özellik, değil mi?
Customer sınıfının ToString() Metodunu inceleyecek olursanız. Bu kısımda da Lokal fonksiyonların nasıl kullanıldığını görebilirsiniz. Aynı işlemi get;set; kısmı içinde yapabilirdik. Customer sınıfı içinde bu kullanımıda görebilirsiniz.
Ben Lokal fonksiyonların servis ve asenkron dönüşlerde parametrelerin doğrulanması için kullanılmasının iyi bir çözüm olduğunu düşünüyorum.
Kodlara github üzerinden erişebilirsiniz. https://github.com/kkulaoglu/Bilisim.io