69 - Métodos estáticos


En C# podemos definir métodos que se crean independientemente a la definición de objetos. Un método estático puede llamarse sin tener que crear un objeto de dicha clase. Un método estático tiene ciertas restricciones:

  • No puede acceder a los atributos de la clase (salvo que sean estáticos)
  • No puede utilizar el operador this, ya que este método se puede llamar sin tener que crear un objeto de la clase.
  • Puede llamar a otro método siempre y cuando sea estático.
  • Un método estático es lo más parecido a lo que son las funciones en los lenguajes estructurados (con la diferencia que se encuentra encapsulado en una clase)

Si recordamos cada vez que creamos un programa en C# debemos especificar el método Main:

   static void Main(string[] args)

El método Main es estático para que el sistema operativo pueda llamarlo directamente sin tener que crear un objeto de la clase que lo contiene.

Problema 1:

Implementar una clase llamada Operacion. Definir dos métodos estáticos que permitan sumar y restar dos valores enteros.

Programa:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace MetodosEstaticos1
{
    class Operacion
    {
        public static int Sumar(int x1, int x2)
        {
            int s = x1+x2;
            return s;
        }

        public static int Restar(int x1,int x2)
        {
            int r = x1 - x2;
            return r;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Console.Write("La suma de 2+4 es ");
            Console.WriteLine(Operacion.Sumar(2, 4));
            Console.Write("La resta de 6-2 es ");
            Console.WriteLine(Operacion.Restar(6, 2));
            Console.ReadKey();
        }
    }
}

Agregamos la palabra clave static antes de indicar el valor que retorna el método:

        public static int Sumar(int x1, int x2)
        {
            int s = x1+x2;
            return s;
        }

Luego cuando llamamos al método estático lo hacemos antecediendo el nombre de la clase:

            Console.Write("La suma de 2+4 es ");
            Console.WriteLine(Operacion.Sumar(2, 4));
            Console.Write("La resta de 6-2 es ");
            Console.WriteLine(Operacion.Restar(6, 2));

Es importante notar que no se crean objetos de la clase Operacion para poder llamar a los métodos Sumar y Restar.

Problema propuesto

  1. Plantear una clase llamada VectorEnteros que defina tres métodos estáticos. El primero retorna el mayor elemento del vector (el vector llega como parámetro), el segundo el menor elemento y el tercero la suma de sus componentes.
Solución
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace MetodosEstaticos2
{
    class VectorEnteros
    {
        public static int Mayor(int[] vec)
        {
            int may = vec[0];
            for (int x = 0; x < vec.Length; x++)
            {
                if (vec[x] > may)
                {
                    may = vec[x];
                }
            }
            return may;
        }

        public static int Menor(int[] vec)
        {
            int men = vec[0];
            for (int x = 0; x < vec.Length; x++)
            {
                if (vec[x] < men)
                {
                    men = vec[x];
                }
            }
            return men;
        }

        public static int SumaElementos(int[] vec)
        {
            int suma = 0;
            for (int x = 0; x < vec.Length; x++)
            {
                suma = suma + vec[x];
            }
            return suma;
        }

        public static void Imprimir(int[] vec)
        {
            Console.Write("Impresión del vector:");
            for (int x = 0; x < vec.Length; x++)
            {
                Console.Write(vec[x] + " "); ;
            }
            Console.WriteLine();
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            int[] v = { 5, 6, 20 };
            VectorEnteros.Imprimir(v);
            Console.WriteLine("El mayor elemento del vector es :" + VectorEnteros.Mayor(v));
            Console.WriteLine("El menor elemento del vector es :" + VectorEnteros.Menor(v));
            Console.Write("La suma de los elementos del vector es :" + VectorEnteros.SumaElementos(v));
            Console.ReadKey();
        }
    }
}

Retornar