Ventajas de utilizar métodos estáticos privados

Resuelto NerdFury asked hace 16 años • 8 respuestas

Al crear una clase que tiene métodos privados internos, generalmente para reducir la duplicación de código, que no requieren el uso de ningún campo de instancia, ¿existen ventajas de rendimiento o memoria al declarar el método como estático?

Ejemplo:

foreach (XmlElement element in xmlDoc.DocumentElement.SelectNodes("sample"))
{
    string first = GetInnerXml(element, ".//first");
    string second = GetInnerXml(element, ".//second");
    string third = GetInnerXml(element, ".//third");
}

...

private static string GetInnerXml(XmlElement element, string nodeName)
{
    return GetInnerXml(element, nodeName, null);
}

private static string GetInnerXml(XmlElement element, string nodeName, string defaultValue)
{
    XmlNode node = element.SelectSingleNode(nodeName);
    return node == null ? defaultValue : node.InnerXml;
}

¿Hay alguna ventaja en declarar los métodos GetInnerXml() como estáticos? No hay respuestas de opinión por favor, tengo una opinión.

NerdFury avatar Sep 26 '08 01:09 NerdFury
Aceptado

Desde la página de reglas de FxCop en esto:

Después de marcar los métodos como estáticos, el compilador emitirá sitios de llamadas no virtuales a estos miembros. La emisión de sitios de llamadas no virtuales evitará una verificación en tiempo de ejecución para cada llamada que garantice que el puntero del objeto actual no sea nulo. Esto puede dar como resultado una ganancia de rendimiento mensurable para código sensible al rendimiento. En algunos casos, la falla al acceder a la instancia del objeto actual representa un problema de corrección.

Scott Dorman avatar Sep 25 '2008 18:09 Scott Dorman

Cuando escribo una clase, la mayoría de los métodos se dividen en dos categorías:

  • Métodos que usan/cambian el estado de la instancia actual.
  • Métodos auxiliares que no usan/cambian el estado del objeto actual, pero me ayudan a calcular los valores que necesito en otros lugares.

Los métodos estáticos son útiles, porque con solo mirar su firma, sabes que la llamada no utiliza ni modifica el estado de la instancia actual.

Tome este ejemplo:

biblioteca de clase pública
{
    Libro estático privado findBook (Lista de libros <Libro>, título de cadena)
    {
        // el código va aquí
    }
}

Si alguna vez se estropea una instancia del estado de la biblioteca y estoy tratando de descubrir por qué, puedo descartar a findBook como el culpable, solo por su firma.

Intento comunicarme tanto como puedo con la firma de un método o función, y esta es una excelente manera de hacerlo.

Neil avatar Nov 07 '2008 17:11 Neil

Una llamada a un método estático genera una instrucción de llamada en lenguaje intermedio de Microsoft (MSIL), mientras que una llamada a un método de instancia genera una instrucción callvirt, que también busca referencias a objetos nulos. Sin embargo, la mayoría de las veces la diferencia de rendimiento entre ambos no es significativa.

Fuente: MSDN - https://learn.microsoft.com/en-us/previous-versions/visualstudio/visual-studio-2012/79b3xss3(v=vs.110)

Marek Takac avatar Sep 04 '2012 10:09 Marek Takac