VB.NET, bir out
işleve aktarılan değişkenin başlatılmasına gerek olmadığı C # işlev parametrelerine doğrudan eşdeğer mi?
Yanıtlar:
Hayır, out
VB'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 ByRef
ilk ö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.)
ByRef
parametre olarak geçirirken derleyici uyarıları alıyorum . (Değer türü parametrelerinde olmaz.)
Nothing
Onlara atamak bile sonucu değiştirmese de uyarıdan kurtulacaktır.
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.
Out
özniteliğin C # anahtar kelimesine eşdeğer olmadığını zaten belirtmiştim out
.
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 ByRef
parametre tanımı VB bunu görmezden rağmen, bir C # ile muamele bir şekilde out
parametresi.
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).
Nothing
Aksi 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
.
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
Güncelleme
Yorumda belirtildiği gibi, çıkış yuvasında kullanılacak parametrenizi sıfırlamayı unutmayın.
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
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.
VB, C # out ile aynı olması gereken özelliğe sahiptir, ancak bugün onu kullansanız bile hala bir uyarı alıyorsunuz. Github'ın vblang alanında düzeltmeyle ilgili detaylar var. https://github.com/dotnet/vblang/issues/67 .
Object
, dolayısıyla birByRef x As Integer
parametre için kullanılamaz ).