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");
}
}
2 comments |
PELMAlink |
Felicidades otra vez por el 21-dÃÂas este, muchas gracias por hacerlo :-) Lo único, chorrada: "más hallá del lenguaje" 0:-) Luego, en plan regla de estilo, los métodos en C# (y .NET en general) no suelen siempre declararse con la primera letra mayúscula? Y por último, lo de get y set, tampoco es tan independiente del lenguaje, no? Si el lenguaje soporta propiedades, como el caso de Python, o lenguajes basados en el CIL como C#, en principio no haces un get y set, sino eso: Mi código: código externo: Si el dÃÂa de mañana necesito protegerlo por hilos o lo que sea, hago: y tienes la protección que necesitas (si la necesitas) manteniendo el código externo compatible. En C# es igual, con la única diferencia de que si haces eso en una librerÃÂa, el código que dependa tiene que ser recompilado (pero eso, la compilación no va a dar errores ni va a hacer "nada raro"). SÃÂ, supongo que propiedades das más tarde, pero en cualquier caso, eso, ¿get y set en C# no "sobran"?
Joder vaya centro-chut al diccionario, te aseguro que ha sido despiste ya que por aquella revista llamada "más allá" sabÃÂa cómo se escribÃÂa. No se que me habrá pasado. Lo de escribir los nombres de métodos con la primera en minuscula quizá sea manÃÂa heredada de Java, al igual que los set/get. Sobre si ponerlos o no, depende de lo talibán que tenga el dÃÂa; en la facul también nos machacaban con que habÃÂa que proteger los atributos ;) Pello Xabier Altadill Izura