¿Qué son las funciones estáticas y cuando las uso?

Para los usuarios más avanzados esta pregunta puede parecer bastante obvia, pero cuando no tienes muy claro qué son las funciones marcadas con static y buscas información al respecto, te das cuenta de que para la mayoría de tutoriales en general es tan obvio que te quedas igual cuando te lo explican.

Por tanto, yo voy a intentar explicarlo tan mascado como me hubiera gustado que me lo explicaran a mí.

Cuando marcas una función como estática no hace falta que instancies su clase para acceder a ella . Bueno, ahora en serio, vamos con los ejemplo .

claseOperaciones.cs
    public class claseOperaciones
    {
       public int Suma1(int x, int y)
       {
          return x + y;
       }
   
       public static int Suma2(int x, int y)
       {
          return x + y;
       }
    }


Ambas funciones de claseOperaciones hacen exactamente lo mismo, sin embargo, uno es estática y la otra no. Veamos como usamos cada una de ellas:

ejemploUso.aspx.cs
    int x = 2, y = 5;
   
    // Ejemplo de uso de la función NO estática
    claseOperaciones opera = new claseOperaciones();
    int total1 = opera.Suma1(x, y);

    // Ejemplo de uso de la función estática
    int total2 = claseOperaciones.Suma(x, y);


Ahora cobra sentido la frase en que se decía que para usar una función no estática hay que instanciar primero la clase (claseOperaciones opera = new claseOperaciones();) para poder usar la función (int total1 = opera.Suma1(x, y);), mientras que para usar la función estática basta con int total2 = claseOperaciones.Suma(x, y);, donde la clase no se instancia.

¿Cuando usar funciones estáticas y en qué caso? Pues depende mucho de la funcionalidad que se le vaya a dar. Por ejemplo, en el caso de la suma de la que estamos hablando, yo utilizaría funciones estáticas, pues no me aporta nada inicializar la clase. Simplemente quiero usar una función que está almacenada en la claseOperaciones.

Un caso en que no utilizaría funciones estáticas sería en la típica clase "person" que tanto les gusta dar como ejemplo a los americanos en la que se calcula la edad de esa persona, su sueldo, se devuelve el nombre y apellidos juntos y muchas otras cosas:

Person.cs
    class Person
    {
        private string myName ="N/A";
        private int myAge = 0;

        public string Name
        {
            get
            {
                return myName;
            }
            set
            {
                myName = value;
            }
        }

        public int Age
        {
            get
            {
                return myAge;
            }
            set
            {
            myAge = value;
            }
        }

        public string NombreYEdad()
        {
            return "Name = " + Name + ", Age = " + Age;
        }

        public Person()
        { }

       public Person(string Nombre, int Edad)
       {
          this.Name = Nombre;
          this.Edad = Edad;
       }


Como vemos, se instancia la clase con un nombre y una edad para la persona, y después utilizamos esos datos para recoger una frase con el nombre y la edad. Ahora ya no es un simple contenedor de funciones, sino que se interactúa con propiedaes que hemos inicializado, de modo que no ha lugar una función estática.

Espero que os haya aclarado un poco las ideas!!