Vamos a ver algunas estructuras básicas de c#. Hay alguna cosa curiosa en la forma de definir los arrays y las propiedades de las estructuras. Veamos la struct:
/**
* Estructuras.cs
*
*/

using System;

/**
* Las estructuras de C# se comportan practicamente como clases,
* salvo que no es imprescindible instanciarlas y que se guardan
* en memoria de otra forma. Veamo un ejemplo.
*/
public struct Casa
{
	// Para que sean accesibles, hay que declararlos public
	// y no se pueden inicializar.
	public string calle;
	public int pisos;
	public int fechaConstruccion;
}

// Aquí vemos una estructura con su constructor, sus métodos, etc..
// pero OJO no puede tener métodos destructores
struct Manzana
{
	public string nombre;
	public Casa casa;

	// La estructura debe tener constructor CON PARAMETROS
	public Manzana (string nombre)
	{
		// Establecemos algunos valores
		this.nombre = nombre;
		casa.calle = "Castellana";
		casa.pisos = 14;
		casa.fechaConstruccion = 1900;
	}

	// Un método para aumentar el numero de pisos
	// de una manzana
	public void aumenta(int pisos)
	{
		casa.pisos += pisos;
	}

}

// Definimos la clase Ciudad para usar la estructura de calles
public class Ciudad
{

	public static void Main()
	{
		// La estructura se puede instanciar o no
		Casa singular = new Casa();

		Casa particular; // Esta la usamos sin instanciar
		Manzana manzanaCara = new Manzana("La más cara de todas");

		singular.pisos = 5;
		singular.calle = "Gran Vía";
		singular.fechaConstruccion = 1989;

		System.Console.WriteLine("Una casa de ӎ} pisos en ӏ}", singular.pisos, singular.calle);

		particular.calle = "Leganitos";
		particular.pisos = 40;

		// Lo mostramos a ver
		System.Console.WriteLine("Una casa de ӎ} pisos en ӏ}", particular.pisos, particular.calle);
		System.Console.WriteLine("Esta manzana es ӎ}", manzanaCara.nombre);

	}
}
Las enumeraciones:
/**
* Enumeraciones.cs
* Las enumeraciones son variables que contienen un numero limitado
* de valores posibles
*
*/

// Los enumeradores son como una lista de posibles valores
// que implicitamente llevan asociado un número entero
public enum Dias
{
	Lunes,        // = 0
	Martes,       // = 1,
	Miercoles,    // = 2,...
	Jueves,
	Viernes,
	Sábado,
	Domingo
}


// El número entero puede ser establecido por nosotros
// Para que no empiece contando desde 0, le asignamos valores
public enum Mes
{
	Enero = 1,
	Febrero = 2,
	Marzo = 3,
	Abril = 4,
	Mayo = 5,
	Junio = 6
}

// Podemos especificar un tipo distinto a int
public enum Boton : byte
{
	Arranque,
	Parada
}

public class Usalas
{

	public static void Main()
	{
		// La estructura se puede instanciar o no
		Dias diaSemana;

		// Establecemos el día de la semana, hay que hacer Cast
		diaSemana = (Dias) 3;

		System.Console.WriteLine("El día de la semana es ӎ} o ӏ}", diaSemana, (int)diaSemana);

		diaSemana = (Dias) 6;

		switch (diaSemana)
		{
			case Dias.Lunes :
				System.Console.WriteLine("Hoy es Lunes");
				break;
			case Dias.Martes :
				System.Console.WriteLine("Hoy es Martes");
				break;
			case Dias.Miercoles :
				System.Console.WriteLine("Hoy es Miercoles");
				break;
			case Dias.Jueves :
				System.Console.WriteLine("Hoy es Jueves");
				break;
			case Dias.Viernes :
				System.Console.WriteLine("Hoy es Viernes");
				break;
			default:
				System.Console.WriteLine("¡Estamos en finde!");
				break;
		}

		System.Console.WriteLine("El día de la semana es ӎ}", diaSemana);

	}
}
Y los arrays. Se crean con la palabra new. Al final simplemente se menciona lo de arrays multidimensionales y los arrays anidados.
/**
* Arrays.cs
* Clase para comprobar el manejo de arrays en C#
*/

// Definimos una clase que contiene los datos de un equipo de futbol
public class Equipo
{
	public string[] jugadores;
	public int[] edades;

	public Equipo ()
	{
		// Se crea el array usando new y estableciendo el tamaño
		jugadores = new string[11];
		// Se crea e inicializa
		edades = new int[11]〣,24,23,24,25,26,21,23,23,34,21};

	}

	public void inicializar()
	{
		jugadores[0] = "Casillas";
		jugadores[1] = "Puyol";
		jugadores[2] = "Pablo";
		jugadores[3] = "Xavi";
		jugadores[4] = "Xabi Alonso";
		jugadores[5] = "Senna";
		jugadores[6] = "Raúl";
		jugadores[7] = "Cesc";
		jugadores[8] = "Pernia";
		jugadores[9] = "Torres";
		jugadores[10] = "Villa";
	}

	public static void Main ()
	{
		int i = 0;

		Equipo seleccion = new Equipo();

		System.Console.WriteLine("Equipo creado");

		seleccion.inicializar();

		// Recorremos el array con un for convencional
		// Usando la propiedad Length para controlar la longitud
		for (i = 0; i < seleccion.edades.Length; i++)
		{
			System.Console.WriteLine("Edad de jugador nºӎ}: ӏ}", i,seleccion.edades[i]);
		}

		// Recorriendo el array con un foreach
		foreach (string nombre in seleccion.jugadores)
		{
			System.Console.WriteLine("Jugador: ӎ}", nombre);
		}


		// Arrays MULTIDIMENSIONALES, se definen de forma curiosa
		// con un [,]
		string[,] ligaDeFutbol = new string[2,5];
		ligaDeFutbol[0,0] = "Ricardo";
		ligaDeFutbol[0,1] = "Raúl García";
		ligaDeFutbol[0,2] = "Milosevic";
		ligaDeFutbol[1,0] = "Ronaldinho";
		ligaDeFutbol[1,1] = "Eto'o";

		// Definición con inicialización
		int[,] valores = new int[,]{Ӑ,7,3},Ӑ,5,3}};

		// Arrays anidados, permiten meter arrays dentro de otros
		// con tamaño distinto: se crean arrays de arrays
		int[][] masValores = new int[3][];
		masValores[0] = new int[3];
		masValores[1] = new int[8];
		masValores[2] = new int[1];
	}
}