2012-03-17 23 views
5

Duplicar posible:
When to Use Static Classes in C#Pautas para cuando usar clases estáticas sobre clases de instancias?

Por favor alguien puede proporcionar directrices, puestos de control estándar en cuando para crear clase estática y cuándo crear la clase de instancia.

Básicamente, muchas veces veo mientras escribo un código que se podría haber hecho lo mismo utilizando clases y métodos estáticos y me confunden muchas cosas.

Hasta ahora yo sé debajo de los puntos de verificación:

  1. Si objeto bajo la consideración puede existe sólo una vez en toda la aplicación, entonces habría sido objeto de "estática"

  2. Si un método no utiliza cualquier variable de campo dentro de ella, entonces puede ser un método estático.

+1

¿Esto ayuda? http://stackoverflow.com/questions/241339/when-to-use-static-classes-in-c-sharp – kendaleiv

+0

He blogueado recientemente sobre este asunto http://www.sapiensworks.com/blog/post/ 2012/03/02/When-To-Use-The-Static-Keyword-In-Net.aspx – MikeSW

Respuesta

1

Las clases estáticas se utilizan mejor para crear bibliotecas de funciones que se llamarán. Las clases regulares se usan para crear objetos que se pueden manipular. Le permite encapsular las relaciones de un solo grupo de código. Tomemos, por ejemplo, un punto en el espacio euclidiano. Puede declarar dos carrozas y hacer un seguimiento de ellas individualmente, o puede usar el siguiente contrato para declarar cómo funciona un punto.

class Point{ 
    float x; 
    float y; 

    Point(float x, float y); 

    Point halfway(Point other); 

    Line lineThrough(Point other); 

    float distanceFrom(Point other); 

    ... 
} 

Esto es un poco redundante, pero que le permite escribir código más legible en el futuro - mantener mejor a todos sus datos encapsulados y bien diseñado, lo que hace un mejor programador, debido a que la ecuación de una recta que pasa por dos puntos va de

float slope = (xone-xtwo)/(yone-ytwo); 
float yintercept = yone-slope*xone; 

a

Point p1 = new Point(xone, yone); 
Point p2 = new Point(xtwo, ytwo); 
Line linethrough = p1.lineThrough(p2); 

sentimos el pseudocódigo es un poco de Java informado. Tengo Java en el cerebro.

17

En mi opinión, el mejor diferenciador es el estado.

Si su clase no tiene estado y es solo una serie de métodos relacionados que, cuando se les da una entrada, le darán un resultado, entonces tiene un candidato excelente para una clase estática.

Si se le dará entrada a su clase y luego la almacena o de alguna otra manera se espera que mantenga su estado actual, entonces tiene una clase normal.

Además, si su clase va a declararse abstract o va a heredar comportamientos de otra clase o implementar comportamientos desde una interfaz, entonces se está alejando de una clase estática y tiene una clase normal.

En resumen:

  • Si se trata de una bolsa de métodos o tiene ningún estado
  • y no es abstracto, heredar o implementar una interfaz

A continuación, tener una buena posibilidad es una clase estática :)

Espero que ayude.

NB (según el astuto comentario a continuación) state se refiere a la clase que almacena algunos datos que representan el estado actual de las cosas para un objeto. Tal vez una variable de nivel de clase o una propiedad.

+1

suena muy bien. a veces es difícil que los novatos conozcan el significado del estado ... digamos campos de clase. por lo que se repite lo mismo: 1.clase que no tiene variables de campo declaradas, 2. la clase debe ser parte de la jerarquía de herencia. son puntos que harán que la clase sea estática. – Dhananjay

+0

Excelente adición, gracias @dnkulkarni. Voy a modificar mi respuesta :) –

+0

Una clase estática puede tener variables estáticas. También es posible que desee hacer una clase estática si no quiere instancias de ella, aunque las clases estáticas con métodos estáticos son fáciles de abusar por los desarrolladores con una mentalidad de procedimiento que ama las variables globales y las funciones globales. – MikeSW

0

si debe ser una colección de funciones, entonces usaría clases estáticas. como:

int result = calculation.add(int p1,int p2); 
float result = calculation.divide(int p1,int p2); 

no se puede decir esto en clases estáticas:

Calculation mycalculator = new Calculation(); 

porque no se pueden crear instancias. Solo pueden contener miembros estáticos.

Tomado de here.

pero si fuera un miembro de un código, como apple en un árbol, usaría clases de instancia. cada manzana tendría sus propias características, pero no cambia el hecho de que es una manzana. y es una parte del árbol que contiene múltiples instancias de la manzana.

Apple apple1 = new Apple(); 
apple1.color = green; 
apple1.age = newborn; 
apple1.fallfromtree(speed); 

Apple apple2 = new Apple(); 
apple2.color = red; 

etc.

Usted puede mirar here.