2012-04-05 41 views
13

Me preguntaba cuáles son los beneficios generales (o inconvenientes) de usar una clase no estática con un método estático versus una clase estática con el mismo método estático, distinto de el hecho de que no puedo usar métodos estáticos de una clase no estática como métodos de extensión.Diferencia de nivel bajo: clase no estática con método estático vs. clase estática con método estático

Por ejemplo:

class NonStaticClass 
{ 
    public static string GetData() 
    { 
     return "This was invoked from a non-static class."; 
    } 
} 

Versus esto:

static class StaticClass 
{ 
    public static string GetData() 
    { 
     return "This was invoked from a static class."; 
    } 
} 

¿Cuáles son las implicaciones de rendimiento/memoria de la utilización de un método sobre otro?

NOTA: Supongamos que no necesito crear una instancia de la clase. Mi escenario de caso de uso se limita a algo como esto:

Console.WriteLine(NonStaticClass.GetData()); 
Console.WriteLine(StaticClass.GetData()); 

Respuesta

16

El principal beneficio es que si haces que la clase sea estática, el compilador se asegurará de que tu clase solo tenga miembros estáticos.

De modo que cualquiera que lea el código, verá instantáneamente que no se puede crear una instancia de la clase, y no hay interacción que deba considerarse con ninguna instancia de la clase. Porque no puede haber ninguno.

En el nivel clr, no hay noción de static. Una clase estática es abstract y sealed, lo que evita de forma efectiva la herencia y la creación de instancias.

En cuanto al rendimiento, no veo ninguna posibilidad de que el compilador o el tiempo de ejecución optimicen uno sobre el otro.

En este ejemplo, me concentraría en expresar su intención lo más clara posible a los lectores. Siempre puedes optimizar más tarde.

3

Hay alguna peculiaridad/limitación:

  • no se puede crear una instancia de la clase estática
  • no se puede heredar clase estática

Así que si usted supone un comportamiento de este tipo para su clase (por ejemplo, contenedor de ayuda/utilidades o métodos de extensión), si desea limitar su uso, configúrelo como static.

+0

Revise mi publicación editada para ver una situación de caso de uso: en general, me preguntaba si existe alguna diferencia al usarla sin creación de instancias. –

+0

Actualizó la publicación. –

+4

Además de los puntos que menciona: tampoco puede usar una clase estática como el tipo de una variable local, campo o parámetro formal. No puede usarlo como el tipo de elemento de una matriz. No puede usarlo como un argumento de tipo en una lista de argumentos de tipo genérico. –

2

Repercusiones en el rendimiento: básicamente ninguna.

Puede crear una instancia de NonStaticClass, pero como no tiene métodos de invalidación no estáticos, es tan útil como decir object obj = new object(), lo que quiere decir que es útil para bloquear y eso es todo. Hacer que la clase estética evite que alguien la inicie, pero no es así que dañe.

Es más una forma de auto-documentación de decir que no hay razón para crear una instancia de la clase.

3

No hay beneficios o inconvenientes. Es solo decisión arquitectónica.

Utilice clases únicas estáticas en casos de proporcionar un conjunto de funciones o una función libriary. Como no puede crear una instancia, pero puede usarlo.

MyMathLibrary.Plot(...) 

Este tipos son generalmente implican estado menos comportamiento. Repito, generalmente.

Use clases simples con los miembros estáticos cuando tiene tipo "normal", pero necesita de alguna manera una apátridas método , como por ejemplo:

public class MyType 
{ 
    .... //some members 

    public static MyType ReadFromXml(XmlReader reader) {} 
    public static void SaveToXml(MyType mt) {} 
} 

no hay una bala de plata, es sólo una cuestión de arquitecto elección.

+0

@Dennis Delimarsky: por qué dices "Mi caso de uso se limita a algo así como ...". No lo veo como una * limitación *. Depende de su arquitectura, podría ser * muy buena * opción de diseño, al hacer explícito el comportamiento de su API. – Tigran

+0

Eso es solo una muestra en la que traté de demostrar que no tengo la intención de instanciar realmente la clase. –

Cuestiones relacionadas