2012-03-30 17 views
5

que he tomado por el mantenimiento de la página web (ASP.NET VB) y en una página en particular me di cuenta el código de abajo¿Variable pública compartida compartida entre usuarios?

Inherits System.Web.UI.Page 

Public Shared UserNumber As String 

Private Sub Page_Init(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Init 

    UserNumber = Session("UserNumber") 

    ... 

End Sub 

Mi pregunta es si el userNumber variable se puede acceder o cambiar por cualquier otra usuario que el actual?

Muchas gracias

+0

Sí; como variable 'Shared ', es accesible para todas las instancias ... por lo tanto, todos los usuarios de la aplicación que se ejecutan en el mismo proceso. –

Respuesta

9

Una variable Shared es lo mismo que una variable static en C#.

Se pueden compartir en todas las instancias, por lo tanto, diferentes usuarios compartirían la misma variable.

Mirando el nombre de la variable, quiero suponer que tendría que eliminar esta Shared


Usted está solicitando un valor de variable Session a la Shared String en Page_Init.

Por lo tanto, cada vez que el usuario carga la página, su variable de sesión anulará el valor actual.


Si no está utilizando esta variable fuera de esta clase, entonces recomendaría cambiar a:

Protected UserNumber As String 
+0

Entonces, si el código simplemente se cambia a Número de usuario público como cadena ¿la variable solo sería accesible para el usuario actual? – BugLover

+0

+1 No podría haberlo puesto mejor;) – musefan

+0

@BugLover Esto es correcto – Curt

4

EDITAR Mi respuesta inicial era incorrecta. Intentando de nuevo ...

Técnicamente, como indica @Curt, una variable Shared se comparte entre las instancias de la clase.

Sin embargo, con el código como está, es menos probable que el valor se comparta entre los usuarios, ya que se establece en la copia local de cada usuario del valor en su sesión en Page_Init.

Hay un posible "condición de carrera", donde después de la variable compartida UserNumber se ha inicializado en Page_Init, y otro usuario hace una petición que actualiza el valor de esa variable de la sesión, el primer usuario será entonces ver del segundo usuario valor. es decir, los usuarios pueden ver los valores de otros usuarios para solicitudes simultáneas.

En su lugar, le recomiendo usar un ReadOnly propiedad no compartida para obtener el valor de la sesión una vez:

Private mUserNumber As String 
Public ReadOnly Property UserNumber As String 
     Get 
      If String.IsNullOrEmpty(mUserNumber) Then 
       mUserNumber = Session("UserNumber") 
      End If 
      Return mUserNumber 
     End Get 
End Property 

Este utiliza un patrón llamado "Lazy-carga", que utilizo en las propiedades de sólo lectura mucho en las páginas para mejorar el rendimiento y la legibilidad del código.

+0

Gracias por las respuestas, pero veo respuestas conflictivas Me doy cuenta de que la sesión se mantiene separada entre los usuarios, pero mi pregunta es si el usuario B podría afectar el valor de la variable Número de usuario para el usuario A? – BugLover

+0

El diccionario 'Session' es, pero ¿qué pasa con' Shared String'? ¿No estarían las diferentes variables de sesión actualizando la misma variable compartida? – Curt

+0

-1.Tiene razón sobre el diccionario 'Session', pero la * variable UserNumber * (de esto se trata la pregunta, no' Session ("UserNumber") ') * is * shared entre todos los usuarios. – Heinzi

Cuestiones relacionadas