2009-05-17 26 views
6

I encontraron que hay dos tipos de métodos llamados métodos estáticos y métodos de instancia y sus diferencias. Pero aun así no pude entender las ventajas de una sobre otra.¿Qué es mejor? Los métodos estáticos o métodos de instancia

veces siento que los métodos estáticos no son 100% orientado a objetos.

¿Hay diferencias de rendimiento entre estos dos.

¿Alguien puede ayudar?

Respuesta

2

Los métodos de instancia requieren pasar un parámetro implícito (la referencia this) que los hace un poco más lentos que los métodos static. Pero esa no debería ser la razón para preferirlos.

Para una discusión relacionada, miro:

Should C# methods that *can* be static be static?

+1

Por favor, el argumento de velocidad solo debe considerarse si está tratando de hacer algo en una plataforma muy lenta o cientos de miles de veces en un segundo. Supongo que estás trabajando con un procesador dual core de> 2 Ghz. La diferencia de velocidad entre una llamada de función miembro y una llamada a función estática no debe ser un criterio de diseño. –

+1

Sí, incluso en plataformas mucho más lentas, no debería ser una consideración de diseño (como dije en la respuesta). Acabo de notar la diferencia en el rendimiento porque se pregunta específicamente. –

1

supongo parcialmente basado en la herencia de C#, pero sospecho que es lo mismo que los otros lenguajes orientados a objetos.

Los métodos estáticos no requieren de un objeto a trabajar. Un buen ejemplo es algo así como:

Double pi = Math.PI. 

Los métodos de instancia requieren un objeto. Un ejemplo es a lo largo de las líneas de:

Integer x = 9; 
Integer y = x.sqrt(); 

No toda la información que pertenece a una clase debería necesitar un objeto instancia de esa clase para tener acceso a ella. Todas esas constantes que se pueden usar para la creación de objetos (Math.PI, Window.OVERLAPPED, etc.) son ejemplos principales de esto.

2

Si su método utiliza los miembros de datos no estáticos, no lo hacen estática (que "no puede").

Si su método no utiliza ningún miembro de datos no estáticos, puede hacerlo estático, pero eso depende principalmente de su diseño en lugar de si usa o no miembros no estáticos (no hay mucha diferencia en el rendimiento de todos modos, como dijo Mehrdad).

Si no tiene miembros de datos no estáticos en su clase, a veces es una buena práctica para que todos los métodos estáticos (como en el caso de la agrupación de funciones de ayuda en virtud de una clase en aras del buen orden).

6

En un mundo perfecto OO probablemente no habría ninguna necesidad de métodos estáticos (creo Eiffel no los tiene, tampoco). Pero al final del día lo que importa no es OO-pureza de su código (C# tiene suficientes conceptos que no son estrictamente OO puros, como los métodos de extensión, por ejemplo), sino más bien lo que se hace.

Puede usar métodos estáticos para métodos auxiliares generales (que no necesitan una clase o estado auxiliar general por su cuenta) o cosas como Color.FromARGB() que se comportan ligeramente como contructor para tipos de valores.

En general, cualquier método que no toca un estado objetos (y por lo tanto es más que específico de objeto específico de clase) se puede hacer estática. Las diferencias de rendimiento no deberían realmente surgir. No es muy medible, en cualquier caso. El gran artículo de Jan Gray Writing faster managed code: Know what things cost tiene algunos datos concretos sobre esto, aunque debe tomarse con cuidado.

+2

Incluso en un "mundo OO puro", no veo cómo hacer Math.Cos un método de instancia sería "más OO". Para métodos de utilidad como estos, no hay diferencias conceptuales entre tener un método estático con N parámetros o tener un método de instancia con parámetro N-1 donde "este" se entiende como el primer parámetro ("Math.Cos (double)" VS "double.Cos()"). – Trillian

4

La utilidad de un método estático se produce principalmente cuando necesita llamar al método sin instanciar el objeto. Por ejemplo, tal vez el método estático esté ahí para buscar una instancia existente y devolverla (un ejemplo es una instancia singleton).

Como han indicado otros, puede hacer cualquier método estático si no tiene acceso al estado, y obtendrá una pequeña mejora en el rendimiento.

Si de verdad quiere poder llamar al método en una instancia específica y obtener los beneficios del polimorfismo (es decir, una clase derivada puede anular el comportamiento del método), entonces debe hacer que sea un método de instancia .

Si sus clases implementan interfaces, los métodos que pertenecen a esas interfaces también deben declararse como métodos de instancia.

3

Los métodos de instancia son ajustados a una instancia. De modo que podría ver que una de las ventajas de los métodos estáticos no es estar estrechamente relacionada con una instancia. Los métodos estáticos pueden (si son visibles) usados ​​por otros objetos para resolver sus problemas. A veces esto es bueno y necesario. Luego debe pensar en mantener sus métodos estáticos en la misma clase o si comienza a crear clases de utilidad para un uso más amplio. No vería el uso de métodos estáticos de ser "menos OO". Los métodos estáticos son una forma de eludir las deficiencias de OO (especialmente en lenguajes de herencia únicos). Puedes llamarlo un enfoque más funcional (sé que no es realmente).

Tomando todo esto solo hay un montón de preguntas que debe formular a su código y que deberían determinar si es mejor un método de instancia, un método estático de la misma clase o un método estático de otra clase.

Ni siquiera pensaría en problemas de rendimiento. Debilitará su diseño y la diferencia no es tan grande. El rendimiento es importante si tiene problemas de rendimiento.

1

Nadie es mejor que el otro. Realmente depende de tu requerimiento. Los métodos de clase se invocan cuando desea aplicar un cambio a la clase como un todo. Mientras que los métodos de instancia se invocan cuando no se aplica cambio a la clase sino a una instancia única (objeto) de esa clase.

Así que no veo una razón por la que uno debería ser mejor que el otro.

Cuestiones relacionadas