2011-08-08 26 views
7

Tengo un proyecto en C# que está haciendo uso de otro proyecto escrito en vb.net. Actualmente puedo modificar ambos.C# y VB.Net parámetros de salida

Tengo un método en el proyecto de VB como:

Public Sub MethodName(ByVal param1 As String, ByRef param2 As String) 
     param2 = param1 + 1 
    End Sub 

no soy capaz de llamar a este método usando la palabra clave a partir de C#:

public void CallOtherMethod() 
    { 
     string param1 ="test"; 
     string param2; 

     provider.AddTransaction(param1, out param2); 
    } 

¿No debería el ByRef palabra clave en VB.Net tiene las capacidades de "ref" y "out"?

¿Debería hacer una referencia?

+2

Supongo que 'out' es lo mismo que' ref' con un atributo adicional, mientras que 'ByRef' es simplemente' ref'. – Joey

+0

Un parámetro ref necesita inicialización, pero no necesito ni tengo ningún uso para eso. Realmente no estoy preguntando esto porque estoy atascado, puedo ir fácilmente usando ref. –

+3

posible duplicado de [¿Existe un equivalente de VB.NET de los parámetros de salida de C#] (http://stackoverflow.com/questions/4358742/is-there-a-vb-net-equivalent-of-c-out-parameters) –

Respuesta

14

Para el tiempo de ejecución ref y out son bastante intercambiables, ya que ambos solo están pasando una referencia. Sin embargo, out se prefija con un atributo adicional en el IL:

public void y(ref int a) 
public void z(out int a) 

convierte en

.method public hidebysig instance void y(int32& a) 
.method public hidebysig instance void z([out] int32& a) 

que permite que el compilador de C# para distinguir los dos y añadir la semántica especiales que out tiene , es decir, que un parámetro out no necesita tener un valor asignado antes de ingresar el método y debe tener se le debe asignar un valor antes de salir t el método. Por el contrario, ByRef en VB solo proporciona ref, pero no la semántica adicional de out. No hay equivalente de out en VB.

2

No hay un equivalente de out en VB (que yo sepa) Solo ByRef que es equivalente a ref, por lo que sería la elección correcta.

Como va a ser pasando por referencia, la función llamada recibirá su valor y deberá inicializar su parámetro para que tenga una dirección en la memoria.

EDIT:

Ya que se puede editar tanto, ¿por qué no cambia el Sub a un Function y deshacerse del problema en conjunto y, en mi opinión, hacer que el código más agradable también.

+0

Tengo más de un parámetro que necesita volver en mi proyecto real. Hice esta pregunta solo por el mero hecho de aprender, en lugar de una solución para mi proyecto. Voy a ir con ref. Aclamaciones. –

+3

Puedes devolver una clase o estructura. Solo una idea. – Jodrell

2

Vaya con ref - es el equivalente de C# para ByRef de VB.

PERO Lea esta explicación detallada: When to use ref vs out.

4

Como se ha mencionado en mi question and answer que puede especificar una <Out()> attibute en la definición de parámetros y, a pesar de VB lo ignora, C# trata el argumento correctamente.

Cuestiones relacionadas