C# día 06: métodos
Este día a merecido la pena y a los que no conozcan este lenguaje les sugiero echar un ojo al código ya que en los tipos de métodos ya se ve alguna peculiaridad de c# (respecto a java o c).
Veamos algunos ejemplos de metodo a través de la clase Pajaro:
using System; // Definimos la clase pajaro, esa cosa con pluma public class Pajaro { // ATENCION: SI NO SE ESPECIFICA NADA, // los atributos y metodos NO SON accesibles public string nombre; public int peso; // Variable estatica, COMPARTIDA POR TODAS LAS INSTANCIAS static int cuantosPajaros = 0; // Constructora: siempre con el mismo nombre que la clase public Pajaro () { this.peso = 12; cuantosPajaros++; } // canta // Hace que el pajarito cante public void canta () { System.Console.WriteLine("Pio, Pio, Pio"); } // vuela // Hace que el pajarito cante public void vuela (int metros) { // Si el pajarito vuela 100 metros // adelgaza un poco. if (metros > 100) { // Estas dos formas de acceso son equivalentes // para atributos publicos //this.peso--; peso--; } } // damePeso // Devuelve el peso del pajaro public int damePeso() { return peso; } // Devuelve el numero de pajaros // que hay instanciados. Al ser un metodo static // esta vinculado a la clase y puede invocarse sin crear instancia public static int cuantosPajarosHay () { return cuantosPajaros; } // Funcion principal para probar public static void Main() { Pajaro loco = new Pajaro(); Pajaro bobo = new Pajaro(); Pajaro verder = new Pajaro(); System.Console.WriteLine("Pajaro creado..."); // que cante loco.canta(); // que vuele loco.vuela(101); System.Console.WriteLine("Ahora cuanto pesa {0}", loco.damePeso()); // Invocamos el método estático System.Console.WriteLine("Cuantas instancias hay: {0}", cuantosPajarosHay()); } }Ahora veamos algunas formas de pasar parámetros, atención al tipo out.
using System; // Clase para ver los distintos tipos de Parametros // que se pueden pasar a los Parametros: por valor, por referencia y los out public class Parametros { // Metodo constructor public Parametros() { } // porValor // Metodo que muestra el paso de parametros por valor public void porValor(int a, string b) { a = 665; b = "Que paaasa"; } // porReferencia // Metodo que muestra el paso de parametros por referencia public void porReferencia(ref int a, ref string b) { a = 666; b = "Ahora sí"; } // porOut // Metodo que muestra el paso de parametros out // Estos solo sirven para guardar resultado public void porOut(int a, string b, out int A, out string B) { A = 666 * a; // Concatenamos con + B = b + "? Ahora solo cambia la out"; } // Método principal public static void Main() { Parametros parametros = new Parametros(); int x; string y; int a = 0; string b = "Todo sigue igual"; System.Console.WriteLine("Vamos a probar los métodos"); // Paso por valor parametros.porValor(a, b); System.Console.WriteLine("Valores, de a: {0} y b:{1}", a, b); // Paso por referencia: debemos usar la palabra ref parametros.porReferencia(ref a, ref b); System.Console.WriteLine("Valores, de a: {0} y b:{1}", a, b); // Paso por out: debemos usar la palabra out parametros.porOut(a, b, out x, out y); System.Console.WriteLine("Valores, de a:{0}, b:{1}, x:{2}, y:{3}", a, b, x, y); } }Por último veremos distintos metodos constructores y destructores, con especial atención al constructor estático.
using System; // Clase para ver los distintos tipos de Metodos // que puede tener la clase: // Constructores // accessors: set y get para manejar atributos // Destructores public class Metodos { int numero; string cadena; static int instancias; // Metodo constructor // Puede ser simple o tener parametros // para inicializar atributos public Metodos() { instancias++; } // Metodo constructor estatico // Este se invoca UNA UNICA VEZ antes de crear la instancia // es decir, aunque hagamos 100 instancias solo se ejecutará una vez // Puede venir bien para inicializaciones o para patrones singleton static Metodos() { instancias = 0; System.Console.WriteLine("Empezamos a usar la clase Metodo"); } // Metodo constructor // Puede ser simple o tener parametros // para inicializar atributos public Metodos(int x, string y) { instancias++; numero = x; cadena = y; } // Metodo DESTRUCTOR // al estilo c++, se usa el mismo nombre que la clase // Se invoca automaticamente ~Metodos() { instancias--; System.Console.WriteLine("Destroy! Quedan {0} instancias", instancias); } // Metodos SET Y GET // Es una costumbre de las clases, más allá del lenguaje // en el que se implementen. Se usan para manejar los atributos de la clase // sin acceder a ellos directamente. Hay entornos que los generan automáticamente // get Numero public int getNumero() { return numero; } // setNumero public void setNumero (int nuevo) { numero = nuevo; } // getCadena public string getCadena() { return cadena; } // setCadena public void setCadena (string nueva) { cadena = nueva; } // Método principal public static void Main() { Metodos metodos = new Metodos(); Metodos otrosMetodos = new Metodos(666, "Share your software"); Metodos masMetodos = new Metodos(29, "¿Cómo estan ustedes?"); int x = 47; string y = "Como hemos cambiado"; System.Console.WriteLine("Vamos a probar los métodos"); // Cambiamos la cadena del objeto metodos metodos.setCadena(y); // Cambiamos el numero del objeto masMetodos masMetodos.setNumero(x); // Veamos los resultados System.Console.WriteLine("metodos, cadena:{0} y numero:{1}", metodos.getCadena(), metodos.getNumero()); System.Console.WriteLine("otrosMetodos, cadena:{0} y numero:{1}", otrosMetodos.getCadena(), otrosMetodos.getNumero()); System.Console.WriteLine("masMetodos, cadena:{0} y numero:{1}", masMetodos.getCadena(), masMetodos.getNumero()); // Nos vamos, observar mensajes del metodo destructor de cada objeto System.Console.WriteLine("Vamos vamos que nos vamos"); } }