2012-02-09 13 views
28

Acabo de instalar el Service Pack de Visual Studio 2010 (propuesto en Windows Update), y puedo ver una nueva característica en el "intellisense" que significa que cuando escribo un Function o Sub en VB.NET no se completan automáticamente los parámetros con ByRef o ByVal ...¿Por qué ya no es necesario indicar ByVal/ByRef?

1) ¿De todos modos puedo configurar esta opción como antes?

2) Si no especifico ByX, ¿cuál se usa por defecto? (Parece que es siempre ByRef)

+2

El valor predeterminado es 'ByVal', pero asegúrese de entender qué significa [pasar por valor y por referencia] (http://msdn.microsoft.com/en-us/library/ddck1z30.aspx). –

+9

Casi siempre quiere pasar 'ByVal', y este es, de hecho, el valor predeterminado. No hay ninguna razón para que el código se atempere con 'ByVal' por todos lados; eso es solo "ruido". Solo especifique 'ByRef' explícitamente cuando absolutamente debe tener semántica de paso por referencia. –

Respuesta

17

Tim cubierto lo que se les pregunta directamente, sino otra cosa a tener en cuenta es que cualquier variable de tipo de referencia, como una clase definida por el usuario, incluso si se pasa por valor, le permitirá realizar cambios en las propiedades de instancias, etc. que permanezcan. Sin embargo, no le permitirá cambiar el objeto completo. Que puede ser por eso que parecía que se morosos por referencia a

Public Sub (Something As WhateverClass) 
    Something = New WhateverClass 'will result in no changes when outside this method 

    Something.Property1 = "Test" 'will result in an updated property when outside this method 
End Sub 

De MSDN:

El valor de un tipo de referencia es un puntero a los datos de la memoria en otra parte. Esto significa que cuando pasa un tipo de referencia por valor, , el código de procedimiento tiene un puntero a los datos del elemento subyacente, , aunque no puede acceder al elemento subyacente. Para el ejemplo , si el elemento es una variable de matriz, el código de procedimiento no tiene acceso a la variable en sí , pero puede acceder a los miembros de la matriz .

+0

Esta respuesta es un tanto engañosa ya que explica "cómo funciona el valor de un tipo de referencia" mientras que la pregunta es "¿por qué no es necesario indicar ByVal/ByRef más?" – mchar

31

Parece que este post cubre su pregunta:

http://msmvps.com/blogs/carlosq/archive/2011/03/15/vs-2010-sp1-changing-quot-byval-quot-vb-net-code-editor-experience.aspx

Así que no, no hay manera de conseguir el comportamiento anterior. A partir de ahora, ByVal es el valor predeterminado (lo que era antes) y no se agregará automáticamente a los parámetros del método.

En mi opinión, esta es una buena decisión, ya que hace que VB.NET sea un poco más consistente con C# y evita los "ruidos" innecesarios (ya es suficientemente prolijo).

comportamiento antigua:

Private Sub test(ByVal test As String) 
End Sub 

Nuevo comportamiento

Private Sub test(test As String) 
End Sub 
+0

Respuesta concisa y directa al punto, ¡bien hecho! – mchar

8

Ten cuidado cuando la transferencia de rutinas para VBA, donde el valor predeterminado es ByRef (véase, por ejemplo, "el método por defecto de los parámetros Pasando" en the bottom of this page, por el gran Chip de Pearson). Eso puede ser complicado.

Cuestiones relacionadas