c# programlama etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
c# programlama etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

Delegate Nedir?



C# programlama dilinde tanımlanan ve metot olarak adlandırılan işlevlerin bellek adresini tutmak için kullanılan yapıya delegate veya temsilci denir. C# delegate yapısı C/C++ dillerindeki function pointer veya fonksiyon göstericileri yapısına benzemektedir. 

Metot adı ve parametresi metot imzası olarak adlandırılır.

Bellekte bulunan metotlara erişebilmek için metot imzasının bilinmesi gerekir. Bu metot imzası C# içerisinde yer alan delegate ile tanımlanır.

Metotların sabit bir tanımı yoktur. Aşağıdaki iki metot birbirinden farklıdır:

void Topla(int sayi1, double sayi2); 
void Topla(double sayi1, int sayi2);

Metot adı ve parametresi metot imzası olarak adlandırılır.

Delegate Kullanımı


Genel tanımı aşağıdaki gibidir:

delegate <Metot_Dönüş_Değeri> <Temsilci_Adı> (<Metot_Parametresi>);

Yukarıda tanımlanan ilk metoda erişmek için aşağıdaki gibi bir delegate tanımı yapılmalıdır:

delegate void Temsilci (int sayi1,int sayi2);

Oluşturulan bu temsilci sayesinde bu imzaya sahip metotlara erişilebilir. Metotlara erişimi aşağıdaki gibidir:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace @delegate
{
class Program
{
static void Sum(int number1, double number2)
{
Console.WriteLine("Number1: {0} + Number2: {1} = result {2}", number1, number2, number1 + number2);
}
delegate void sumDelegate(int x, double y);
static void Main(string[] args)
{
sumDelegate sum = Sum; // sumDelegate sum = new sumDelegate(Topla);
sum(3, 5);
Console.ReadLine();
}
}
}


Func Delegate

Sıfır veya daha fazla input alır ve bir tane output verir. 

public delegate TResult Func < in T,out TResult>(T arg);

Örnek:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace @delegate
{
class Program
{
static int Sum(int num1, int num2)
{
return num1 + num2;
}
static void Main(string[] args)
{
Func<int, int, int> add = Sum;
int result = add(3, 5);
Console.WriteLine(result);
Console.ReadLine();
}
}
}


Action Delegate

Bir değer döndürmez, bunun dışından func delegate ile aynıdır.

public delegate void Print (int val);

Örnek:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace @delegate
{
class Program
{
static void ConsolePrint(int num)
{
Console.WriteLine(num);
}
static void Main(string[] args)
{
Action<int> printCns = ConsolePrint;
printCns(5);
Console.ReadLine();
}
}
}

Func ve Action Delegate Avantajları 

  1. Tanımlamak hızlı ve kolaydır. 
  2. Uygulama boyunca uyumlu tip.
  3. Kodu kısadır.


Kaynak:
Ders notları
https://docs.microsoft.com/tr-tr/dotnet/api/system.action-1?view=net-6.0
https://www.yusufsezer.com.tr/csharp-delegate/
https://docs.microsoft.com/tr-tr/dotnet/api/system.func-2?view=net-6.0






 

Recursive Örnekler

1) Klavyeden girilen sayının faktöriyeli:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace dort_islemm
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Sayi giriniz: ");
            int sayi = Convert.ToInt32(Console.ReadLine());
            islem(sayi);
            Console.WriteLine("{0}! = {1}", sayi,islem(sayi));

            Console.ReadLine();
        }

        public static int islem(int sayi)
        {
            if (sayi <= 0) return 1;
            else return sayi * (islem(sayi - 1));
        }
        
    }
}

2)  0 dan girilen sayıya kadar toplayan program: 


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace toplama
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Sayi giriniz: ");
            int sayi = Convert.ToInt32(Console.ReadLine());
            Console.WriteLine("Toplam = " + topla(sayi));

            Console.ReadLine();

        }
        public static int topla(int sayi)
        {
            if (sayi==0) { return  0; }
            else
            return sayi + topla(sayi - 1);
        }
        
    }
}

3) Girilen adım numarasındaki fibonacci değerini bulma:



using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace fibonacci
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Adim sayisini giriniz: ");
            int adim = Convert.ToInt32(Console.ReadLine());
            Console.WriteLine(fibonacci(adim));
            Console.ReadLine(); 
        }

        public static int fibonacci (int adim)
        {
            if(adim<=2)
            {
                return 1;
            }
            else
            {
                return fibonacci(adim - 1) + fibonacci(adim - 2);
            }
        }
    }
}
 4)0 dan girilen sayıya kadar yazma:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ekrana__sayi
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.Write("sayi giriniz: ");
            int sayi = Convert.ToInt32(Console.ReadLine());
            yaz(sayi);
            Console.ReadLine();
        }

        static void yaz(int sayi)
        {
            if (sayi == 0) return;
            else
            {
                Console.WriteLine(sayi);
                yaz(sayi - 1);
            }
        }
    }
}

5) Bir dizinin minimum değerdeki elemanı:


    using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace dizinin_en_büyük_elemanı
{
    class Program
    {
        public static int findMinRec(int[] A, int n)
        {
            // if size = 0 means whole array  
            // has been traversed  
            if (n == 1)
                return A[0];

            return Math.Min(A[n - 1], findMinRec(A, n - 1));
        }

        static void Main(string[] args)
        {
            int[] A = { 1, 4, 45, 6, -50, 10, 2 };
            int n = A.Length;

            // Function calling  
            Console.WriteLine(findMinRec(A, n));
            Console.ReadLine();
        }
    }
}