Neden C # hem ref hem de ref var?


18

C # outve refanahtar kelimelerine sahiptir. Neden bu ikisi gerekli? Feragatname: C # hakkında derin bilgiye sahip değilim.


3
Stack Overflow'da siteler arası bir kopya yok mu?
Peter Mortensen


2
Eğer arasındaki fark için soruyorsun refve out? Yoksa by-reference argümanlarının ref/ kullanımının, outby-value argümanlarıyla karşılaştırıldığını mı soruyorsunuz (parametrede değiştirici yok)? Ya da her ikisi de?
Jeppe Stig Nielsen

1
Bu sorunun benzer olduğunu düşünüyorum, ama en azından dil tasarımı perspektifinden alındığında
çift ​​değil

Yanıtlar:


32

Uygulama açısından, bunlar aslında aynı şeydir, ancak olmayan outbir şeyi iletir ref: Girdi ile ilgilenmezsiniz. Bu sizin ve aletleriniz için belirli şeyler anlamına gelir. Örneğin, bir outparametreye başlatılmamış bir değişken iletebilirsiniz ve bu bir sorun değildir, aksi takdirde olur ve işlev içinde outparametreye dönmeden önce bir değer atamanız gerekirken, hepsi bir refdeğer.


10
Ref vs out derleyici için bir programcıdan çok daha önemlidir. Derleyici, bir değişken atanmadan önce bir değişkeni okumadığınızdan emin olmakla yükümlüdür ve bunu değişkenlerle outbaşa çıkmak istediğiniz yolla daha iyi eşleşen bir yol verir.
Cort Ammon - Eski Monica Monica

Lütfen 'detay' hakkında 'ref' olmayan bir şeyi iletir misiniz?
Neo

4
@Neo: Temel olarak cevapta söylediğim şey: Bunu giriş için kullanmayı umursamadığınızı bildiriyor ve bu nedenle bir outparametreye başlatılmamış bir değer iletmek güvenli çünkü onu alan fonksiyon ondan okunmayacak .
Mason Wheeler

@MasonWheeler Doğrulayıcı tarafından buna izin veriliyor mu (ve / veya alıcı taraf tarafından uygulanıyor)? Out sadece dahili bir özelliktir.
Random832

@ Random832: As Robert bu tartışırken, onun cevabını altında Eric Lippert (eski C # derleyicisi adam) bir göz var yayınlanmıştır stackoverflow.com/q/2876315
Mason Wheeler

7

Bu iki anahtar kelimeyi anlamak için, bir değeri referansla iletmenin ne anlama geldiğini anlamanız gerekir . Temel olarak , yöntem veya işlev içinde ilettiğiniz parametre değişkenini değiştirirseniz , bu değişken işlevinizden çıkarken değiştirilen değerini korur. Bir parametreyi bunu olarak bildirmek refveya bunu outbaşarmakla birlikte, sıradan bir parametre değişkeni işlevde değiştirseniz bile orijinal değerini koruyacaktır.

Sadece arasındaki farklar refve outolmasıdır outişleve geçirmeden önce değişkeni başlatmak için gerektirmez, ancak refyapar; iken out yaptığı işlevin içinde değişkene bir şey atamak gerekir, fakat refyok.


Varyansla ilgili bir fark yok mu?
monocell


2

Sen sordun.

C # var ve ref, neden bu ikisi gereklidir. C # hakkında derinlemesine bilgim yok. Neden çıkış ve ref parametreleri gereklidir?

Ve cevap şudur: GEREKLİ DEĞİLDİR, java örneğin ikisine de sahip değildir ve VB sadece ref'ye sahiptir (ve yalnızca yöntem bildiriminde gerektirir).

İkisini de kullanmadan tüm bir programı kolayca yazabilirsiniz.

Varlar çünkü zaman zaman yararlıdırlar. Bu yüzden sadece bir tane değil, ikisi var - çünkü 'burada bir şey var, eğer istersen değiştir' ve 'bu şeye yeni bir değer ver' arasındaki ayrımı yapmak faydalıdır.

Diğer diller farklı önceliklere sahiptir ve bu nedenle bunları veya eşdeğerini içerebilir veya içermeyebilir. Her ikisinin de yararlı olup olmadığına bile katılmayabilirler ve bu yüzden birini veya diğerini uygulamamaya aktif olarak karar verebilirler.


1

Her ikisinin de özünde refve outbir değişkenin adresini bir yönteme geçirmek için bir mekanizma sağlar, böylece güncellenebilir - refveya outparametresine atanmak değişkeni arayanın bağlamında günceller. Farklı oldukları yerde garantiler vardır: outdeğişkenin güncelleneceğini garanti eder, refetmez.

Çağrının diğer tarafından benzer farklılıklar var. Metodumuzun bir outparametresinin varışta yararlı bir şey içereceği garanti edilmez ve bir noktada bir değere ayarlanması gerekirken, bir refparametrenin bir değere sahip olduğu varsayılabilir ve onunla özel bir şey yapmamız gerekmez.

Bu farkın kod analizi, üretimi ve optimizasyonu üzerinde etkisi vardır, bu da çoğu zaman bizim için çok belirgin olmasa da, programlarımızın çalışma şekli üzerinde bazı etkileri olabilir. Kod üreticisi, çağrıdan hemen önce değişkenin tahsisini erteleyebilir, optimize edici, sözleşmeye dayalı olarak bazı işlemleri daha etkili bir şekilde yeniden sıralayabileceğine karar verebilir.

Kullanım açısından: genel bir kural outolarak, değişkenin parametresi olarak geldiğinde ve refyaptığımda içeriği umursamadığım durumlar için kullanıyorum .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.