Vamos a ver que se puede hacer con la entrada y salida standar de consola. Hay opciones muy interesantes con los formatos numéricos, el manejo de fechas y las conversiones. Vamos que se puede hacer con el WriteLine
/**
* Formato.cs
* Esta clase muestra los distintos formatos que se pueden aplicar
* a la hora de mostrar datos por pantalla o por un flujo de salida.
*/

using System;

// Clase Formato
// contiene métodos en los que se muestran técnicas de formato
public class Formato
{
	// Enumeración que usaremos más adelante
	enum Evangelistas
	{
		Mateo, Marcos, Stallman, Stevens
	}

	// Constructor
	public Formato ()
	{
	}

	// Formatos numericos
	// En los WriteLine("valor {0}", var)
	// se puede usar alg así {0:#}, donde '#' marca los digitos
	public void numericos()
	{
		double PI = 3.14159265;
		int pi = 3141592;
		int bestia = 66666;

		System.Console.WriteLine("Pi es {0}", PI);
		// Mostramos numeros de coma flotante con distinto numero de decimales
		System.Console.WriteLine("Pi es {0:#.##} o {0:#.####}", PI);
		// poniendo C (currency) sale como moneda, y con d o D: decimales
		System.Console.WriteLine("Pi es en moneda {0:C} {0:d}", pi);

		// Podemos usar la funcion toString, aplicable a cualquier variable
		string valor = bestia.ToString("C");

		// También podemos formatear sobre el string
		string formateado = string.Format("La bestia {0:C1}	{0:d2}", bestia);

		System.Console.WriteLine("{0}", formateado);

		// Posibilidades
		// C : currency o moneda
		// D o d : decimales
		// F o f : fixed point
		// E o e : exponencial
		// N o n : numerico
		// X o x : hexadecimal, 31337'5 choice
		// G o g : general
		// R o r : roundtrip, para mantener precisión despues de conversiones
		// Opciones: , (comas) . (puntos) # (cifras) 0 (relleno de 0)
		//           % (porcentajes)  (escape para caracteres) 'abc' (texto)
		// ejemplo: {0:##.##%}

		System.Console.WriteLine("A ver {0:##.#%} y {0:'Valor: '###}", bestia);

		// NEGATIVOS: se puede poner un formato específico para negativos o positivos
		// la forma es así {0:formato_pos;formato_neg;cero}
		// Por ejemplo {0:d2:d4:'0'}
		System.Console.WriteLine("Valor {0:#.##;g2;'0'}", PI);

	}


	// Formato de fechas
	public void fechas ()
	{
			// Para empezar sacamos la fecha actual
			DateTime fecha = DateTime.Now;

			// De la fecha podemos sacar el dato que nos interese
			// fecha.Date, fecha.Month, fecha.Day, fecha.Year, fecha.Hour, fecha.Minute
			// ...
			System.Console.WriteLine("La date: {0}", fecha.Date);

			// También se pueden usar modificadores de formato
			// para sacar la fecha a nuestro gusto
			// d, D, f, F, g, G, M, m, R, s, t , T,u , U, Y, y
			System.Console.WriteLine("Hoy es {0:d}
 o {0:F}", fecha);
	}

	// Enumeraciones: también tienen distinta forma de mostrarse
	// gracias a los formatos
	public void enumeraciones ()
	{


		Evangelistas melenudo = Evangelistas.Stallman;
		Evangelistas apostol = Evangelistas.Marcos;

		// Vamos a ver que formato se le puede dar
		// D o d: valor numérico de la enumeración
		// G o g: valor de cadena
		// X o x: hexadecimal del numérico
		System.Console.WriteLine("Evangelista {0:d} {0:G} {1:x}", melenudo, apostol);
	}


	// Metodo principal
	public static void Main ()
	{
		Formato formato = new Formato();

		formato.numericos();
		formato.fechas();
		formato.enumeraciones();
	}

}
¿Y qué se puede hacer con las cadenas?
/**
* Cadenas.cs
* clase para ver que podemos hacer con las cadenas
* IMPORTANTE: por lo visto no se puede modificar una variable String
* C# lo que hace es crear otro String para modificar uno existente,
* cosa que seguramente se notará en el rendimiento de c# respecto a
* otros lenguajes, vamos digo yo.
*/

using System;
using System.Text; // Para el StringBuilder

// Clase que muestra el uso de cadenas
public class Cadenas
{

