C # çıkış parametrelerinin bir VB.NET eşdeğeri var mı?


96

VB.NET, bir outişleve aktarılan değişkenin başlatılmasına gerek olmadığı C # işlev parametrelerine doğrudan eşdeğer mi?

Yanıtlar:


99

Hayır, outVB'de anahtar kelimenin eşdeğeri yoktur .

Bununla birlikte, VB bir yöntemdeki tüm yerel değişkenleri otomatik olarak başlatır, böylece ByRefilk önce değişkeni açıkça başlatmaya gerek kalmadan kullanabilirsiniz .

Misal:

Sub Main()
  Dim y As Integer
  Test(y)
End Sub

Sub Test(ByRef x As Integer)
  x = 42
End Sub

( Çerçevedeki kodu incelerseniz (örneğin, Double. TryParse ), <OutAttribute>parametrelere eklendiğini görebilirsiniz , ancak bu yalnızca çağrı COM birlikte çalışma veya platform çağrısı için sıraya dizildiğinde bir fark yaratır.)


2
@Spolto: VBScript’i VB’ye çeviriyorsanız, Açık ve Katı modu ayarladığınızdan emin olmalısınız. Size daha fazla hata mesajı verecektir, ancak çoğu ikincil problemler yerine problemlerin kaynağına işaret edecektir (örn. Tipsiz tanımlanmış değişken) (örn. Tip olmadan bildirilen değişken olur Object, dolayısıyla bir ByRef x As Integerparametre için kullanılamaz ).
Guffa

4
@Guffa: Sürüm meselesi mi bilmiyorum ama ben de başlatılmamış referans türü değişkenlerini ByRefparametre olarak geçirirken derleyici uyarıları alıyorum . (Değer türü parametrelerinde olmaz.)
Dan Tao

4
@Dan Tao, Spolto: Aradaki fark bu gibi görünüyor, referans türlerinde de bir uyarı alıyorum. Parametrelerin belirlenememesi, dilde bir sınırlamadır ve uyarılardan kurtulmak için değişkenleri başlatmanız yeterlidir. NothingOnlara atamak bile sonucu değiştirmese de uyarıdan kurtulacaktır.
Guffa

1
@Guffa: Evet, Nothingşimdiye kadar onlara atamıştım . Büyük eski bir web sitesinde yüzlerce kez yapmak zorunda olduğum için sadece zaman alıcı. Araştırdığınız için teşekkürler.
cspolton

3
@MarkHurd: Öyleyse olumsuz oy haksız, çünkü Outözniteliğin C # anahtar kelimesine eşdeğer olmadığını zaten belirtmiştim out.
Guffa

32

Benim belirtildiği gibi Hayır, orada olmayan bir başlatıldı değişken bir uyarı olmadan bir yönteme iletilmesine izin veren hiçbir eşdeğer bir yapıdır, ancak soru-cevap bir belirterek <Out()>niteliğini bir üzerinde ByRefparametre tanımı VB bunu görmezden rağmen, bir C # ile muamele bir şekilde outparametresi.

Bu nedenle, referans değişkenlerini önceden başlatır Nothing ve<Out()> ByRef amacı belirtmek için belirtirim (bu, C # kullanıcıları yöntemlerinize erişirse işe yarar).

NothingAksi takdirde atanmamış referans değişkenlerinde varsayılana ne zaman erişmeyi düşündüğünüzü bildiğinizi düşünüyorsanız , Proje düzeyinde (Proje Özellikleri> Derleme) "Uyarı yapılandırması" "Atamadan önce değişken kullanımı" seçeneğini "Yok" olarak Bu ayarı değiştirmeden önce Yapılandırmayı "Tüm Yapılandırmalar" olarak ayarlamak istiyorsanız) veya VS2015'te (VB.NET 14) kullanabilirsiniz #Disable Warning BC42030.


3
Bu önemlidir. MembershipProvider'ın bir VB alt sınıfına ve ardından VB alt sınıfının bir C # alt sınıfına sahiptim. C # kodu, MembershipProvider temel sınıfında belirtildiği gibi belirtilen parametreler için VB sınıfındaki özniteliği uygulayana kadar MembershipProvider'daki soyut yöntemlerin zaten uygulanmış olduğu gerçeğini tanımıyordu.
Richard Collette

@RichardCollette Bu muhtemelen bağlantılı soruma cevap olmaya değer!
Mark Hurd

9

C # sürümü

  void TestFunc(int x, ref int y, out int z) {
  x++;  
  y++;
  z = 5;
}

Vb.net sürümü

    Sub TestFunc(ByVal x As Integer, ByRef y As Integer, ByRef z As Integer)
  x += 1
  y += 1 
  z = 5 
End Sub

Cevabı burada buldum

Güncelleme

Yorumda belirtildiği gibi, çıkış yuvasında kullanılacak parametrenizi sıfırlamayı unutmayın.


Genel olarak, ByRef'in dışarıya en yakın şey olduğunu kabul ediyorum . Ancak, soru sorulduğu gibi, başlatılmamış bir değişkeni iletirseniz ByRef yine de bir uyarı atacaktır.
Richard

Olumsuz oyum epey bir zaman öncesine aitti: Bağlandığınız web sitesi çok genel; belirli sorunları, farklılıkları ve teknik özellikleri listelemez. Ayrıca cevabınız hala soruya cevap vermiyor.
Mark Hurd

1

VB.NET'te bir diziyi geri geçiren bir işlevi "ref" olarak adlandırdığım problemi vardı.

Derleyici bunu bir uyarı olarak işaretlemesine rağmen sorun değildi. Düzeltme süper basittir ve muhtemelen iyi bir programlama uygulamasıdır.

Ben değiştim

Dim m_arr_values() as Integer

fnRetArray(m_arr_values)

-e

' Even though 'Nothing' is the default value, setting it
' stops the compiler complaining.
Dim m_arr_values() as Integer = Nothing

fnRetArray(m_arr_values)

Değişken adlarının açıklayıcı olup olmadığını kodlarken de yardımcı olur ...

Sub fnCreatePalette(ByRef arr_in_pal() As color, ByRef arr_out_pal() as uinteger)
    ...
End Sub

3
Macar notasyonu, .NET çerçeve tasarım kılavuzuna aykırıdır.
Gqqnbig

0

VB.NET'te pass by reference yöntemini kullanabilirsiniz.

C # 'da Out parametre mekanizmasına ihtiyacınız vardır, çünkü herhangi bir değişkeni başlatmadan kullanmanıza izin vermez.

VB.NET otomatik olarak kendi kendine yaptığı için özel bir anahtar kelimeye ihtiyaç duymaz.

Sadece ByRef'i kullanın.


3
Bu soruya cevap vermez ve C # ile ilgili olarak yanlıştır.
cspolton

Byref, başlatmamanıza ve params değerini değiştirmenize izin verir. Ancak, C # out parametresinin tersine, parametreyi bir değerle başlatmanıza ve bunu işlevde kullanmanıza İZİN VERİR, oysa C # 'da out anahtar sözcüğü sizi bunu YALNIZCA bir dış parametre olarak kullanmaya zorlar ve giriş olarak DEĞİL işlev. Ayrıca, işlev içinde bu parametrenin bir değerini değiştirmezseniz veya ayarlamazsanız, derleyici bir derleme hatasının verileceği C # aksine bunu bir hata olarak algılamayacaktır.
2016


-5

Değişkenden önce ByRef anahtar sözcüğünü kullanın .


4
ByRef, refbir işleve geçmeden önce başlatılması gereken C # parametresine eşdeğerdir .
cspolton
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.