User avatar by pello in January 1, 1970, 1:00 am
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 |  1160 reads
0 of 0
make a comment
Comments
#1  user avatar Cloaked Anonymous says:
propiedades
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:
 class A:   def __init__(self):      self.numero = 5   #... 
código externo:
 a = A() print a.numero a.numero = 50 
Si el día de mañana necesito protegerlo por hilos o lo que sea, hago:
 class A:   def __init__(self):     self.__numero = 5   def __getNumero(self):     return self.__numero   def __setNumero(self,valor):     self.__numero = valor   numero = property(__getNumero,__setNumero) 
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"?
+-0 of 0
in January 1, 1970, 1:01 am
#2  user avatar Cloaked Anonymous says:
Mas halla
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
+-0 of 0
in January 1, 1970, 1:01 am





Read and insert this