2009-11-02 13 views
5

Me he estado preguntando, ¿Cuándo utilizar funciones estáticas y cuándo no en ASP.NET¿Cuándo es mejor utilizar funciones estáticas en ASP.NET

¿Cuáles son las ventajas y desventajas en su uso, en varios aspectos como el rendimiento, siguiendo buenas prácticas, etc. (y muchas más, lo que creas que sea relevante).

Esperamos sus respuestas.

Gracias,
Mahesh Velaga.

+4

Ver http://stackoverflow.com/questions/169378/c-method-can-be-made-static-but-should-it – cdonner

+0

bastante algunas preguntas simillar: http : //stackoverflow.com/search? q = static + methods –

+0

@cdonner y @preet ... gracias por los enlaces ... pero estaba buscando una información completa de la comunidad sobre métodos estáticos, ya que no estaba muy claro sobre t them .. gracias de nuevo ... :) –

Respuesta

4

Contras:

  • problemas de threads (funciones estáticas no requieren una instancia para ser llamados, por lo que es fácil de invocar a ellos desde diferentes partes del código y si leen/escritura a una compartida declarar que este estado podría estar dañado en un entorno de subprocesos múltiples como ASP.NET)
  • difícil de probar unitario (como las funciones estáticas no requieren una instancia de objeto, la inyección del constructor es imposible, lo que significa que la única forma de inyectar dependencias es pasándolos como argumentos para la función en sí)

Pros:

  • de rendimiento (esto es cuestionable - en la mayoría de las ganancias de rendimiento casos serán completamente insignificante en comparación con otras partes del código)
+0

¿podría explicar eso, o podría proporcionar algunas sugerencias en esa dirección ... gracias –

+0

No sería otro beneficio la semántica: algunos comportamientos no dependen de que una instancia envolvente funcione, por lo que es más "correcto" marcarlos como tales. – ehdv

+1

@ehdv que es una extensión del rendimiento, simplemente eliminando instancias innecesarias. –

1

La única desventaja importante a un método estático es que es casi completamente no verificable por unidad. Los usuarios del método deben vincularse al método concreto y no pueden vincularse a una abstracción, lo que dificulta o imposibilita la falsificación o burla.

Esto puede o no ser un problema, dependiendo del código, sin embargo.

La otra cosa que desea tener en cuenta es que los datos estáticos son universales en todas las solicitudes al servidor.

+1

También es extremadamente confuso para los desarrolladores principiantes de ASP.NET. –

2

Definitivamente hay situaciones donde la solución estática es la solución adecuada, como con cualquier aplicación. Cada vez que tenga algún objeto que debería vivir en el ámbito de la aplicación, y no en el ámbito de solicitud, debe ser estático y debe usar métodos estáticos para acceder y manipularlo.

Como ejemplo, aquí hay un fragmento de código que escribí recientemente para una aplicación ASP.NET, que es esencialmente una memoria caché de serializador. Serializadores son caros para crear y podemos volver a utilizar la misma según el tipo durante el tiempo que la vida de la aplicación, así que no hay necesidad de perder tiempo en cada hilo solicitud de ellos:

(Nota: esto ha sido simplificada para demostrar los aspectos estáticos)

public class XmlSerializerUtility 
{ 
    private static Dictionary<Type, XmlSerializer> serializers = new Dictionary<Type, XmlSerializer>(); 
    private static object sync = new object(); 

    public static T Deserialize<T>(string input) 
    { 
     XmlSerializer xs = GetSerializer(typeof(T)); 
     using (StringReader sr = new StringReader(input)) 
     { 
      return (T)xs.Deserialize(sr); 
     } 
    } 

    public static XmlDocument Serialize(object input) 
    { 
     XmlDocument doc = new XmlDocument(); 
     XmlSerializer xs = GetSerializer(input.GetType()); 
     using (MemoryStream stream = new MemoryStream()) 
     { 
      xs.Serialize(stream, input); 
      stream.Position = 0; 
      doc.Load(stream); 
     } 
     return doc; 
    } 

    private static XmlSerializer GetSerializer(Type type) 
    { 
     lock (sync) 
     { 
      XmlSerializer xs = null; 
      if (!serializers.ContainsKey(type)) 
      { 
       xs = new XmlSerializer(type); 
       serializers.Add(type, xs); 
      } 
      else 
      { 
       xs = serializers[type]; 
      } 
      return xs; 
     } 
    } 
} 
+1

@Rex M, su 'Diccionario ' no tiene sentido, XmlSerializer ya utiliza técnicas avanzadas de almacenamiento en caché y no creará el doble del mismo conjunto de temperatura para los mismos tipos. Un simple 'nuevo XmlSerializer (tipo)' hará el trabajo bien. Una vez hice lo mismo solo para descubrir que la instrucción 'lock' era tan lenta como actualizar el serializador :-) –

+0

@Darin Creo que puede estar equivocado. XmlSerializerFactory sí utiliza el almacenamiento en caché, pero no admite tipos genéricos muy bien. El XmlSerializer (sin fábrica) no almacena en caché. –

+0

@Rex M, de acuerdo con la documentación (http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlserializer.aspx) si utiliza alguno de los ctors: 'XmlSerializer.XmlSerializer (Type) 'o' XmlSerializer.XmlSerializer (Type, String) 'que usted hace: la infraestructura de serialización XML genera dinámicamente conjuntos para serializar y deserializar los tipos especificados. La infraestructura encuentra y reutiliza esos conjuntos. –

Cuestiones relacionadas