usar son qué programacion métodos miembros metodos metodo los instancia estáticos estaticos cuando c# .net performance static-methods

son - Método de instancia de Vs estático Rendimiento C#



static java (4)

Esto es básicamente una elección de diseño. Si tiene una lógica que incluye crear una instancia de clase y actualizar algunas propiedades, elija el método de instancia, ya que el método estático se compartirá entre las instancias. Si bien, si tiene algunas funciones de utilidad como realizar una manipulación de cadenas, crear una cadena de conexión, etc., que no implique manipulación de objetos, elija el método estático.

Tengo pocos métodos globales declarados en clase pública en mi aplicación web ASP.NET.

Tengo la costumbre de declarar todos los métodos globales en clase pública en el siguiente formato

public static string MethodName(parameters) { }

¿Quiero saber cómo impactaría en el punto de vista del desempeño?

  1. ¿Cuál es mejor? ¿Método estático o método no estático?
  2. ¿Por qué es mejor?

http://bytes.com/topic/c-sharp/answers/231701-static-vs-non-static-function-performance#post947244 estados:

porque, los métodos estáticos están utilizando bloqueos para ser Thread-safe. Siempre hacen internamente un Monitor.Enter () y Monitor.exit () para garantizar la seguridad de subprocesos.

Mientras que http://dotnetperls.com/static-method declara:

Los métodos estáticos normalmente son más rápidos de invocar en la pila de llamadas que los métodos de instancia. Hay varias razones para esto en el lenguaje de programación C #. Los métodos de instancia realmente utilizan el puntero de instancia ''this'' como primer parámetro, por lo que un método de instancia siempre tendrá esa sobrecarga. Los métodos de instancia también se implementan con la instrucción callvirt en el lenguaje intermedio, lo que impone una ligera sobrecarga. Tenga en cuenta que es poco probable que cambiar sus métodos a métodos estáticos ayude mucho en los objetivos de rendimiento ambiciosos, pero puede ayudar un poco y posiblemente conducir a nuevas reducciones.

Estoy un poco confundido cuál usar?


Personalmente, siempre elegiría el enfoque que sea mejor para realizar su tarea actual y escribiré un código estable, legible y fácil de mantener.

Hay otras formas de mejorar el rendimiento de su aplicación.

algunos ejemplos:

  • Si desea utilizar un método simple varias veces sin crear una instancia de un objeto cada vez (una función auxiliar), utilice un método estático en una clase estática.

  • Si su método accede a otras variables en la clase y no está en la función miembro de uso seguro de subprocesos.

  • En asp.net, si desea compartir un objeto entre sesiones o puede mejorar el rendimiento con un método que almacene en caché el resultado, un método estático también estaría bien.

  • Puede combinar ambas formas y usar el patrón de diseño de fábrica para tener una clase con algunas funciones miembro, pero se asegura de que siempre haya solo una instancia a la vez.

  • A veces, una función estática puede evitar errores estúpidos o reduce la necesidad de verificaciones adicionales en tiempo de ejecución:

    String.IsNullOrEmpty(thisstringisnull) // returns true thisstringisnull.IsNullOrEmpty() // If Microsoft would have implemented // the method this way you would get a // NullReferenceException

Pero en general depende totalmente de la tarea actual. No es fácil responder a su pregunta "siempre use este enfoque ...".


Su primer enlace dice:

Esto se debe a que los métodos estáticos utilizan bloqueos para que sean seguros para subprocesos. Siempre hacen internamente un Monitor.Enter () y Monitor.exit () para garantizar la seguridad de subprocesos

Eso es absolutamente, horriblemente, abominablemente incorrecto.


Si agrega [MethodImpl(MethodImplOptions.Synchronized)] al método, esa declaración se vuelve parcialmente cierta.

Agregar este atributo hará que el CLR lock(typeof(YourClass)) static métodos static dentro del lock(typeof(YourClass)) y los métodos de instancia dentro del lock(this) .

Esto debe evitarse siempre que sea posible.

Tu segundo enlace es correcto.
Los métodos estáticos son un poco más rápidos que los métodos de instancia , porque no tienen this parámetro (por lo tanto, se omite una comprobación NullReferenceException de la instrucción callvirt)


Tiendo a preocuparme muy poco sobre el rendimiento a este respecto. Los métodos estáticos son realmente útiles para hacer cumplir las prácticas funcionales. Por ejemplo, si crea un método auxiliar estático privado en su clase de instancia, tiene la tranquilidad de saber que ese método no puede modificar el estado de la instancia.