¿VB.NET tiene un equivalente directo a los out
parámetros de la función C # , donde la variable pasada a una función no necesita ser inicializada?
Respuestas:
No, no existe un equivalente de la out
palabra clave en VB.
Sin embargo, VB inicializa automáticamente todas las variables locales en un método, por lo que puede usarlo ByRef
sin necesidad de inicializar explícitamente la variable primero.
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 ), puede ver los <OutAttribute>
parámetros agregados, pero eso solo hace una diferencia cuando la llamada se calcula para la interoperabilidad COM o la invocación de la plataforma).
ByRef
parámetros. (No sucede con los parámetros de tipo de valor.)
Nothing
eliminará la advertencia aunque no cambie el resultado.
Nothing
hasta ahora. Simplemente lleva mucho tiempo, ya que tengo que hacerlo cientos de veces en un gran sitio web heredado. Gracias por investigar.
Out
atributo no es equivalente a la out
palabra clave C # .
No, no existe una construcción equivalente que permita pasar una variable no inicializada a un método sin una advertencia, pero, como mencioné en mi pregunta y respuesta, especificar un <Out()>
atributo en unByRef
definición de parámetro, aunque VB lo ignora, es tratado por C # como out
parámetro.
Entonces, preinicializaría las variables de referencia para Nothing
y las especificaría <Out()> ByRef
para indicar la intención (eso funcionará si los usuarios de C # alguna vez acceden a sus métodos).
Si cree que sabe cuándo tiene la intención de acceder al valor predeterminado Nothing
en las variables de referencia no asignadas, puede establecer la "Configuración de advertencia" "Uso de la variable antes de la asignación" en "Ninguno" en el nivel del proyecto (Propiedades del proyecto> Compilar, y probablemente desea establecer Configuración en "Todas las configuraciones" antes de cambiar esta configuración), o, en VS2015 (VB.NET 14), puede usar #Disable Warning BC42030
.
Versión C #
void TestFunc(int x, ref int y, out int z) {
x++;
y++;
z = 5;
}
Versión de vb.net
Sub TestFunc(ByVal x As Integer, ByRef y As Integer, ByRef z As Integer)
x += 1
y += 1
z = 5
End Sub
Actualizar
Como se indica en el comentario, no olvide inicializar su parámetro que se usará en la ranura de salida
Tuve el problema en VB.NET que llamé a una función "por ref" que devolvió una matriz.
Aunque el compilador lo marcó como una advertencia, estaba bien. La solución es súper simple y probablemente una buena práctica de programación.
Cambié
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 a la hora de codificar si los nombres de las variables son descriptivos ...
Sub fnCreatePalette(ByRef arr_in_pal() As color, ByRef arr_out_pal() as uinteger)
...
End Sub
Puede utilizar el método de paso por referencia en VB.NET.
Necesita el mecanismo de parámetro Out en C #, porque no le permite usar ninguna variable sin inicializarla.
VB.NET no necesita una palabra clave especial, ya que lo hace automáticamente por sí mismo.
Solo usa ByRef.
VB tiene el atributo que debería ser el mismo que C # out, pero hoy todavía recibe una advertencia incluso si lo usa. Hay detalles sobre cómo solucionarlo en el área vblang de github. https://github.com/dotnet/vblang/issues/67 .
Object
, por lo que no se puede usar para unByRef x As Integer
parámetro).