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");

		}

}