2010-12-05 12 views

Respuesta

74

No, no hay un equivalente de la palabra clave out en VB.

Sin embargo, VB inicializa automáticamente todas las variables locales en un método, por lo que puede usar ByRef sin necesidad de inicializar explícitamente la variable.

Ejemplo:

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

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

(Si examina el código en el marco (por ejemplo Double.TryParse), es posible ver el <OutAttribute> añaden a los parámetros, pero que sólo hace una diferencia cuando se comandó la llamada de interoperabilidad COM o invoke plataforma.)

+0

¿Hay alguna forma de evitar las advertencias de compilación, sin deshabilitar las advertencias? – cspolton

+0

Sí, he leído sobre '', afortunadamente estoy migrando una aplicación ASP clásica a VB.NET, no es interoperabilidad COM o invocación de plataforma. Tengo que lidiar con cientos de advertencias de compilación. – cspolton

+0

@Spolto: Probé esto en VS 2008 y VS 2010, con el modo explícito y estricto activado, y no recibo ninguna advertencia. Agregué el ejemplo de arriba. – Guffa

-4

Use la palabra clave ByRef antes de la variable.

+4

'ByRef' es equivalente a los parámetros' ref' en C#, que deben inicializarse antes de pasar a una función. – cspolton

6

C# versión

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

versión Vb.net

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

Found the answer here

actualización

Como se indica en el comentario no se olvide de initialze el parámetro que se se Nosotros ed en la ranura de salida

+0

En general, estoy de acuerdo con que * ByRef * es lo más parecido al * out *. Sin embargo, * ByRef * seguirá lanzando una advertencia si pasa una variable sin inicializar, como lo hace la pregunta. – Richard

+0

Gracias por la actualización aunque es un poco raro para rechazar la respuesta de 1 año de edad? – David

+0

Gracias por la actualización. – Richard

27

no, no hay constructo equivalente que permite una variable no inicializada que se pasa a un método sin una advertencia, pero, como se mencionó en mi question and answer especificando una <Out()> attribute en una definición ByRef parámetro, aunque VB ig nores it, es tratado por C# como un parámetro out.

lo tanto, me pre-inicializar las variables de referencia a Nothing y especificar <Out()> ByRef para significar la intención (que funcionará si C# de usuarios acceder a sus métodos).

Si siente que se sabe cuando va a acceder a la opción predeterminada Nothing en las variables de referencia de lo contrario no asignadas se puede establecer la "configuración de advertencia" "Uso de la variable antes de la asignación" a "Ninguno" a nivel de proyecto (Propiedades del proyecto> Compilar, y probablemente desee establecer Configuración en "Todas las configuraciones" antes de cambiar esta configuración) o, en VS2015 (VB.NET 14), puede usar #Disable Warning BC42030.

+3

Esto es significativo. Tuve una subclase VB de MembershipProvider y luego una subclase C# de la subclase VB. El código C# no reconocía el hecho de que los métodos abstractos en MembershipProvider ya se habían implementado hasta que aplique el atributo en la clase VB para los parámetros que se especificaron como out en la clase base MembershipProvider. –

+0

@RichardCollette ¡Probablemente valga la pena ser una respuesta a mi pregunta vinculada! –

0

Puede usar el método de pase por referencia en VB.NET.

Necesita el mecanismo del parámetro Out en C#, porque no le permite usar ninguna variable sin inicializarlo.

VB.NET no necesita una palabra clave especial, ya que lo hace automáticamente.

Solo use ByRef.

+3

Esto no responde la pregunta, y está mal con respecto a C#. – cspolton

+0

El byref le permite no inicializarse y le permite cambiar el valor de params. Pero, a diferencia del parámetro C# out, LE PERMITE inicializar el parámetro con un valor y usarlo en la función, mientras que en C# la palabra clave out obliga a utilizar esto SOLAMENTE como un parámetro fuera y NO como entrada a la función. Además, si no cambia ni establece un valor para este parámetro dentro de su función, el compilador no lo detectará como un error, a diferencia de C# donde se emitirá un error de compilación. – pashute

0

Tuve el problema en VB.NET que llamé a una función "por ref" que pasó una matriz de nuevo.

Aunque el compilador lo marcó como una advertencia, estaba bien. La solución es una práctica de programación súper simple y probablemente buena.

I cambiado

Dim m_arr_values() as Integer 

fnRetArray(m_arr_values) 

a

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

fnRetArray(m_arr_values) 

También ayuda al codificar si los nombres de variables son descriptivos ...

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

La notación húngara está en contra de la directriz de diseño de .NET framework. – Gqqnbig

0

VB tiene el atributo que debe ser la misma como C#, pero hoy todavía recibes una advertencia incluso si la usas. Hay detalles sobre cómo arreglarlo en el área vblang de github. https://github.com/dotnet/vblang/issues/67.

Cuestiones relacionadas