Metotlardan birden fazla değer döndürme yöntemleri

Birkaç yöntem var aslında.. :)

Klasik olarak bir metottan bir değer döndürürüz.

Örnek:

static void Main(string[] args)
{
    int a = 10;
    int b = 20;
    int c = IkiSayiTopla(a, b);
    Console.WriteLine(c);
}
 
private static int IkiSayiTopla(int a, int b)
{
    return a + b;
}

Peki bir metottan birden fazla değer döndürmemiz gerekirse?

Yukarıdaki örnek için sayıarın hem toplamlarını hem de çarpımlarını döndürmek istersek ne yapmamız gerekir?

(İki ayrı metot niye yazmıyoruz ki diyeceksiniz. Amacımız bir metotla bu işi halletmek.)

Beraber inceleyelim.

YÖNTEM 1: ref / out parametreler kullanmak.

static void Main(string[] args)
{
    int a = 10;
    int b = 20;
    int toplam;
    int carpim;
    IkiSayiToplaCarp(a, b, out toplam, out carpim);
    Console.WriteLine(toplam);
    Console.WriteLine(carpim);
}
 
private static void IkiSayiToplaCarp(int a, int b, out int toplam, out int carpim)
{
    toplam = a + b;
    carpim = a * b;
}

aynı örneği ref ile de yapabiliriz. O zaman kodumuzda ufak bir düzeltme yapmamız gerekir.

static void Main(string[] args)
{
    int a = 10;
    int b = 20;
    int toplam = 0;
    int carpim = 0;
    IkiSayiToplaCarp(a, b, ref toplam, ref carpim);
    Console.WriteLine(toplam);
    Console.WriteLine(carpim);
}
 
private static void IkiSayiToplaCarp(int a, int b, ref int toplam, ref int carpim)
{
    toplam = a + b;
    carpim = a * b;
}

ref ve out arasındaki farkı araştırmak size kalmış.

YÖNTEM 2: struct / class kullanmak.

struct Sonuc
{
    public int toplam;
    public int carpim;
}
static void Main(string[] args)
{
    int a = 10;
    int b = 20;
    var sonuc = IkiSayiToplaCarp(a, b);
    Console.WriteLine(sonuc.toplam);
    Console.WriteLine(sonuc.carpim);
}
 
private static Sonuc IkiSayiToplaCarp(int a, int b)
{
    var sonuc = new Sonuc
    {
        carpim = a * b,
        toplam = a + b
    };
    return sonuc;
}

aynı örneği class kullanarak da yazabiliriz.

class Sonuc
{
    public int toplam;
    public int carpim;
}
static void Main(string[] args)
{
    int a = 10;
    int b = 20;
    var sonuc = IkiSayiToplaCarp(a, b);
    Console.WriteLine(sonuc.toplam);
    Console.WriteLine(sonuc.carpim);
}
 
private static Sonuc IkiSayiToplaCarp(int a, int b)
{
    var sonuc = new Sonuc
    {
        carpim = a * b,
        toplam = a + b
    };
    return sonuc;
}

Aynı şekilde struct / class arasındaki farkı araştırmak size kalmış.

YÖNTEM 3: Tuple kullanmak

static void Main(string[] args)
{
    int a = 10;
    int b = 20;
    var sonuc = IkiSayiToplaCarp(a, b);
    Console.WriteLine(sonuc.Item1);
    Console.WriteLine(sonuc.Item2);
}
 
private static Tuple<intint> IkiSayiToplaCarp(int a, int b)
{
    var tuple = new Tuple<intint>(a + b, a * b);
    return tuple;
}

Daha önceden duydunuz mu bilmem ama C# 4.0 ile beraber kullanıma sunulan Tuple enterasan bir kullanım kolaylığı getiriyor.

Tuple'ı dilimize "demet" olarak çevirebiliriz. Grup anlamına da gelebilir belki.

En fazla 8 tane eleman barındırabilir ve her bir elemana sırasıyla tuple nesnesi üzerinden .Item1, .Item2, .. şeklinde erişilebilir.

Örnek:

class Kitap
{
    public string Yazar;
    public int SayfaSayisi;
}
 
static void Main(string[] args)
{
    var bilgiler = new Tuple<intDateTimestringKitap>
                    (23,
                    DateTime.Now,
                    "Merhaba",
                    new Kitap
                    {
                        Yazar = "Devrim Altınkurt",
                        SayfaSayisi = 280
                    });
    Console.WriteLine(bilgiler.Item1);
    Console.WriteLine(bilgiler.Item2);
    Console.WriteLine(bilgiler.Item3);
    Console.WriteLine(bilgiler.Item4.Yazar);
    Console.WriteLine(bilgiler.Item4.SayfaSayisi);
}

Ekran çıktısı:

23
04.06.2015 01:27:05
Merhaba
Devrim Altınkurt
280

Tuple hakkında daha detaylı bilgi isterseniz Burak Selim Şenyurt'un Tuple Nedir? Anlamak, Bilmek İstiyorum. başlıklı yazısını okumanızı öneriririm.

Herkese kolay gelsin.