2012-05-23 18 views
7

Las variables estáticas en ASP.NET me tomaron desprevenido hoy. Entonces me asusté, porque esto significa que tengo un malentendido fundamental de las variables estáticas en el mundo de la web o que ASP.NET no funciona como pensé que lo haría.PHP vs ASP.NET variables estáticas

Así en ASP.NET

public class MyClass { 
    public static bool myVar = true;  
} 

Si ASPUserA establece MyClass.myVar = false cualquier otro usuario en el sistema podría experimentar estos cambios. Por lo tanto, ASPUserB tendría myVar = false. Mi Fuente: http://www.foliotek.com/devblog/avoid-static-variables-in-asp-net/

class MyClassPHP { 
    public static $myVar = false; 
} 

Si PHPUserA establece MyClass::$myVar = true quiere decir esto que cada usuario en el sistema experimenta estos cambios ???

Gracias.


Tras una investigación adicional lo hice;

class MyClassPHP { 
    public static $myVar = 0; 
} 

Luego tuve usuarios que fueron a una página hacen esta

MyClassPHP::$myVar++; 
echo MyClassPHP::$myVar; 

Siempre fue 1. No importa cuántas veces lo actualiza o simultáneas conexiones ... WOHHH que fue una gran conclusión, o si no, estoy jodido !!


actualización de ASP.NET

Tras una posterior investigación y pruebas cosas que encontré esto.

public partial class MyPage : System.Web.UI.Page 
{ 
    public static int myInt = 0; 

    protected void Page_PreInit(object sender, EventArgs e) 
     myInt++; 
    } 

} 

Luego mi página puede mostrar myInt.

Entre los navegadores (Firefox y Chrome) el myInt fue progresivamente más alto a medida que actualizaba la página. Así que esto no importa si su class es static. Solo importa si tienes variables estáticas. Son aplicaciones de ancho.

+2

¡WOW!¿ASP.NET realmente hace eso? Eso es estúpido =/ –

+2

Estoy tan confundido por eso. ¡De alguna forma arruinó mis Paradigmas por una ventana! – Michael

+2

Gracias por convencerme * nunca * para usar ASP.NET ;-P –

Respuesta

7

cuando se ejecuta en IIS:

Una variable estática no es "página" específica. Es específico de "AppDomain". La única relación con la "página" sería la ruta (por así decirlo) de la variable (MyProject.MyPage.MyVariable, por ejemplo). Como todos los usuarios de la aplicación se ejecutan en el mismo dominio de aplicación (es decir, la misma carpeta de la aplicación IIS), todos usarán la misma variable estática. Entonces ... eventualmente sus usuarios van a ver la información de cada uno, ya que todos comparten esa única variable estática.

PHP, sin embargo, rastrea la estática POR INSTANCIA DEL USUARIO, así que supongo que podría llamarlos "más seguros desde la zona de peligro única".

+1

Buen trabajo Microsoft. =/ –

+3

Quiero decir que no es ... ¿horrible? Tienes que evitarlo en algunos casos, pero en otros es IMPRESIONANTE cuando se trata de la administración de la memoria. Luego puede tener un solo objeto que opere la misma función en un grupo de usuarios en lugar de tener 10 copias del mismo objeto haciendo lo mismo. Supongo que es solo cuestión de preferencia: D –

+0

Esto es antiguo, pero esto no es una cuestión de preferencia, una página es accesada por más de un usuario, entonces, el comportamiento normal sería el de PHP, no ASP.Net. .. esto no es un Windows Form que es un usuario único ... realmente explota tus paradigmas como singleton para administrar la base de datos pero con diferentes consultas de conexión ... un usuario ingresa a una página, tiene una conexión A, los cambios a otra página tienen una conexión B , pero un nuevo usuario irá a C, y verá A o B hasta que se modifique ... realmente es frustrante no poder usar singleton POR USUARIO ... – matiaslauriti

0

No, PHP no es tan estúpido como ASP.NET (¿realmente lo hace?). Las variables estáticas en PHP son por instancia (no es como ASP.NET donde toda la página es una instancia, cada usuario obtiene su propia instancia de PHP).

Si 2 usuarios van a una página PHP, y en una página MyClass::$myVar = true se ejecuta, no afecta al otro usuario.

+0

¿por qué esto es estúpido? Static no es variables de sesión. Por lo que dices, las páginas estáticas en php están conectadas al usuario, y ¿cómo puede ser eso? Si el usuario no tiene cookies? entonces la estática no está conectada y cada vez nace una nueva estática? Creo que MS hizo un gran trabajo, estático es lo que se dice para el grupo. – Aristos

+0

usuario asp.net Variables de sesión que hacen lo que dices. Por otro lado, ¿cómo php mantiene datos comunes en todas las instancias en ejecución? Por ejemplo, utilizo la static para declarar algo que no es cambio y que uso mucho en todos los usuarios, ¿cómo lo haces en php? – Aristos

+0

@Aristos: "declara algo que no es cambio y se usa mucho en todos los usuarios" No, o lo guardas en una base de datos. –