¿Tiene VB.NET un equivalente directo a los parámetros de función C# out
, donde la variable pasada a una función no necesita ser inicializada?¿Hay un equivalente en VB.NET de los parámetros de salida de C#?
Respuesta
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.)
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
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
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
Gracias por la actualización aunque es un poco raro para rechazar la respuesta de 1 año de edad? – David
Gracias por la actualización. – Richard
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
.
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. –
@RichardCollette ¡Probablemente valga la pena ser una respuesta a mi pregunta vinculada! –
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.
Esto no responde la pregunta, y está mal con respecto a C#. – cspolton
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
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
La notación húngara está en contra de la directriz de diseño de .NET framework. – Gqqnbig
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.
- 1. C# y VB.Net parámetros de salida
- 2. ¿Hay un C# equivalente al repetidor de salida STL?
- 3. VB.NET equivalente de C# "As"
- 4. Casting C# parámetros de salida?
- 5. ¿Hay un equivalente de str_replace en C++?
- 6. equivalente volátil en VB.NET
- 7. VB.NET Seleccione ... Equivalente de declaración de caso en C#
- 8. ¿Hay un equivalente de C# de m_nCmdShow?
- 9. Equivalente de Array() en VB.NET?
- 10. ¿Qué pasa con los parámetros de salida?
- 11. ¿Hay una instrucción de bloqueo en VB.NET?
- 12. ¿Hay un equivalente de estática de C en C#?
- 13. C# - Azúcar sintáctico para los parámetros de salida?
- 14. Parámetros de salida opcionales
- 15. ¿Cuál es el equivalente de C# de CType en VB.NET?
- 16. ¿Hay un JavaScript equivalente para C# 'params'?
- 17. incrustación mono con C# "parámetros de salida"
- 18. ¿Hay un equivalente al urllib de python en c/C++?
- 19. ¿Hay un equivalente en C para las plantillas de C++?
- 20. ¿Hay un equivalente de rango de pitones (12) en C#?
- 21. ¿Hay un equivalente estándar de C++ del Vector3 de C#?
- 22. Mezcla y parámetros nombrados en C#: ¿Por qué los parámetros de salida también necesitan ser nombrados?
- 23. ¿Hay un equivalente a Groovy en C#?
- 24. VB.NET equivalente a C# usando la directiva
- 25. ¿Hay un equivalente a typedef en C#?
- 26. Uso de parámetros de salida de procedimiento almacenado en C#
- 27. salida equivalente en D?
- 28. ¿Hay un equivalente de std :: set en C#?
- 29. ¿Hay un equivalente al Proceso de C#. Comienza en PHP?
- 30. ¿Hay un destructor de C++ equivalente en Java?
¿Hay alguna forma de evitar las advertencias de compilación, sin deshabilitar las advertencias? – cspolton
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
@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