Ventajas de utilizar métodos estáticos privados
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.
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.
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.
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)