Out parametresi neden birden fazla parametre döndürüyor?

spacewizard

Femtopat
Katılım
16 Kasım 2023
Mesajlar
28
Daha fazla  
Cinsiyet
Erkek
Merhaba, çoğu kaynakta out parametresi hakkında "Metodun birden fazla değer döndürmesine izin vermek" veya "Bir metot içinde birden fazla geri dönüş yapılması bekleniyorsa kullanılır." gibi ifadelere yer verilmiş ama ben ref ile de bunu yapabilirim. Metodu çağırmadan önce iki tane değer tanımlarım bunları ref ile metoda geçiririm sonra metot kendi dışındaki iki farklı değeri değiştirmiş olur aynı out gibi. Kaynaklarda neden bu "out a özel" şeklinde belirtilmiş bunu bir türlü anlayamadım arkadaşlar, kaçırdığım bir şey mi var acaba?

Örnek kaynak:
Understanding ref and out in C#: Differences and Best Practices
Kaynakta "The method acts as a factory method, returning multiple values through out parameters." yazıyor.
 
Kaynak çok iyi açıklamış aslında.
Her ikiside pass by reference olarak geçmekte.
Tabiki ref kullanarak yapabilirsin. Buna kimse bir şey demez (code review harici :d). Fakat ikisinin kullanım amacı farklı.
Out kullanıyorsan bilmelisin ki o method kesinlikle out parametresini initialize etmeli. Yoksa hata verir. Aynısı ref için geçerli değil. Methoda ref ile parametre gönderebilirsin. Fakat bu methodun parametreyi kesinlikle initialize edeceği anlamına gelmez. Bir diğer farklılık ise ref kullandığın parametre methoda gönderilmeden önce initialize olmalı. Ayrıca out ile alınan parametre unassigned olarak geçer. Yani önce initialize et sonra kullan tarzında. Fakat ref, dediğim gibi, methoda gönderilmeden önce initiliaze edildiği için method içerisinde rahatça kullanılabilir.

Bu farkı tek başına yaptığın küçük projelerde farkına varmazsın. Aynı gibi gelir. Fakat büyük projelerde senin yazdığın bir interface methodunu kullanan biri bu out veya ref farkına göre ne yapması gerektiğini anlar.
C#:
public int Init(int a, int b, out int c)
{
    return a + b; // C initialize olmamış hatası verir.
}
public int Init(int a, int b, ref int c)
{
    return a + b; // Hata vermez.
}
public void Init(int a, int b, out int c)
{
    c += a * b; // Aynı şekilde initialize olmadan kullanmaya çalışıldığı için hata verir.
}

public void Init(int a, int b, ref int c)
{
    c += a * b; // Hata vermez.
}

Senin yazdığın ve sadece senin kullanacağın methodlarda dilediğini kullan. Fakat diyelim ki bir library geliştiriyorsun, veya büyük bir ekipte büyük bir proje geliştiriyorsan bu keywordlerin farklılıkları ortaya çıkıyor. Kaynak kodu belli olmayan bir library geliştirdiğinde, adam senin methodun imzasına bakarak ne istediğini direkt anlayabilir.
 
Senin yazdığın ve sadece senin kullanacağın methodlarda dilediğini kullan. Fakat diyelim ki bir library geliştiriyorsun, veya büyük bir ekipte büyük bir proje geliştiriyorsan bu keywordlerin farklılıkları ortaya çıkıyor. Kaynak kodu belli olmayan bir library geliştirdiğinde, adam senin methodun imzasına bakarak ne istediğini direkt anlayabilir.
Teşekkürler bu bana şunu fark ettirdi:
Mesela bu tryparse fonksiyonunda out parametresi kullanılmış, result değeri out ile tanımlanmış, en başında "int resultParsing;" gibi bir int oluşturuyorsun, değer eklemene de gerek yok ve tryParse a bunu tanımlıyorsun sana result sonucunu veriyor. Aynısı ref ile de yapılabilir ama bu durumda resultParsing i tryparse'a tanımlamadan önce bir değer vermek zorunda olurdun bunun da kod anlaşılırlığı açısından negatif bir anlamı olurdu, bunu gören biri "resultParse değeri metodun içinde değişime uğruyor" olarak algılardı ama out olduğu için bu bir şeyin sonucunu metodun dışına göndermek için oluşturulmuş bir değer şeklinde algılaması beklenir.

Kod anlaşılabilirliği için yapılmış bir şey de mantık aradığım için böyle oldu.
Bu arada bu konuyu stackoverflow a açtım, aslında baktığın zaman duplicate olmadığı halde duplicate yazıp "ref ve out farkı" diye bir başlığa yönlendirdiler 3 kişi de downvoteledi, ben ref ve out farkını sormadım ki, değeri dışarı çıkarabilmenin neden out a özel bir şeymiş gibi bahsedildiğini sordum, aynı şey değil ki. Tamam gereksiz başlıklar karmaşaya yol açıyor ama stackoverflow daki insanlar neden bu kadar gergin anlamıyorum :D
 

Geri
Yukarı