Bienvenidos al curso de C#.

En este primer ejemplo se ha construido una sencilla aplicación de gestión bancaria. Se pueden crear cuentas y añadirle clientes, que pasan a ser titulares de dichas cuentas.
También pueden cancelarse cuentas y bloquearse.

Resulta interesante la clase Cuenta, que representa una cuenta bancaria. Las cuentas bancarias se identifican con 20 dígitos (4 de la entidad, 4 de la sucursal, 2 del dígito de control y 10 del código cuenta cliente):
1) El código de entidad (mEntidad) es el mismo para todas las cuentas del banco, por lo que lo declaramos como static.
2) El dígito de control es un valor calculado, que depende de los otros 18 dígitos, por lo que no lo declaramos como un campo, sino como una "propiedad". Las propiedades son un concepto que existe en C# pero no en Java. Una propiedad viene a ser un método que permite recuperar un valor o asignar un valor, pero que no toma parámetros. Por ejemplo, para recuperar y asignar el código de sucursal de una Cuenta podemos crear o bien estos métodos...

public String getSucursal() { 
	return mSucursal; 
}

public void setSucursal(String s) {
	mSucursal=s;
}

...o bien esta propiedad:

public String sucursal {
	get { return mSucursal; }
	set { mSucursal=value; }
}

En el caso de los métodos, y suponiendo que tenemos una instancia c de clase Cuenta, la forma de uso es: String x=c.getSucursal() o c.setSucursal("1234"). Al usar propiedades, las instrucciones equivalentes son String x=c.sucursal o c.sucursal="1234";

El tipo de la propiedad (String, en el ejemplo) representa tanto el tipo del valor de retorno como el tipo del valor que asignamos. La palabra "value" es una palabra reservada, cuyo tipo es también el del tipo declarado para la propiedad.

Una ventaja importante de usar propiedades frente a métodos es que, en tiempo de desarrollo y pruebas, el depurador muestra el valor de las propiedades, pero no el de los métodos. 

Tanto la parte get como la set de una propiedad pueden constar de muchas líneas de código que hagan, p.ej., cálculos complejos. Como muestra, véase el código de la propiedad "saldo" en Cuenta. Obsérvese también que "saldo" es una propiedad de sólo lectura: tiene get, pero no set. También es interesante la propiedad cancelada: devuelve true si la cuenta tiene una fecha de cancelación, y false en caso contrario. 


Cambiando de tema, la aplicación arranca desde la ventana FMenu, que es un contenedor de formularios. Para esto, hemos puesto su propiedad IsMdiContainer a true. Las instancias de la ventana FCuenta son formularios contenidos en FMenu. Para ello, el constructor de FCuenta toma un parámetro de tipo FMenu que asignamos, en el constructor de FCuenta, a la propiedad MdiParent de Form. Es decir:

		public FCuenta(FMenu padre)   // Las ventanas tipo FCuenta se crean desde un FMenu, que pasamos como parámetro.
		{
			...

			this.MdiParent=padre;	// Le decimos a la ventana tipo FCuenta que esta ventana está contenida en una FMenu.
			...
		}

Además, hemos añadido un campo mCuenta de tipo Cuenta a FCuenta, de manera que este mCuenta representa la cuenta sobre la que se realizan las operaciones desde esta ventana.