2010-07-13 9 views
7

La forma en que lo entiendo, tener una variable de miembro declarada como estática en un clase no estática hace que esa variable miembro sea única sin importar el número de instancias de esa clase.¿Qué sentido tiene declarar un método estático en una clase no estática?

Ahora, ¿qué ocurre con un método estático declarado en una clase no estática? Y (Lo más importante es), ¿qué sentido tiene declarar un método estático en una clase no estática?

Gracias por ayudar a

+3

No utilizaría la palabra 'único' aquí. Se comparte entre todas las instancias. –

+0

@Henk Holterman: gracias por corregirme. – Richard77

Respuesta

4

El método de clase que funciona solo con sus parámetros, no llama a ningún método de instancia y no funciona con ningún miembro de instancia, puede declararse como estático. En realidad, debe declararse como estático, para un mejor rendimiento, ya que el método estático no requiere "este" puntero.

Considere la pequeña función que pertenece a la clase, realiza algunos cálculos con sus parámetros y devuelve el valor calculado. Esta función debe ser estática.

+1

Calificaría la comprobación de corrección estática más alta que el rendimiento. Al declarar un método como estático, está dejando que el compilador sepa que no puede usar ninguna información específica para instancias particulares, por lo que emitirá errores o advertencias cuando el programador intente hacer eso de todos modos, p. intenta llamarlo como un método de instancia. – reinierpost

21

Si el método tiene algo que ver con el tipo pero no el ejemplo, entonces puede ser estática.

DateTime.Parse y Int32.Parse son ejemplos.

+10

Y hay una directriz que dice "si puede ser estático y no estático". –

+2

En relación con el comentario de Henk Holterman: http://stackoverflow.com/questions/790281 –

2

Por ejemplo, tiene una clase por ejemplo Bank_Account en la que desea calcular el número de objetos creados para esa clase.
Por lo tanto, tiene un campo estático, por ejemplo count. Luego, al inicializar cualquier objeto de la clase Bank_Account, necesita incrementar el campo que almacena el número de objetos creados para esta clase, el método que incrementa esta variable estática es estático, ya que es igual para todos los objetos creados para esta clase.

+0

¿Por qué esta respuesta es downvoted? :-(También está diciendo lo que dice la respuesta de 'ck's' pero es el ejemplo de dicho método !! – Himadri

+1

No entiendo tampoco un voto a la baja: me parece que este es un punto vital. Si tiene datos que están a punto todas las instancias o cualquier instancia, en lugar de una instancia en particular, entonces debería ser estático. Por ejemplo, ayer creé una clase en la que necesitaba asignar a cada instancia un ID único. Hacer un contador estático era una manera fácil y lógica de haz esto. – Jay

1

Como ck dijo, pueden ser métodos que tienen algo que ver con el tipo. Es importante recordar que esta será una función de utilidad, que no podrá acceder a ninguna variable miembro en el tipo/clase, ya que se puede invocar directamente sin tener ninguna instancia de la clase. Si intenta definir un método estático que acceda a una variable miembro (o método no estático), en realidad obtendrá un error de compilación.

5

Es útil para crear métodos de fábrica que no son miembros de ningún objeto pero que necesitan acceso a las partes internas de un objeto para inicializarlo.

5

Necesita métodos estáticos en clases no estáticas, es decir, para el patrón de la fábrica (si la clase es una fábrica por sí mismo, como ha señalado Jaco Pretorius):

MyClass newInstance = MyClass.Create(); 

O si desea crear métodos de ayuda. F.e. se podría escribir un FTP-clase que está en pleno funcionamiento, con Connect(), SendCommand(), ReceiveAnswer(), Disconnect() etc., pero que desea permitir al usuario cargar fácilmente un archivo, sin la necesidad de implementar todo el procedimiento:

MyFTPClass.UploadFile("username", "password", "pathToFile"); 
+1

Estoy siendo pedante: tu primera frase es correcta solo si la clase es una fábrica para sí misma. Cuando utilizo el patrón de fábrica generalmente crearé clases de fábrica separadas, ya que hace que las pruebas sean un poco más fáciles. –

3

Sería imposible implementar el patrón Singleton sin poder declarar un método estático (y una variable miembro privada) en una clase no estática.

Ver Singleton

Cuestiones relacionadas