Csharp
Csharp
int i, j;
// un sentencia simple
i=1;
// un bloque de sentencias
{
j=2;
i=i+j;
}
Sentencias en C# II
if, sirve para saltar en base a una condición:
using System;
class Persona {
// campos
string apellido1, nombre; // private string apellido1, nombre;
int edad;
// constructor
public Persona(string apellido1, string nombre, int edad) {
this.apellido1 = apellido1;
this.nombre = nombre;
this.edad = edad;
}
// método
public void VerNombre() {
Console.WriteLine(this.nombre + " " + this.apellido1);
}
Clases y estructuras II
public int Edad {
get { return edad; }
set { edad = value; }
}
public string Apellido1 {
get { return apellido1; }
}
}
class Test {
public static void Main() {
Persona p = new Persona("Diego", "Ipiña", 29);
p.VerNombre();
Console.WriteLine("La edad es " + p.Edad);
Console.WriteLine("El apellido es " + p.Apellido1);
p.Edad = 30;
Console.WriteLine("La edad es ahora " + p.Edad);
}
}
Clases y estructuras III
Definimos una clase usando la palabra clave class seguida del nombre de
la clase y el cuerpo de la clase entre { y }
Los miembros que una clase puede contener son:
Campos
Métodos
Propiedades
El constructor (Persona()) tiene el mismo nombre que la clase y no
devuelve ningún valor
La palabra clave this se usa para referenciar a la instancia de la clase actual
C# soporta punteros cuando funciona en modo inseguro, se usa la palabra
clave unsafe para preceder a este tipo de datos
Propiedades
C# provee propiedades para recuperar (get) y modificar (set) campos de
una clase:
public int Height {
get { return height; }
set {
if (value > 0)
height = value;
else
throw new ArgumentOutOfRangeException(“Altura debe ser
1 o mayor”); }
}
Dentro de un atributo set C# provee la variable value
Tanto los campos, como atributos y métodos pueden ir acompañados de
modificadores (public). Si se omite un modificador entonces los miembros
son privados
La convención es hacer que miembros privados empiecen por minúscula, mientras
que todos los demás lo hagan por mayúscula
Clases y estructuras
Un miembro static puede ser accedido sin crear una instancia de una clase (se
suelen usar para guardar valores globales)
class Persona {
public static int MinimumAge = 18;
…
}
int age = Persona.MinimumAge; // accedemos a MinimumAge usando nombre
clase
Las clases se pueden anidar:
class C1 {
int i, j; string s;
void m() { // … }
class c2 {
// …
}
}
Clases y estructuras
Se pueden crear clases ligeras usando una estructura (struct)
Las estructuras son tipos por valor y se guardan en la pila
Más eficientes, no requieren referencias y no hay garbage collection
struct Point {
public int X, Y;
public Point(int x, int y) {
X = x;
Y = y;
}
}
…
}
Herencia I
C# nos permite diseñar una clase que usa herencia para extender otra ya
existente
C# como Java sólo soporta herencia simple
Ejemplo herencia simple:
using System;
class Persona {
protected string nombre, apellido1;
public Persona(string nombre, string apellido1) {
this.nombre = nombre;
this.apellido1 = apellido1;
}
public void Saludar() {
Console.WriteLine("¡Hola " + this.nombre + " " +
this.apellido1 + "!");
}
}
Herencia II
class Hombre: Persona {
public Hombre(string nombre, string apellido1):
base(nombre, apellido1) {}
public new void Saludar() {
Console.WriteLine("¡Hola " + this.apellido1 + "!");
}
}
class Test {
public static void Main() {
Persona p = new Persona("Diego", "Ipiña");
p.Saludar(); // Visualizar ¡Hola Diego Ipiña!
Hombre h = new Hombre("Jon", "Altuna");
h.Saludar(); // Visualizar ¡Hola Altuna!
}
}
Herencia III
La herencia representa una relación is-a
Al cambiar la accesibilidad de los campos nombre y apellido a protected,
ahora son accesibles en las clases que los derivan
class Hombre: Persona {
…
}
La única diferencia entre Hombre y Persona es la implementación del método
Saludar.
La palabra clave base se usa para referenciar al objeto padre
La palabra clave new indica al compilador que queremos sobre-escribir el
método Saludar del padre (Persona).
Métodos virtuales I
Una de las ventajas de la herencia que podemos usar una clase base para
referenciar a una instancia de una clase derivada
using System;
public delegate void Callback(string name);
public class DelgHola {
public static void Main(string[] args) {
string nombre = "Amigo";
if (args.Length > 0) nombre = args[0];
Callback cb = new Callback(diHola);
cb(nombre);
}
private static void diHola(string nombre) {
Console.WriteLine("Hola, {0}", nombre);
}
}
Delegates y Eventos II
Toda aplicación gráfica usa eventos para notificar cambios (botón pulsado)
Los eventos son manejados por un manejador de eventos
Se pueden crear manejadores propios o usar los provistos por FCL como
System.EventHandler
Vamos a crear un reloj usando la clase System.Timers.Timer y el
delegate System.Timers.ElapsedEventHandler
El objeto Reloj creará un objeto System.Timers.Timer y registrará un
manejador de evento para el evento Timer.Elapsed
El operador += se usa para añadir una instancia del delegate al evento, se pueden
añadir varios manejadores de eventos porque ElapsedEventHandler es un delegate
multicast.
Delegates y Eventos II
using System.Timers;
using System;
using System.Threading;
public class ThreadReloj {
public static void Main() {
// crear delegate del thread
ThreadStart relojThread = new ThreadStart(empiezaReloj);
Thread t = new Thread(relojThread);
Console.WriteLine("empezando el thread …");
t.Start();
t.Join();
Console.WriteLine("thread parado");
}
Threading II
private static void empiezaReloj() {
int timeElapsed = 0;
Console.WriteLine("ejecutando nuevo thread …");
for (int i=0; i<5; i++) {
Thread.Sleep(1000);
Console.WriteLine("Tic: " + (++timeElapsed));
}
}
}