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");
}
}
pello.io