2012-09-12 13 views
12

En C#, la palabra clave setter value de una propiedad será automáticamente igual que el tipo de propiedad.¿Por qué el setter de una propiedad VB.NET requiere un argumento escrito y por qué es ByVal?

Por ejemplo, en C#, tipo de value es string

private string str = string.Empty; 
public string MyText 
{ 
    get { return str; } 
    set { str = value; } 
} 

Si convertimos este fragmento a VB.Net obtenemos

Private str As String = String.Empty 
Public Property MyText() As String 
    Get 
     Return str 
    End Get 
    Set(ByVal value As String) 
     str = value 
    End Set 
End Property 

Preguntas

  1. ¿Por qué el conjunto tiene esta lin? e Set(ByVal value As String)? El valor tipo no debe ser automáticamente Cadena. De esta manera.

    Private str As String = String.Empty 
    Public Property MyText() As String 
        Get 
         Return str 
        End Get 
        Set 
         str = value 
        End Set 
    End Property 
    

    ¿De qué sirve eso?

  2. No puedo cambiar BYVal a ByRef (lo intenté, me da error), entonces ¿para qué sirve eso también?

+3

Buena pregunta, no estoy seguro de por qué recibió un -1 directamente. –

+0

@AlastairPitts: Probablemente por el título confuso. –

Respuesta

9

Usted puede omitir la parte(ByVal value As String). Visual Studio seguirá agregándolo, pero no es necesario ni para el lenguaje ni para el compilador.

Puede usar un nombre de parámetro que no sea value. También tenga en cuenta que desde VS2010 SP1, puede omitir la palabra clave ByVal.


Ejemplo:

Class Test 

    Private str As String = String.Empty 

    Public Property MyText() As String 
     Get 
      Return str 
     End Get 
     Set 
      str = value 
     End Set 
    End Property 

    Public Property MyText2() As String 
     Get 
      Return str 
     End Get 
     Set(something As String) 
      str = something 
     End Set 
    End Property 

End Class 
+0

Oye, si lo elimino, como dijiste, Visual Studio lo agrega automáticamente. –

+0

@NikhilAgrawal - que el editor VS insiste en agregarlo (de manera similar, agregará 'ByVal' si lo elimina). Pero el lenguaje * de Visual Basic * no requiere estas cosas. –

+0

@NikhilAgrawal No significa que el compilador lo necesite. – sloth

2

Creo que es parte de la sintaxis en Visual Basic. Puede omitir el tipo de datos, si OptionStrict no está activado. Pero si especifica el tipo, debe ser el mismo que el tipo de propiedad.

From MSDN - Set Statement (Visual Basic)

tipo de datos
requiere si Option Strict está activado. Tipo de datos del parámetro de valor. El tipo de datos especificado debe ser el mismo que el tipo de datos de la propiedad donde se declara esta instrucción Set.

2

Debido a que usted está permitido en VB para cambiar el nombre del parámetro:

Public Property MyText() As String 
    Get 
     Return str 
    End Get 
    Set(ByVal val As String) 
     str = val 
    End Set 
End Property 

No se puede cambiar el ByVal a ByRef porque los parámetros de propiedad no puede ser más pasan por valor . Pero VB a veces favorece la afirmación de hechos que son inalterables.

Los desarrolladores podrían (en teoría) que han dejado que sólo tienen:

Set(val) 

porque nada más es alterable. Pero optaron por hacer que los parámetros para las propiedades se asemejen a los parámetros para Function sy Sub s.


De hecho, no lo hace tienen que especificar el parámetro en absoluto. Según la especificación del lenguaje VB (9.7.2):

Si se especifica una lista de parámetros, debe tener un miembro, ese miembro no debe tener modificadores excepto ByVal, y su tipo debe ser el mismo que el tipo de la propiedad. El parámetro representa el valor de la propiedad que se está configurando. Si se omite el parámetro, un parámetro llamado Value se declara implícitamente

Y (9.5.2):

Un parámetro que no especifica ByRef o ByValByVal por defecto.

1

Si el valor fuera ByRef, el organismo sería capaz de modificar el valor de la persona que llama. No tiene sentido permitir que un establecimiento de propiedades cause efectos secundarios como este.

0

Puede hacer que el valor sea una enumeración y hacer un caso de selección en él, por ejemplo, y establecer el valor de esa manera. No tiene que limitar la llamada configurada de la propiedad a solo pasar el mismo tipo de valor que es una buena característica

Cuestiones relacionadas