2010-09-23 14 views
9

que tienen una aplicación .NET (C#) que es algo como esto¿Los objetos estáticos son únicos por usuario?

public partial class _Default : System.Web.UI.Page 
{ 
    #region initial variables setup 

    private static exam theExam; 

    #endregion 


    protected void Page_Load(object sender, EventArgs e) 
    { 
     if(!IsPostBack) 
     { 
     string userid = Request.Querystring["user"].ToString(); 
      theExam = new exam(userid, "some values"); 
     } 
    } 
// rest of code. 

Ahora mi pregunta es, si se crean y se asignan a la declaración estática en la parte superior de usuario 105 registros en una instancia de theExam examen. Si el usuario 204 inicia sesión desde una computadora diferente, ¿el objeto estático en la parte superior obtiene el valor 204 incluso en la computadora del usuario 105?

Respuesta

10

No, el objeto estático es la misma instancia para todos los usuarios que inician sesión. Además, el objeto no vive en la computadora de 105 sino en el servidor web, por supuesto.

+0

Para aclaración: Las estadísticas son exclusivas del dominio de la aplicación, en cuyo caso se trata de la aplicación web completa.Nota: Si usa el equilibrio de carga, no son únicos en los dos + servidores. Así que ten esto en cuenta para la escala horizontal. – Aren

+0

Si usa el [ThreadStaticAttribute] cada thread tendrá su propia instancia de esa variable estática. –

+0

De hecho, pero los hilos se vuelven a utilizar para diferentes solicitudes, por lo que no es lo suficientemente bueno. Usar la Sesión es la mejor manera para algo como esto. –

6

Respuesta breve: sí, el campo estático es global para el dominio de la aplicación, por lo que al hacer esto un usuario pasará los datos a otro usuario.

Probablemente desee considerar el uso del almacenamiento de sesión, que tiene un ámbito por usuario, p.

var theExam = Session["exam"] as Exam; 
+1

+1 para AppDomain –

1

Hay una "instancia" de un objeto estático por Dominio de aplicación. Así que la respuesta a tu pregunta es sí. Como sobrescribe la variable cuando el usuario 204 inicia sesión, también aparecerá el mismo valor para el usuario 105.

Algunos consejos generales

  • Evitar los campos estáticos siempre que sea posible
  • utilizar la sesión para almacenar información temporal en el contexto de la sesión de navegación de un usuario
    Session["exam"] = currentUser.Exam;
  • utilizar un proveedor perfil por persistir información sobre cada usuario entre sesiones.
+2

Creo que decir "evitar campos estáticos siempre que sea posible" es exagerar un poco. He visto personas que literalmente tienen miedo de usarlos porque no entienden cómo funcionan y alguien les dijo que podrían estropear las cosas. No hay nada de malo en usarlos y hacer que muchas cosas sean mucho más fáciles (métodos de ayuda, almacenamiento en memoria caché). Solo necesita saber cómo usarlos correctamente. –

+0

@Matti - Un método no es un campo. Nada está mal con los métodos de ayuda. * Solo necesita saber cómo usarlos correctamente * - ¡De acuerdo! :) – Venemo

+0

He visto personas que temen toda la palabra clave 'static': I –

0

También hay un atributo [ThreadStatic] en .Net que creará una instancia estática por hilo.

http://msdn.microsoft.com/en-us/library/system.threadstaticattribute(VS.71).aspx

+0

Es bueno que lo menciones, pero en este caso también sería malo, ya que los subprocesos se reutilizan en el grupo de subprocesos de ASP.NET. –

+2

Sin embargo, un hilo no está dedicado para cada usuario. Ni siquiera una sola solicitud garantiza permanecer en el mismo hilo de principio a fin. Por lo tanto, la mayoría de las características de los hilos son inútiles (si no del todo) en las aplicaciones web. – Guffa

7

duración de las variables estáticas y sesiones de usuario son conceptos muy diferentes. Las variables estáticas tienen una vida útil definida por el CLR y esencialmente se reduce al 2 reglas siguientes

  1. Hay una ubicación de almacenamiento para una variable estática por AppDomain
  2. Cada instatiation única de un tipo genérico crea una variable estática diferente .

Me resulta difícil escribir la segunda regla sin que sea ambigua en cuanto a única. Esencialmente MyType<int> y MyType<string> cada uno tiene diferentes variables estáticas. Mientras que MyType<int> y MyType<int> comparten el mismo.

El acceso del usuario a un servidor web no afecta a ninguno de estos.

Si desea tener datos por usuario, utilice el Session para almacenar los datos.

Session["examKey"] = theExam; 
+0

+1 para la explicación de los tipos genéricos. –

+0

No estoy seguro si estoy haciendo esto bien, pero básicamente lo que hice es examen newExam = new exam (value, value); Session ["someKey"] = newExam, entonces simplemente lanzo Session ["someKey"] como el examen theExam = (exam) Session ["someKey"] para poder obtener los objetos ... ¿es esta la forma correcta de hacerlo? – Migs

Cuestiones relacionadas