C# ref ve out Nedir? Kullanımı

Paylaş

C# programlama dili içerisinde yer alan metotlara değer türü verileri referans olarak göndermeye yarayan ref ve out anahtar kelimeleri ve kullanımı ile ilgili bilgiler yer alıyor.

C# ref ve out nedir?

C# içerisinde yer alan ref ve out değer türündeki verileri referans olarak metotlara geçmek için kullanılan anahtar kelimelerdir.

C# veri türleri temel olarak değer ve referans olmak üzere ikiye ayrılır.

Değer türleri (int, double, float, char .vb) belleğin stack bölgesinde tutulur.

Referans türleri (string, diziler, object, nesneler) belleğin heap bölgesinde tutulur.

Değer türleri referans türlerine göre daha hızlı çalışır ancak belleğin stack alanı sınırlı olduğu için diziler, nesneler belleğin heap bölgesinde oluşturulur.

Heap bölgesinde oluşturulan referans türlerine belleğin başlangıç adresi ile erişim sağlanır ve herhangi bir yerde yapılan değişiklik verinin değişmesine neden olur.

using System;

class Program {

    static void Main() {
        string[] kisiler = { "Yusuf Sefa", "Ramazan", "Sinan", "Mehmet" };
        foreach (string kisi in kisiler) {
            Console.WriteLine(kisi);
        }
        Duzenle(kisiler);
        foreach (string kisi in kisiler) {
            Console.WriteLine(kisi);
        }
    }

    static void Duzenle(string[] kisiler) {
        for (int i = 0, kisiSayisi = kisiler.Length; i < kisiSayisi; i++) {
            kisiler[i] = "Yusuf";
        }
    }
}

Örnekte yer alan Duzenle metoduna kisiler dizisinin başlangıç adresi gönderilmiştir.

Değer türleri ise metotlara belleğin başlangıç adresini göndermek yerine bir kopyasını gönderir.

Yukarıdaki dizinin bir kopyasını almak dizideki eleman sayısı az olduğu için kısa sürebilir.

Elaman sayısı binler seviyesinde olduğunda kopyalama işlemi yavaş olacaktır.

Değer türlerini referans olarak metoda geçmek için ref ve out anahtar kelimeleri kullanılır.

using System;

class Program {

    static void Main() {
        int sayimiz = 3;
        Console.WriteLine("Başlangıç değeri: {0}", sayimiz);
        Kare(sayimiz);
        Console.WriteLine("Kare() sonrası: {0}", sayimiz);
        Kare2(ref sayimiz);
        Console.WriteLine("Kare2() sonrası: {0}", sayimiz);
    }

    static void Kare(int sayi) {
        sayi = sayi * sayi;
    }

    static void Kare2(ref int sayi) {
        sayi = sayi * sayi;
    }
}

Kullanım nedeni hızdan dolayı değil metot içerisinde yapılan değişikliğin değer türüne uygulanması içindir.

out anahtar kelimesi

C# içerisinde yer alan ref ve out anahtar kelimeleri aynı işlemi yapar.

Ancak ref ile kullanımda değişkene başlangıç değerinin verilmesi gerekirken out anahtar kelimesi ile kullanımda başlangıç değerinin verilmesine gerek yoktur.

using System;

class Program {

    static void Main() {
        int sayimizOut;
        DegistirOut(out sayimizOut);
        Console.WriteLine(sayimizOut);

        int sayimizRef = 0;  // değer verilmediğinde hata verecektir.
        DegistirRef(ref sayimizRef);
        Console.WriteLine(sayimizRef);
    }

    static void DegistirRef(ref int sayiRef) {
        sayiRef = 1234;
    }
    
    static void DegistirOut(out int sayiOut) {
        sayiOut = 1234;
    }
}

C# içerisinde yer alan out anahtar kelimesi değer türlerindeki TryParse metodunda kullanılır.

using System;

class Program {

    static void Main() {
        string girilenSayi = "1453";
        int sayimiz;

        bool sonuc = int.TryParse(girilenSayi, out sayimiz);

        if (sonuc) {
            Console.WriteLine("Dönüşüm başarılı.");
            Console.WriteLine("Sayı: {0}", sayimiz);
        }
        else {
            Console.WriteLine("Dönüşüm başarısız.");
        }
    }
}

C# Derslerine buradan ulaşabilirsiniz.

Hayırlı günler dilerim.


Bunlarda ilgini çekebilir


LinkedIn grubuna buradan katılın.