Neler yeni

Foruma hoş geldin, Ziyaretçi

Forum içeriğine ve tüm hizmetlerimize erişim sağlamak için foruma kayıt olmalı ya da giriş yapmalısınız. Foruma üye olmak tamamen ücretsizdir.

Kod Paylaşımı C# ref ve out nedir?

Asperix

Yönetici
Yazılım Uzmanı
Katılım
2 Ara 2022
Mesajlar
52
download.png



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.

C#:
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.

C#:
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.

C#:
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.

C#:
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.");
        }
    }
}
 

Forumdan daha fazla yararlanmak için giriş yapın yada üye olun!

Forumdan daha fazla yararlanmak için giriş yapın veya kayıt olun!

Kayıt ol

Forumda bir hesap oluşturmak tamamen ücretsizdir.

Şimdi kayıt ol
Giriş yap

Eğer bir hesabınız var ise lütfen giriş yapın

Giriş yap

Tema düzenleyici

Tema özelletirmeleri

Grafik arka planlar

Granit arka planlar