	// Método principal
	public static void Main ()
	{
		string cadena = "  Que cadena tan interesante    ";
		string separame = "un:día:vi:una:vaca:vestida:de:uniforme";

		// Formateador de strings especial @, gracias c0der.
		// Se toma literalmente lo que le pases
		System.Console.WriteLine(@"""Cómo  mola el editor  se vuelve loco""");

		// Funciones para string, tenemos las miticas de siempre, ver API
		// Concat, Copy, Equals, Clone, IndexOf, LastIndexOf
		// Split vs Join,StartsWith, Substring, ToLower, ToUpper, Replace,..
		System.Console.WriteLine("Hazme un trim [{0}]", cadena.Trim());
		System.Console.WriteLine("Tamaño:{0}", cadena.Length);

		// Vamos a probar el Split que siempre viene bien
		string[] cadenitas = separame.Split(':');

		foreach (string item in cadenitas)
		{
			System.Console.WriteLine("Toma {0}",item);
		}

		// Y el paso contrario: Join
		string unelos = string.Join(":", cadenitas);

		System.Console.WriteLine("Unidos de nuevo {0}", unelos);

		// Para crear una cadena y poder modificarla
		// La debemos crear como StringBuilder
		StringBuilder superCadena = new StringBuilder("Inicio");

		System.Console.WriteLine("Al principio: {0}", superCadena);

		// Ahora le metemos más texto
		superCadena.Append(", pero ahora más.");
		System.Console.WriteLine("y luego: {0}", superCadena);

		// Ahora se lo insertamos a partir de la posición 7
		superCadena.Insert(7, "a que ha cambiado?");
		System.Console.WriteLine("y ya: {0}", superCadena);

	}
}
Y con la entrada standar recogemos caracteres o variables de cualquier tipo. Con la función Convert podemos hacer las conversiones que hagan falta:
/**
* EntradaDatos.cs
* Clase que muestra el uso de la entrada de datos
* por el std input.
*/

using System;

public class Entrada
{

	// Método estático para usar desde Main
	// sin crear instancias
	public static void leeEntrada()
	{
		double coma = 0.00;
		string entrada = "";

		// ReadLine: para leer variables mas largas de un caracter
		// debemo usar ReadLine. Esto se guarda en un String y después
		// debemos convertir ese valor con la función Convert
		try
		{
			System.Console.WriteLine("Mete un número de coma flotante");
			entrada = System.Console.ReadLine();
			coma = Convert.ToDouble(entrada);
			System.Console.WriteLine("Has metido: {0}", coma);
		}
		catch (Exception e)
		{
			System.Console.WriteLine("Cascó alguna conversión {0}", e);
		}

		// CONVERSIONES DISPONIBLES
		// ToBoolean, Tobyte, ToChar, ToDateTime, ToDecimal
		// ToDouble, ToInt16, ToInt32, ToInt64, ToString, ToUInt16, ToUInt32, ToUInt64
	}

	// Método principal
	public static void Main ()
	{
		char caracter = ' ';
		int valor = 0;

		// Probamos la función leeEntrada
		leeEntrada();

		// Con el método Read a secas solo se lee un caracter
		System.Console.WriteLine("Mete caracteres y luego algún x");
		// Por ejemplo, esto lee hasta que metas x
		while ( (valor = System.Console.Read())!= 'x')
		{
			// Hacemos conversión a caracter
			caracter = (char) valor;
			System.Console.Write("{0}", caracter);
		}

	}
}