Vous êtes sur la page 1sur 118

Gua Visual C# 2010

Generalidades OOP, ver VB 2010.


Sobre WPF, ver WPF 2010.

A. P. Visual C# 2010 v.1


Indice

Lenguaje C# 2010 Tipos Entradas/Salidas


Ensamblados Arrays Ficheros
Compilacin Operadores Decisiones y bucles
Programas en C# Clases Excepciones
Herencia Preprocesamiento
Genricos Atributos
Interfaces Reflexin
Enumeraciones C# y Windows Forms
Estructuras C# y WPF
Delegados
Eventos
Timers

A. P. Visual C# 2010 v.1 2


Indice

Lenguaje C # 2010 [C # 4.0]

C# es un lenguaje de propsito general, seguridad de tipos, y orientado a objetos.


En C# todo son objetos, con sus propiedades y mtodos.
C# tiene sistema de tipos unificado, derivando todos los tipos de System.Object.
C# fu diseado por Microsoft para trabajar junto con .NET Framework.
Gestin de memoria, con el recolector de basura.
C# es case sensitive.
C# es un lenguaje strongly typed.
El aspecto formal del cdigo C# es similar al de C++ y Java.
C# soporta static typing, forzando la seguridad de tipos en tiempo de compilacin.
C# adems aade seguridad dinmica de tipos en runtime.
C# se puede usar en linea comandos o con Visual Studio (Windows Forms o WPF).
C# se usa tipicamente para aplicaciones Windows, haciendo uso de .NET.
C# se usa tambin con ADO.NET, LINQ y otras funcionalidades de .NET.
C# se usa tambin para desarrollar aplicaciones Web [ASP.NET] y servicios Web.

A. P. Visual C# 2010 v.1 3


Plataforma .NET
Otros lenguajes compatibles .NET

Lenguajes de Visual
Visual Studio C++ C# J#
Basic
Definicin de tipos,
bloques de programa, Common Type Specification [CTS]
y sus metadatos.

Visual Studio .NET


Especificacin
comn lenguaje
Common Language Specification [CLS]

Biblioteca de clases
organizada en
Espacios Nombres
.NET Framework

Servicios necesarios
para ejecutar una Common Language Runtime [CLR]
unidad de cdigo

Funciones del SO
[Windows]
Application Programming Interface [API]
A. P. Visual C# 2010 v.1 4
Indice
Indice
Generacin de cdigo intermedio y cdigo mquina

Cdigo fuente Cdigo fuente Cdigo fuente


VB2010 C++ C#

Compilador Compilador Compilador


VB2010 C++ C#

ENSAMBLADO: Common Intermediate Language, Metadatos, y Manifiesto


[ *.dll *.exe ]
Cdigo independiente de la plataforma [CPU]

Compilador VB Compilador C++ Compilador C#


Just-in-Time [JIT] Just-in-Time [JIT] Just-in-Time [JIT]
por CPU por CPU por CPU

Cdigo mquina ejecutable


[x86 machine instructions]
100100101010101010101010101010101010101010101
00
A. P. Visual C# 2010 v.1 5
Indice
Ensamblados
Cdigo fuente Common Intermediate Language [CIL] Los Metadatos describen en detalle los tipos
es un lenguaje intermedio, el mismo [clases, etc ] contenidos en el Ensamblado y
C# para todos los lenguajes segn CLR. todos sus miembros.
Es la base de Intellisense, la reflexin,
debugging, late binding y otras
funcionalidades, y del propio compilador C#.
Compilador
C#

ENSAMBLADO: Common Intermediate Language [CIL], Metadatos, y Manifiesto


[.dll .exe]
Cdigo independiente de la plataforma [CPU]
Ensamblado: Es la unidad resultado de la
compilacin del cdigo fuente.
Normalmente un ensamblado se corresponde
con un fichero .dll .exe. El Manifiesto son metadatos sobre el
Puede haber sin embargo ensamblados propio ensamblado, que lo identifican.
multifichero, con varios mdulos. Contiene las referencias a ensamblados
Es la unidad de despliegue en .NET, y externos, n versin, autor, cultura
contiene el cdigo compilado y metadatos [pais, idioma] y otros datos.
necesarios para correr el cdigo bajo CLR.

Se puede examinar el contenido de un ensamblado con la herramienta ildasm.exe (Intermediate Language Disassembler), que se
encuentra en directorio Archivos de programa\Microsoft SDKs\Windows\v7.0A\bin\ildasm.exe
A. P. Visual C# 2010 v.1 6
Estructura de los ensamblados
Los ensamblados
contienen espacios de Manifiesto contiene lista de los
nombres que a su vez elementos contenidos en el
contienen las clases y
ensamblado, y la informacin
otros tipos. Nombre
bsica sobre el ensamblado.
Ensamblado Version
Pais Pais e idioma
Manifiesto Identificacin (opcional)
Strong Strong name
Name es una clave
Metadatos,
MSIL, y Metadatos Lista ficheros (opcional) encriptada
(Tipos) (opcional) generada por
Recursos,
el autor que
se pueden
Ensamblados identifica el
dividir en Cdigo MSIL ensamblado.
varios ficheros. referenciados

Atributos Descripcin
Recursos Ensamblado
cliente
(opcional)

Slo puede haber 1 manifiesto en los


diferentes ficheros del ensamblado.
El cdigo se puede dividir en varios ficheros que
se compilan en un solo ensamblado, mediante el
proceso llamado linking (enlace).

A. P. Visual C# 2010 v.1 7


Indice
Ensamblados (continuacin)

Private Directorio
de la aplicacin
Los ensamblados Private residen unicamente en el mismo
directorio que la aplicacin que los referencia.
Los ensamblados Private se instalan
Las aplicaciones que mantienen una referencia a un
en el directorio llamado bin bajo el
Ensamblado: Es la unidad resultado de ensamblado Private necesitan una copia del ensamblado
directorio de la aplicacin.
la compilacin del cdigo fuente. en su mismo directorio. Si hay 10 aplicaciones que usen
Son privados de la aplicacin.
Normalmente un ensamblado se un cierto ensamblado, tendr que haber 10 copias.
corresponde con un fichero .dll o .exe. La modalidad de distribucin Xcopy hace uso de esto.
Puede haber sin embargo ensamblados Tanto los ensamblados Private como Shared pueden configurarse usando un fichero *.config.
multifichero, con varios mdulos.
Es la unidad de despliegue en .NET, y
contiene cdigo compilado y metadatos Antes de desplegar un ensamblado en el GAC, hay
necesarios para correr cdigo bajo CLR. que asignarle un nombre seguro [strong name], para
identificar univocamente al autor del cdigo .NET.
Los ensamblados
contienen espacios de
nombres que a su vez
Shared
GAC
contienen las clases y Global Assembly Cache
otros tipos. C:\Windows\assembly\

Los ensamblados compartidos [Shared] son ficheros con firma El GAC es un depsito de ensamblados compartidos.
digital que se instalan en el Global Assembly Cache, lo que Compartido significa que una aplicacin puede hacer una
permite disponer de una nica copia, si sta es de confianza. referencia a los ensamblados disponibles en GAC sin tener
GAC slo admite ficheros .dll [ no .exe ]. que disponer de copias de los ensamblados, como ocurre
en la distribucin Xcopy.
A partir de .NET 4.0, Microsoft ha decidido aislar los
ensanmblados en una ubicacin nica y diferente de
C:\Windows\assembly.
Se puede examinar el contenido de un ensamblado con la herramienta ildasm.exe que se
encuentra en Archivos de programa\Microsoft SDKs\Windows\v7.0A\bin\ildasm.exe

A. P. Visual C# 2010 v.1 8


Runtime CLR - en accin
El cdigo ejecutado por
el CLR es seguro Cdigo fuente
managed porque usa en lenguaje Compilador .NET
objetos, variables, etc, compatible segn lenguaje
gestionados por el CLR. . NET
C# slo opera con cdigo
managed.
CIL es el nico cdigo que acepta el CLR.
C++ p.ej. puede ejecutar
Ensam blado CIL da a .NET su capacidad multilenguaje.
tambin cdigo inseguro
*.dll o *.exe Los lenguajes que se puedan compilar a
(unmanaged code).
[ CIL, Metadatos, Manifiesto ] CIL son programas compatibles .NET.

The Common Language Runtime (CLR)


. NET Execution Engine es el corazn de .NET.
El compilador C# [ mscoree.dll ]
Libreras de CLR carga la aplicacin con seguridad,
referencia mscorlib.dll
Clases la aisla, gestiona la memoria y cdigo,
automaticamente. Cargador compila en lenguaje nativo y ejecuta.
[ mscorlib.dll ] Clase(s)
[ y otras ]

Las clases de .NET son Jitter


comunes a todos los
lenguajes .NET.
Instrucciones
especficas de
Plataforma

Ejecucin Una CPU slo ejecuta instrucciones


miembro en formato de lenguaje mquina.

A. P. Visual C# 2010 v.1 9


Indice
Visin general de tareas

Windows Forms C# [ VB, u otros lenguajes compatibles .Net ]


[ opcin WPF]

Crear Escribir
interfaz
Web Forms
usuario cdigo
Debug Programacin por objetos
[ASP.Net] and Deploy
Los objetos interactan entre s,
y con el usuario,
Uso de Visual y responden a eventos
Studio 2010

Acceso
a datos
Depurar e
implantar
- ADO.Net
- LINQ

A. P. Visual C# 2010 v.1 10


Indice
Entornos C#

Consola Linea Comandos

Windows Forms
Visual C# en diferentes
entornos de programacin Visual Studio
WPF
Windows Presentation Foundation

WCF
Windows Comunication Foundation

A. P. Visual C# 2010 v.1 11


Indice
Compilacin desde lnea de comandos
El compilador C# compila cdigo fuente, guardado en ficheros con extensin .cs, en un ensamblado (assembly).
Un ensamblado es la unidad de empaquetado y despliegue .NET, y puede ser una aplicacin .exe o una librera .dll.
Una librera .dll equivale a un .exe, sin punto de entrada. Son llamadas (referenciadas) por aplicaciones u otras dll.

El compilador C# es csc.exe. Se guarda el programa, como .cs, p.ej. Prueba.cs y, desde su mismo directorio, llamar al compilador csc.

Genera ejecutable Prueba.exe.


Para generar una dll Prueba.dll - sera
csc/target:library Prueba.cs

Ejecucin programa compilado Prueba.exe

RESULTADO

Para usar el compilador C# csc.exe y otras utilidades .NET desde cualquier directorio, hay que revisar la variable de entorno PATH.
[Panel de Control > Sistema > Configuracion avanzada del sistema > Variables de entorno > Variables del sistema > Path]
PATH contiene una lista de directorios separados por punto y coma, donde Windows busca los ficheros ejecutables (exe) (y otros).
Aadir a la variable de entorno PATH, si no estuviera ya, la ubicacin del compilador csc.exe que se encuentra en
C:\Windows\Microsoft.NET\Framework\v4.0.30319 [v4.0.30319 : versin del Framework en uso]

A. P. Visual C# 2010 v.1 12


Compilacin: desde aplicacin de consola de Visual Studio 2010

Seleccin lenguaje Visual C#


Seleccin aplicacin: consola

Pestaa Program.cs
Espacios de nombres que el sistema
importa automticamente al inicio.
Se crea un namespace que alojar
a todas las clases creadas en programa.
Una clase (al menos) del programa

Mtodo Main en que arranca programa

Sentencias del mtodo Main

Depuracin, compilacin y ejecucin.


Crea ConsoleCSharp.exe en Debug o Release.

Resultado del programa.


La consola permanece estable,
porque se est a la espera de
pulsar cualquier tecla, o salir.
A. P. Visual C# 2010 v.1 13
Compilacin: desde aplicacin Windows Forms de Visual Studio 2010

Pestaa Form1.cs

Clases, estructuras e interfaces,


pueden ser divididas en varios
ficheros usando partial. Espacios de nombres que el sistema
importa automticamente al inicio.
El compilador C# combina el
codigo de usuario con el cdigo
generado automticamente al Se crea un namespace que alojar
arrancar la aplicacin. a todas las clases creadas en programa.

Al arrancar, Visual Studio genera un fichero Una clase (al menos) del programa
Program.cs que contiene el mtodo Main,
el cual llama al mtodo Run, el cual a su Llamada a constructor de clase Form1.
vez crea Form1 llamando a su constructor.
Llamada a mtodo InitializeComponent .

Ejemplo de controlador evento aadido

Depuracin, compilacin y ejecucin.


Crea WindowsFormsCSharp.exe en Debug o Release.

Mensaje de salida del programa

* Ver en Explorador de Soluciones


A. P. Visual C# 2010 v.1 14
Compilacin: desde aplicacin WPF de Visual Studio 2010

Fichero XAML inicial Fichero XAML inicial

Clases, estructuras e interfaces, Pestaa MainWindow.xaml.cs


pueden ser divididas en varios
ficheros usando partial. Espacios de nombres que el sistema
El compilador C# combina el importa automticamente al inicio.
codigo de usuario con el cdigo
generado automticamente
Se crea un namespace que alojar a todas
al arrancar la aplicacin. las clases creadas en programa.
Al crear una aplicacin WPF, el compilador
convierte la definicin XAML en un objeto
Una clase (al menos) en el programa, que
Application que controla la vida de la
aplicacin y carga el formulario inicial.
se instancia automaticamente al compilar.
Para ello usa la propiedad StartupUri de
App.xaml que especifica el fichero XAML Constructor de la clase MainWindow.
de la ventana a crear.
Al compilar, adems, Visual Studio genera
InitializeComponent es generado
2 ficheros intermedios en obj\x86\Debug*:
App.g.cs y MainWindow.g.cs.
automaticamente en MainWindow.g.cs,
[g de generado]. e instancia y configura controles, y enlaza
La clase parcial MainWindow se compone controladores de la ventana.
de MainWindow.xaml.cs bajo nuestro La plantilla inicial no contiene ninguna funcionalidad, pero incluye NO debe borrarse en ningn caso.
control, y estos 2 ficheros autogenerados. el constructor por defecto de MainWindow, que llama a
En App.g.cs se encuentra el mtodo Main InitializeComponent cuando se crea una instancia de la clase.
que crea y presenta el formulario Depuracin, compilacin y ejecucin.
especificado por la propiedad StartupUri. Crea WPFCSharp.exe en Debug o Release.
Como resultado de la compilacin, se
fusionan el fichero MainWindow.xaml
con el cdigo de MainWindow.xaml.cs
para crear WPFCSharp.exe.

Mensaje de salida del programa


* Ver en Explorador de Soluciones
al pulsar el botn button1.

A. P. Visual C# 2010 v.1 15


Indice
Compilacin: static binding, dynamic binding
C# 4.0 incorpora el enlace dinmico [dynamic binding], que pospone la gestin de tipos y miembros desde la compilacin al runtime.
Una variable declarada dynamic se trata con enlace tardo, es decir en runtime.
Ejemplo:
dynamic d = "hola";
Console.WriteLine (d.ToUpper()); // HOLA
Console.WriteLine (d.Otro()); // Compila, pero genera un runtime error
Invocar un objeto dinamicamente es til en escenarios que requeriran en otro caso un complicado cdigo de reflexin.

Enlace temprano, Enlace tardo [early binding, late binding]


Early binding = static Late binding=dynamic binding
Enlace temprano Enlace tardo
binding
Tiempo de diseo Tiempo de diseo
Clase Coche
Dim c1 As Coche Clase Coche Dim cx As Object - Propiedades
- Mtodos
- Propiedades
- Eventos
- Mtodos
- Eventos

Runtime Runtime

c1 = New Coche cx = New Coche


2 2

Menos flexible, Ms flexible,


A. P. pero ms rpido Visual C# 2010 v.1 pero ms lento 16
Indice
Programas en C# [ Consola ]
Un programa C# es realmente un conjunto de declaraciones de tipos.

using System; //acceso a espacio de nombres System Declaraciones y sentencias


Acceso a clases using ...
a travs de namespaces acaban todas con ; .
Estructura tpica de programas C#

Namespace Uno Namespace Uno Todo cdigo C# tiene que


[espacio de nombres] { aparecer dentro de un tipo,
agrupa al conjunto de y los tipos dentro de un espacio
class Programa
tipos (clases, etc) del de nombres [Namespace].
programa. {
// aqu puede haber otros mtodos
static void Main () Punto de entrada (Main)
{ El programa se inicia a partir
System.Console.WriteLine(Hola C#"); del mtodo Main.
} Restantes mtodos se ejecutan
segn vayan siendo llamados.
// aqu puede haber mtodos que instancien objetos,
Declaraciones // y/o hagan uso de propiedades y mtodos de su Todos los mtodos y cualquier
// clase o de otras. elemento de cdigo, forman parte
de Tipos de una clase (tipo en general).
}
Una aplicacin es una clase
con un mtodo Main, que tiene
class Otra que ser un mtodo static, y con
{ tipo de retorno void o int.
//cuerpo de la clase Otra con sus miembros. Al lanzar un programa, runtime
} invoca automaticamente Main,
cuya forma ms simple es:
static void Main( )
{
} //sentencias del programa
}

A. P.
Un programa consiste en objetos de varias clases interactuando entre s.
Visual C# 2010 v.1 17
Estructura de programas en C# (continuacin)

Namespaces:
libreras de clases
System System.Windows System.IO ......

using System;
using ....
Namespace Uno Un namespace aloja todo el programa
{
public class Programa Una clase que contiene Main
{
static void Main( ) Con metodo Main
{ se inicia programa
Se crean objetos a partir
de clases propias o de
Coche c1 = new Coche();
c1.Metodo1 ( ); Se ejecutan mtodos
libreras.
//........... de la propia clase y/o
} de los objetos creados.
}

Definicin de clases class Coche


{ #region Bloque1
// propiedades
#region y #endregion definen el inicio y
// mtodos
En C# no existen las variables globales, // constructor(es) final de un bloque de cdigo que puede
variables definidas fuera de un tipo. } ser expandido o contraido a voluntad,
Todos los campos deben alojarse en la para tener un vista rpida o detallada.
declaracin de tipo (normalmente clase). } #endregion

A. P. Visual C# 2010 v.1 18


Mtodo Main()
El mtodo Main es el punto de entrada de una aplicacin de consola de C# o una aplicacin para Windows.
Las bibliotecas y los servicios no requieren un mtodo Main como punto de entrada.
Cuando se inicia una aplicacin, el mtodo Main es el primer mtodo que se invoca.
En un programa en C#, slo puede haber un punto de entrada.

El mtodo Main es el punto de entrada de los programas .exe, donde se inicia y finaliza el control del programa.
Main se declara dentro de una clase o un struct. Main debe ser de tipo esttico, no public.
No es necesario que el struct o la clase envolvente sean de tipo esttico.
Main puede tener un tipo de valor devuelto void o int.
El mtodo Main se puede declarar con o sin un parmetro string[] que contenga los argumentos de la lnea de comandos.

Main puede tener una de las formas:

static int Main(string[] args) Como parmetro un array de cadena, tradicionalmente llamando args, aunque puede ser cualquier nombre.
El programa puede usar este array para acceder a opciones pasadas a travs de lnea de comandos cuando
static void Main(string[] args) se arranca el programa.

static int Main() Devuelve valor int que indica el xito o fallo del programa, siendo el 0 el que suele indicar xito.

static void Main() No devuelve ningn valor

Si se usa Visual Studio para crear aplicaciones de formularios Windows Forms, se puede agregar el parmetro manualmente o bien
utilizar la clase Environment para obtener los argumentos de la lnea de comandos.
Los parmetros se leen como argumentos de la lnea de comandos con ndice de base cero.

A. P. Visual C# 2010 v.1 19


Pila de llamadas

1 pila = 1 hilo
Pila de llamadas

Metodo2 ( )

- Retorna valor a llamador Llamada al mtodo2()


- No retorna valor (void) que pasa arriba de la pila.
- Excepcin

Metodo1 ( )
- Retorna valor a llamador
Llamada al mtodo1()
- No retorna valor (void)
que pasa arriba de la pila.
- Excepcin

Main( )

Entrada a programa

A. P. Visual C# 2010 v.1 20


Indice
POO : Programacin Orientada a Objetos
Los 3 pilares de la programacin orientada a objetos:

Encapsulacin
Separacin entre implementacin e interface en las clases.

Herencia
Cdigo reutilizado en clases derivadas [clases, interfaces]

Polimorfismo
Mtodos de mismo nombre se comportan de distinto modo.

A. P. Visual C# 2010 v.1 21


Indice
Tipos soportados en Common Type Specification [CTS]
C# tiene un sistema unificado de tipos, en que todos los tipos una funcionalidad comn.

Alternativa a las clases


Son referencias a mtodos en memoria. Delegados para estructuras simples.
Los delegados slo apuntan a mtodos No admiten herencia.
que tienen su misma firma. Implementan interfaces.
Son tipos de referencia. Son tipos de valor.
Estructuras

A estos tipos,
Agrupaciones de pares Enumeraciones C# aade los
nombres/valores. arrays, y los
Son tipos de valor. tipos
predefinidos.
Interfaces
Abstraccin de objetos.
Las clases contienen
una serie de miembros:
- campos [datos]
- propiedades [datos]
Clases Slo definiciones de
- mtodos [acciones]
miembros, que son
- eventos [interaccin].
implementados en
Las clases son una plantilla
las clases o estructuras.
para la creacin de objetos.
Admiten herencia.
Son tipos de referencia.
Base del polimorfismo.
A. P. Visual C# 2010 v.1 Tipos de referencia. 22
Tipos de datos
En C# hay que declarar el tipo de dato.
byte sbyte Hay 15 tipos de datos predefinidos.
Para datos ms complejos, se crea una
short ushort nueva clase y con ello un nuevo tipo

Tipos predefinidos en C#
de dato sobre la base de los tipos
int uint predefinidos, o las clases predefinidas
de C#, o del usuario.
long ulong
Todos los valores en C# son instancias
float de un cierto tipo.

Tipos de valor
Su significado y rango de valores, son
double determinados por su tipo de dato.

En C#, true y false no son nmeros, ni pueden


Datos decimal convertirse a ningun tipo numrico.

Los datos se crean bool Los tipos de valor pueden ser nullable types
al instanciar que admiten el valor null, con la definicin
un determinado int? a = 222 ; //usando el sufijo ? al tipo.
tipo. char
Los tipos predefinidos y los personalizables
string object tienen pocas diferencias entre s.
Los predefinidos se instancian directamente.
Tipos personalizables

Los tipos personalizables deben declararse


struct enum Tipos referencia antes de su instanciacin, definiendo su tipo,
nombre, y en su caso (clases), sus miembros.
array delegate
Al crear una nueva clase, array,
interface class interface, delegado, struct, enum,
se crea un nuevo tipo de datos.
A. P. Visual C# 2010 v.1 23
Tipos de datos numricos
En C#, hay que declarar explicitamente el tipo de dato con el que se opera.

Tipo C# Segn CTS Sufijo Tamao Rango


sbyte System.SByte 1 byte -128 a 127 Enteros pueden entrarse
en decimal o hexadecimal
short System.Int16 2 byte -32.768 a 32.767 int n = 222; //decimal
int m = 0xDE; //prefijo 0x
int System.Int32 4 byte -2.147.483.648 a 2.147.483.647

long System.Int64 lL 8 byte -263 a 263 -1 Los nmeros reales pueden


entrarse en decimal o
byte System.Byte 1 byte 0 a 255 exponencial
double d = 1.5;
ushort System.UInt16 2 byte 0 a 65.535 double million = 1E06;

uint System.UInt32 ul UL 4 byte 0 a 232 -1


Tipos de punto flotante tienen
System.UInt64 ul UL 8 byte 0a 264 -1 como valores especiales:
ulong NaN (Not a Number),
+,
float System.Single fF 4 byte (10-45 a 238) -,
-0.
double System.Double dD 8 byte (10-324 a 2308) Dividir un n por 0 d por
resultado infinito.
Dividir 0 entre 0 o restar infinito
decimal System.Decimal mM 16 byte (10-28 a 228) de infinito da por resultado NaN.

int y long son los tipos favorecidos por C# y el runtime. Sufijos F y M son obligatorios con fracciones en
decimal se usa tipicamente para clculos financieros. punto flotante o literales decimales.
float f = 4.5F; // no compila sin sufijo
*u como prefijo de un tipo significa unsigned (sin signo) decimal d = -1.23M; // no compila sin sufijo
A. P. Visual C# 2010 v.1 24
Jerarqua de clases
Todas las clases .NET derivan de System.Object

Boolean
System.Object Tipos de valor
ValueType Byte

Tipos primitivos de datos


Clase base
Char
para todos los
Type tipos de valor,
enumeraciones Integer
y
Tipos de referencia

String estructuras. Single


Todos los tipos
que derivan de Double
Array ValueType son
estructuras, Long
no clases.
Exception DateTime

TimeSpan
Delegate
Enumeraciones
Estructuras
A. P. Visual C# 2010 v.1 25
Palabras reservadas en C#
Palabras reservadas por C# y no utilizables en variables*, etc. * A menos lleven prefijo @

Todas las palabras


en minsculas.

Como todo en C#, las palabras clave son case-sensitive


A. P. Visual C# 2010 v.1 26
Smbolos en C#
C# hace un uso especial de ciertos simbolos y notaciones.
Simbolo Significado
- Enmarca una cadena o expresin a evaluar

, - Separa identificadores en declaraciones


- Encadenan expresiones
; - Finaliza declaraciones y expresiones. No se usan en cabeceras (headers) de clases ni de mtodos.
. - Tras una clase u objeto, denota que sigue mtodo o propiedad, en la llamada Sintaxis de Punto.
( ) - Delimitan listas de parmetros en mtodos
- Delimitan condiciones en decisiones con if, etc.
[ ] - Usados con arrays
{ } - Encierra bloque de clase, bloque de cdigo. No requiere acabar con ;.
- Delimitan las lista de valores iniciales de los arrays
\ Carcter secuencia de escape. Un \ precediendo un carcter indica que ste no tiene significado normal.
\" - Dobles comillas
\' - Comillas simples
\\ - Barra atrs
\n - Nueva lnea. Ir a principio de nueva lnea
\r - Retorno carro. Ir a principio lnea actual
\t - Tabulador. Poner espacio hasta siguiente tabulador
// Comentario de 1 lnea
/* .. */
Inicio y fin de comentario que puede abarcar varias lineas.
@ - Permite usar un palabra reservada. P. ej. int @base = 22;
- Uso de lo que sigue en su literalidad, p. ej. en nombres de paths : var via = @"c:\test.txt"
#region Metodo1 - Marca el inicio y final de una zona de cdigo que puede ser expandida o contraida.
#endregion

Se pueden insertar espacios, tabulaciones o lneas entre palabras o lneas, porque el compilador los ignora.
A. P. Visual C# 2010 v.1 27
Identificadores en C#
Identificadores son nombres que el programador elige para sus clases, mtodos, variables, etc.
Debe ser una palabra, compuesta de caracteres Unicode, que comienze con letra o guin bajo.
Son case-sensitive.
Por convencin, parmetros, variables locales y campos privados deberan ser en notacin Camel (ej. miVar).
Espacios de nombres, tipos, nombres de miembros deberan ser con notaci Pascal (ej. MiVar).

Nombre Identificador
1er carcter : siguientes caracteres:
Letra o guin bajo. Letra, nmero, guin bajo.
No nmeros No @

Notacin Descripcin Recomendado para Ejemplos


Pascal Cada palabra empieza con mayscula Espacios de nombres, PrimeraClase, MiPos
tipos y miembros
Camel Cada palabra, excepto la primera, con Variables locales, campos miCuenta, miVar
mayscula privados, y parmetros
Maysculas Todo en maysculas Solo abreviaturas XML, IO

A. P. Visual C# 2010 v.1 28


Tipos de valor y Tipos de referencia
Los tipos en C# se dividen en tipos de valor y tipos de referencia.
Los tipos de valor comprenden los tipos predefinidos as como las estructuras y enumeraciones.
Los tipos de referencia son : clases, arrays, delegados, interfaces, string, y object.

Los tipos de valor guardan los datos reales en la memoria de pila.


Los tipos de referencia guardan una referencia en la pila a los datos que se guardan en el montn.

Tipos de valor Tipos de referencia


Son los tipos numricos, boolean y char: N ilimitado de tipos, ya que son definibles por usuario:
char, byte, short, ushort, int, uint, long, ulong, float, double Clases, arrays, delegados e interfaces, String y Object.
y decimal, as como las estructuras y las enumeraciones. P.ej. cada clase creada define un nuevo tipo de dato.
Una variable puede ser declarada de este tipo, y guardar
instancias de esta clase.
Se guardan en la memoria de pila. Se guarda en la pila una referencia a la ubicacin del objeto en la
memoria montn.
Cuando un valor primitivo se asigna a otra variable del Cuando un tipo de referencia se pasa a otro tipo de referencia,
mismo tipo, se pasa una copia. ambos apuntan al mismo objeto.
Cuando se pasa un tipo primitivo a un mtodo, slo se pasa Cuando un objeto se pasa a un mtodo, el mtodo llamado
una copia. El mtodo llamado no tiene acceso al valor puede cambiar el contenido del objeto pasado pero no la
primitivo original, y no puede por tanto modificarlo. direccin del objeto.
El mtodo llamado puede modificar el valor copiado.
Admiten nullable types, que se definen con el smbolo ? como No admiten nullable types.
sufijo al tipo de dato que modifica. Ej. int? x =222. Los tipos de referencia reciben por defecto el valor null.
Estos tipos admiten el valor null como un valor ms.
De inters cuando se trata con bases de datos con campos vacios.

A. P. Visual C# 2010 v.1 29


Tipos en memoria
Tipos de valor se guardan en memoria de pila, los de referencia en la memoria montn,
si bien la referencia (puntero) al objeto se guarda tambin en memoria de pila.
Memoria de pila [stack]
byte 0 byte var1 (ocupa 1 byte) Memoria montn [heap]
byte 1 char var21 (ocupa 2 bytes)
byte 2
byte 3 Tipos de valor
short var2 (ocupa 2 bytes)
byte 4
byte 5
byte 6 int var40 (ocupa 4 bytes)
byte 7
byte 8
byte 9 Objeto**
byte 10 referenciado
r (referencia ) ( tipo int de 4/8* bytes) Tipo referencia
byte 11 por
byte 12 r
byte 13 byte var11 (ocupa 1 byte)
byte 14
byte 15
Memoria de pila
funciona segn
principio LIFO
[last in, first out] El programa guarda tipos de referencia en montn,
en cualquier orden, pero no se pueden borrar.
De eso se ocupa el recolector de basura.

** Requiere tantos bytes como requieran sus datos internos,


A. P. * 4 byte en plataformas 32 bits, 8 bytes para 64 bits. Visual C# 2010 v.1 mas un minimo de 8 bytes para metadatos administrativos. 30
Variables
Una variable representa una ubicacin de memoria para valores modificables.
Una variable segn el tipo de dato que representa, es una variable de valor o una variable de referencia.
Las variables se usan como variables locales, campos de clases, valores de retorno de mtodos, y parmetros.
En la memoria de pila [stack] se guardan las variables de valor. En la memoria montn [heap] se guardan las variables de referencia.

public Mtodo o bloque.


Una variable de instancia public es accesible desde cualquier clase. En un mtodo puede haber varias variables con mismo
nombre que otras de otro metodo, ya que las variables
desaparecen al terminar la ejecucin de su mtodo.
[modificador acceso] tipodato s1 ; Variable Local
Declaracin de variable, con tipo dato y nombre variable.
Declaracin mltiple de variables, separadas por comas. Clase y sus objetos
Si no se inicializan, se inicializan a valores por defecto.
private
Una variable de instancia private es slo accesible en la clase en que se declara. Variable de Instancia
No accesible desde otras clases, ni desde subclases de la clase en que se declara.
Las variables se ubican en uno de estos bloques

s1 = expresion ; Si no se inicializa la variable, se le asigna un valor por


Asignacin de valor a una variable previamente declarada defecto dependiendo del tipo de dato de la variable.
Para tipos numricos es 0, para tipo bool es false.
Para tipos de referencia es null.
[modificador acceso] tipodato s1 = expresion ;
Una variable o constante tiene un mbito
Declaracin y asignacin de variable en una sola sentencia.
scope desde el punto donde se declara hasta
Declaracin y asignacin de mltiples variables en una sentencia, separadas por comas.
el final del bloque donde se declara.
Un bloque comprende el cdigo contenido entre
un par de llaves { ...}.
Se usa la palabra clave var para hacer una declaracin implcita del tipo de dato.
var unidades = 22 ; En C# no existen las variables globales.
El compilador infiere el tipo de dato por esta asignacin [int], y queda ya fijado. Todas las variables se definen dentro de tipos
A. P. Visual C# 2010 v.1 31
Variables de valor y de referencia
Las variables, segn el tipo de dato que representan, son variables de valor o variables de referencia.

Las variables deben declarse antes de su uso.


Se declaran: dando el tipo de dato y un nombre.
int edad; //declaracn tipo y nombre de variable. Se reserva memoria.
edad=30; //asignacin de valor a la variable. Se guarda valor en memoria. String var1; //creacin referencia
Int edad = 30; // declaracin y asignacin en 1 sentencia. Se reserva y guarda. var1 = Pepe; //creacin objeto
String var1=Pepe //referencia y objeto
Uno de los 13 Valor de variable se var1 es una variable String, y es un tipo de
tipos de datos guarda en la misma dato de referencia.
ubicacin de la variable valor Al definir una variable de referencia,
predefinidos Pila [Stack] se guarda una referencia en la pila a la
ubicacin de memoria montn donde se
Tipos de valor referencia
guarda el valor real de la variable.

Slo hay estos 2


tipos de variables
variable
El valor de variable es la direccin
Referencia de memoria [referencia] del valor
a un objeto objeto que contiene los datos de
Tipos de referencia Monton [Heap]
la variable
Aqui se guarda el objeto

Tipos valor Tipos referencia


Declaracin int d1 string s1
int d2 string s2

Uso d1 = 111 s1 = pepe


d2 = d1 s2 = s1
d1 = 222 s1 = juan

Resultado Valor de d2 sigue siendo = 111 Valor de s2 ha cambiado a juan

A. P. Visual C# 2010 v.1 32


Variables de valor y de referencia
Variables de valor Asignacin Variables de referencia

Las variables de valor se guardan Memoria Memoria r1 guarda una direccin de la memoria
directamente en la memoria pila, pila [stack] montn [heap] montn donde se guarda el valor de la
con tamao predefinido segn tipo. Valor v1 = 22 variable (pepe).
Valor r2 apunta inicialmente a otra direccin de la
v2 = 22 pepe
memoria montn donde se guarda el valor de
v2 = v1 genera una copia de v1 y Referencia r1 la variable (juan).
la guarda en v2.
Ambas variables son independientes, r2 = r1 asigna el valor referenciado por r1 a r2.
aunque guardan el mismo valor. Referencia r2 juan Qu pasa con el valor antes referenciado por
Se puede cambiar el valor de v1 v2, Tipos de referencia r2 ?
sin afectar a la otra. Tipos valor El dato sigue donde estaba, pero no puede ser
accedido porque r2 apunta ahora a otro sitio.
Finalmente el recolector de basura reconocer
Memoria pila (stack) Memoria montn (heap)
Almacena tipos referencia
que el objeto r2 ya no est en uso y lo borrar.
Almacena tipos valor
* byte * string
* object Al asignar una variable de referencia a otra,
* bool
* char * array se hace una nueva referencia a un objeto
* short * interface existente.
* int * delegate Las 2 variables apuntan al mismo objeto.
* long * class Slo se copia la referencia al objeto.
* float Si se modifica el valor a travs de una de las
* decimal referencias, este cambio afecta a la otra.
* double r2 = r1
* sbyte
* ushort
* uint
* ulong
* struct
* enum

v2 = v1
A. P. Visual C# 2010 v.1 33
Caracteres - tipo char
char representa un carcter Unicode de 16 bit (2 byte), guardado como entero entre 0 y 65.535.
Un carcter literal se denota con comillas simples [comillas dobles se usan para cadenas (strings)].
char se trata como un entero, permitiendo operaciones aritmticas y de comparacin.
Un string es una serie contigua de caracteres (ej. pepe) entre comillas dobles, mientras que char es 1 carcter (ej. p') entre comillas simples.
Namespace

System char inicial = e'; // carcter simple entre comillas simples

Tambin se puede representar tipos char en hexadecimal de 4 dgitos de caracteres Unicode*. Ej.: \x0065.
Enum Char Tambin como un entero de la forma ((char)101), donde 101 est aqui en decimal.

IsControl() Se puede especificar cualquier carcter Unicode usando un secuencia de escape Unicode.
Esta consiste de un carcter estndar \ seguido por una u y 4 dgitos con su valor hexadecimal \u0065.
IsDigit() MessageBox.Show("Pep\u0065"); //Tambin puede ser \x0065 //muestra Pepe.

IsLetter() Una barra invertida \ precediendo a un carcter indica que este carcter no tienen el significado habitual [secuencia de escape].

IsLetterOrDigit()
Una conversin implicita de un char
a un tipo numrico slo vale con
IsSeparator()
Mtodos estticos

ushort (0 a 65.535).
IsSymbol() Para otros tipos numricos, se
requiere conversin explcita.
IsLower()

IsUpper()

ToLower()

ToUpper() MessageBox.Show(char.ToUpper((char)(101)).ToString());

ToString() * Ambas son vlida \x0065\ y \u0065


A. P. Visual C# 2010 v.1 34
Strings - cadenas
El tipo String en C# representa una secuencia inmutable de caracteres Unicode.
Objetos de tipo String son cadenas de caracteres entre comillas dobles (... ).
Namespace
Concatenacin de cadenas Las cadenas C# pueden contener varios
System mediante operador +. caracteres de escape, que indican como
imprimir el carcter.
Las secuencias de escape son (\) seguido
Clase String string nombre = pepe"; por una letra(s) o caracteres.

Propiedad Declaracin y asignacin en una sola sentencia Char Significado


Length
\ Inserta comillas simples
Contains() \ Inserta comillas dobles

EndsWith() string a = "pepe"; \\ Inserta barra invertida


MessageBox.Show(a.EndsWith("e").ToString()); //true
\a Inserta alarma
IndexOf()
\b Inserta retroceso

Insert() \f Inserta salto pgina


Mtodos destacados

\n Inserta nueva lnea


LastIndexOf()
\r Inserta retorno de carro
Remove() \t Inserta tabulacin horizaontal
El carcter @ precediendo al nombre de un fichero \v Inserta tabulacin vertidal
Replace() hace que se tome dicho nombre literalmente.
@"C:\Temp\MyDir\MyFile.doc \xhhhh Carcer Unicode en hexadecimal
StartsWith() Es equivalente a \xhhh Caracter ASCII en hexadecimal
"C:\\Temp\\MyDir\\MyFile.doc"
que usa \\ para insertar la barra invertida. Si \ precede a un carcter que no aparece en la
Substring() tabla, se trata como el carcter como tal, sin mas.
P. ej. \c se trata como una c.
Trim()
En C#, un objeto String es inmutable significando que sus caracteres no pueden ser cambiados, sino
ToUpper() ToLower() que se crean otros string, que posteriormente ir eliminando el recolector de basura.
Para muchos cambios, usar clase StringBuilder, que se encuentra en espacio de nombres System.Text,
A. P.
y que cuenta con mtodos como Append(), Remove(), Insert() y ToString() para manipular cadenas.
Visual C# 2010 v.1 35
Conversiones de nmeros
C# permite hacer conversiones entre instancias de tipos compatibles. Pueden ser implicitas o explicitas.

Conversiones de tipos : implcitas y explcitas


Conversin implcita
Implcita
TIPOS float
ENTEROS double
explcita
byte
sbyte
Un tipo A cuyo rango de valores short
entra dentro del rango de otro ushort
int explcita
tipo B, puede ser objeto de
uint
conversin implicita a ese tipo. explcita
Long
La conversin implcita es ulong
posible en todas circunstancias.
implcita explcita

decimal

El sistema de tipos de C# es unificado, de manera que un valor Conversin explcita (casting)


de cualquier tipo puede tratarse como un objeto. Todos los tipos
de C# derivan directa o indirectamente de la clase Object. Cuando sea posible una prdida de precisin,se hace una conversin
Los valores de los tipos de referencia se tratan ya como objetos. explcita (casting), en determinadas circunstancias.
Los valores de los tipos de valor se tratan como objetos con la Sintaxis: se d el tipo de destino entre parntesis, seguido de la variable.
realizacin de operaciones de conversin boxing y unboxing. double x = 9.997 ;
object a = b; // Boxing : asignacin de tipo valor b a objeto a
int j = (int) a; // Unboxing : conversin de objeto a tipo valor j. int nx = (int) x ; conversin explcita a int
La unificacin permite que las bibliotecas de uso general que Una conversin se puede declarar anteponiendo checked en cuyo caso se
utilizan el tipo object puedan usarse tanto con los tipos de produce un error en caso de desbordamiento, o unchecked, en que no.
referencia como con los tipos de valor. Ejemplo : int nx = checked (int) x ;
A. P. Visual C# 2010 v.1 36
Clase Convert
La clase Convert contiene mtodos para diferentes conversiones entre tipos.
namespace

System
Clase
static Convert
ToInt32() int x = Convert.ToInt32(textBox1.Text.ToString()); Conversion a int de un entrada en TextBox

ToDecimal()
Mtodos static [extracto]

ToDouble()

ToByte()

ToChar()

ToDateTime()
Otros operadores de conversin
ToString()
El operador as, si falla la conversin, devuelve null, no excepcin.
as Como is, se usa slo para conversiones de referencia y boxing.
No se puede usar por conversiones del usuario, o a tipos de valor.
Expr as TipoDestino

El operador is permite chequear si una conversin es factible.


is Expr is TipoDestino
is retorna true si la conversin propuesta es viable.
Como as, se usa slo para conversiones de referencia y boxing.
No se puede usar por conversiones del usuario.

A. P. Visual C# 2010 v.1 37


Indice
Fecha y hora
El espacio de nombres System define algunos tipos [struct] tiles, como DateTime y TimeSpan.
namespace

System
Representa un instante de tiempo Representa un intervalo de tiempo Ejemplos
struct DateTime TimeSpan DateTime dt = new DateTime(2015, 12, 20);
TimeSpan ts = new TimeSpan(5,0,0,0);
MessageBox.Show((dt + ts).ToString());
Add () Add ( )
DateTime dt = new DateTime(2015, 12, 20);
mtodos

Compare () Substract( ) DateTime dt1 = new DateTime();


dt1=dt.AddDays(5);
DateTime () Compare() MessageBox.Show(dt1.ToString());

Date TimeSpan ()
- Menos
Year
+ Ms
Month != No es igual
Day == Igual
Operadores < Menor que
DayOfYear > Mayor que
propiedades

DayOfWeek Days >= Mayor o igual


Hour <= Menor o igual
Hours
Minute
Second Minutes Ejemplo
TimeSpan ts = new TimeSpan(4, 30, 0); //intervalo en h, m,s.
Millisecond MessageBox.Show(ts.ToString());
Seconds
Now // resta 15 m y muestra en ventana.
MessageBox.Show(ts.Subtract(new TimeSpan(0, 15, 0)).ToString());
Today Milliseconds

A. P. Visual C# 2010 v.1 38


Indice
Arrays [matrices]
Array = coleccin de elementos del mismo tipo almacenados en un bloque contiguo de memoria.
Los arrays son tipos de referencia, pero sus elementos pueden ser tipos de valor o de referencia.
Definicin de array de n elementos
[n] es el n de elementos del array .
char[n] vocales ; El ndice va desde 0 a n-1.
Una vez creado, los elementos reciben el valor por defecto del
Definicin e instanciacin de array de n elementos tipo a que pertenecen (para int 0, etc).
char[ ] vocales = new char [n] ; Se leen/escriben los elementos a partir de
escribir: vocales [0] = a; //leer: char x = vocales[0] ;
Namespace
Se puede declarar e inicializar un array en un solo paso:
Creado un array, su tamao es fijo.
System C# no soporta arrays dinmicos.
char[] vocales = new char[] {'a','e','i','o','u'};
o simplemente:
Clase char[] vocales = {'a','e','i','o','u'};
abstracta Array
Length int p1 = vocales.Length; // 5 int x = miArray [2, 2, 2]
Propiedades
int p2 = vocales.Rank; // 1 Array de 3 dimensiones
Rank
int y = ArrayArray [2][3][4]
Clear()
Array de arrays, cada uno de su dimensin
IndexOf() int p3 = Array.IndexOf(vocales,a); // 0

a e i o u
Algunos mtodos

LastIndexOf() int p4 = Array.LastIndexOf(vocales,a); //0


char[] vocales = {'a','e','i','o','u'};
Reverse()
Uso de foreach para recorrer todo el array.
Sort() foreach (char c in vocales) Console.Writeline (c);
GetValue() char x = (char) vocales.GetValue(1); // e
Uso de un bucle para recorrer el array.
GetUpperBound() Int p6 = vocales.GetUpperBound(0); //4
for (int i = 0; i < vocales.Length; i++) Console.WriteLine (vocales [i]);
A. P. Visual C# 2010 v.1 39
Indice
Operadores
Operaciones numricas Operaciones de comparacin
Op. Nombre Ejemplo Resultado Op. Nombre Ejemplo Resultado La clase System.Random sirve para obtener
nmeros pseudoaleatorios.
+ Suma 5+5 10 < Menor que (5 < 9) true
Mtodos:
- Resta 55 0 > Mayor que (5 > 9) false Next(int max)
Next(int min, int max)
* Multiplicacin 5*5 25 <= Menor o igual (5 <= 9) true Su mtodo Next (int min, int max)
genera valores >= min y <max.
/ Divisin 5/5 1 >= Mayor o igual (5 > = 9) false
Random rnd = New Random();
% Resto 5%5 0 == Igual (5==5) true rnd = Next(0,10); //entre 0 y 9
NextDouble() // >= 0,0 y < 1,0.
!= No igual a (5!=5) false
Operaciones asignacin aumentada La clase esttica System.Math contiene
Op Nombre Ejemplo Equivale Operador condicional (ternario) mtodos para realizar funciones
matemticas bsicas.
+= Asignar suma a += 5 a=a+5 Evala una condicin, y asigna valores segn Math se incorpora automticamente y no
resultado de la condicin. necesita la sentencia using.
-= Asignar resta a -= 5 a= a-5
Condicion ? Expresion1 : Expresion2 ; Todos sus mtodos son estticos -> usar
*= Asignar multiplicar a *= 5 a=a*5 int k = x < y ? a : b; //ejemplo en 1 lnea nombre de clase Math .
int k = x < y // ejemplo en 3 lneas
/= Asignar divisin a /= 5 a=a/5 ?a
:b; El operador + concatena cadenas.
%= Asignar resto a %= 5 a=a%5 [Esta es la versin C# de IIf(x<y,a,b) de VB] Las operaciones numricas y de comparacin,
aplican tambin a tipos char, ya que se
tratan como enteros.
Operaciones incremento/decremento Operaciones lgicas
Op. Nombre Ejemplo Resultado Op. Nombre Ejemplo Resultado && y || son versiones cortocircuito de & y | resp.
&& devuelve true si ambos operandos son true.
++a Preincremento a = ++ i a=i+1 & Y [And] 1&0 0 Si cualquiera de ellos es false, devuelve false.
[nuevo valor a ] i=i+1 Se llama cortocircuito AND porque si el operando
| O [Or] 1|0 1 izquierdo es false, devuelve false sin evaluar el otro.
a++ Postincremento a = i ++ a=i
[valor original a ] i=i+1 || devuelve true si cualquier operando es true.
^ O Exclusivo 1^0 1
Si ambos son false, devuelve false.
--a Predecremento a = -- i a=i1 [ exclusive or ]
Se llama cortocircuito OR porque si el operando
[nuevo valor a ] i=i-1 ! No [Not] 1 0 izquierdo es true, devuelve true sin evaluar el otro.
a-- Postdecremento a = i -- a=i
[valor original a ] i=i-1
A. P. Visual C# 2010 v.1 40
Indice
Clases visin general
Las clases son el elemento de programacin ms importante dentro de la plataforma .NET, y base de la POO.
Una clase es un tipo que tiene una estructura de datos (estado) y puede ejecutar cdigo (comportamiento).

Objetos

Clases
de . NET Framework
o de terceros
Clases definidas
en el programa
Instanciacin

Las clases son una plantilla conceptual a


travs de la cual generar, mediante el
proceso llamado de instanciacin,
Las clases representan objetos con sus mismos atributos y
entidades del mundo real comportamiento, los cuales
interactuando entre s y con otros
a travs de sus atributos y Clase
comportamiento. objetos de otras clases, realizan las
tareas previstas por el programa.
A. P. Visual C# 2010 v.1 41
.Net Framework y Espacios de Nombres
Framework es una extensa coleccin de clases organizada en Espacios de Nombres (namespaces),
los cuales a su vez se organizan en Ensamblados.

Espacios de nombres
System Clases para tipos bsicos, eventos, controladores, interfaces

System.Windows.Forms Clases para crear aplicaciones Windows

System.IO Clases para manejo del sistema de ficheros

System.Drawing Clases para trazado de grficos, textos e imgenes

System.Net Clases para gestin y manejo de redes con protocolos

System.Environment Clases para acceso al entorno y componentes del equipo

Se accede a las clases de cada espacio de nombre con la sentencia using Namespace

C# importa por defecto los espacios de nombres adecuados al tipo de proyecto elegido.
A. P. Visual C# 2010 v.1 42
POO Programacin Orientada a Objetos
Nuevos mtodos

Los objetos hacen algo.


Tienen sus mtodos. Por ejemplo: girar 90 a derecha Aadido: girar 45 a derecha
Cada objeto tiene las caractersticas Objetos Objetos
[campos] y comportamiento [mtodos]
de su clase.
Un universo
Objetos se interrelacionan entre s de objetos
y con el usuario.

Generan y reaccionan a eventos.

Encapsulacin

Polimorfismo Instanciacin Instanciacin


Nuevo atributo
Detalles
Sin detalles ocultos Detalles
ocultos

Interface(s) : [implementacin]
Clase (base) : [Herencia] Clase derivada

Interfaces son puras declaraciones Clases son plantillas para la creacin deobjetos. Clases derivadas heredan de su clase base y
A. P.
abstractas de comportamiento. Pueden implementar una o ms interfaces. pueden aadir o variar mtodos y propiedades.
Visual C# 2010 v.1 43
Clases y Objetos : ilustracin

Abstraccin Interface Declaracin de clase Crear Objeto

Instanciado
2 e inicializado

Interface
2

Objeto coche [F1 real] IComportamiento public class Coche : IComportamiento Propiedades
public void avanzar ( ) { Sus caractersticas
public string color;
public int num;
Miembros abstractos que Mtodos
Abstraccin definen el comportamiento. public void avanzar ( )
Su comportamiento
Sin implementacin de mtodos. {
Las clases pueden decir que ..//implementacin Objeto Coche [virtual]
interface(s) o comportamiento(s) }
Abstraer sus caractersticas y
acciones relevantes al fin deseado implementan. }
Uso, por tanto, OPCIONAL.
Clase Coche [virtual]

A. P. Visual C# 2010 v.1 44


Declaracin de clases
Una clase es la definicin de las caractersticas y comportamiento de un determinado tipo de objetos.
A travs de la instanciacin, todos los objetos de la clase disponen de los datos y mtodos definidos en la clase.
El tipo de dato de un objeto es la clase que define las caractersticas del mismo.

Una clase es una entidad que puede guardar datos [campos] y ejecutar cdigo [mtodos]. Contiene:
Miembros de datos : guardan datos asociados atributos - con la clase o una instancia de la clase (Data members)
Miembros de funcin: ejecutan cdigo, definiendo el comportamiento de los objetos de la clase (Function members)

Modificadores de Nombres de clases: [clase] : [clase base] [clase ] : [interfaces] implementados por
acceso a la clase y Pascal [1 letra en de la que hereda la clase, separados por comas.
modificadores de clase maysculas]. Opcional Opcional
Opcional

[modificador clase] class Coche [:] [clase base] [interfaces separados por comas]
{
Miembros // campo(s) datos (variables) que contienen el estado o caracteristicas de los objetos
de datos
// constante(s) datos que no varian durante la ejecucin
// propiedad(es) son como los campos pero con mtodos de acceso get/set
// mtodo(s) son las acciones que ejecutan los objetos, su comportamiento
// constructor(es) mtodos que instancian nuevos objetos
Miembros
de funcin
// destructor(es) mtodos que destruyen objetos
// evento(s) sucesos detectables por el objeto
// indice(s) como propiedades pero con acceso por ndice
//operador(es) definen como combinar instancias (objetos).
}
Definicin de una clase mostrando sus elementos y todos los posibles miembros que puede contener.
A. P. Visual C# 2010 v.1 45
Tipos, miembros, modificadores
Tipos Miembros Modificadores
public

Campo private

acceso
Delegados internal
Constante protected

abstract
Enumeraciones Propiedad
async
Mtodo const
event
Estructuras Constructor extern
new
Finalizador
override
partial
Interfaces Operador readonly
sealed
Evento static
Arrays unsafe

Indexador virtual
volatile
Clases
Afectan al acceso o comportamiento
Los 6 tipos personalizables de C# Miembros de que se
de los tipos y miembros
componen los tipos

A. P. Visual C# 2010 v.1 46


Modificadores
Los modificadores afectan al acceso o comportamiento de los tipos y miembros

Modificadores de acceso de tipos y miembros Modificadores de tipos y miembros


Modificador Significado
abstract Sirve de clase base para otras clases
public Tipos Acceso desde ensamblado externo.
async El mtodo modificado, expresin lambda, o
Miembros Acceso desde objetos o clases derivadas. mtodo annimo es asncrono
const Valor de campo o variable local no modificable
private Tipos Acceso desde su propia clase o struct. extern El mtodo se implementa externamente
event Declara evento
new Oculta explicitamente un miembro heredado
protected Tipos Acceso desde su clase y clases derivadas
override Nueva implementacin de mtodo virtual
heredado

internal Tipos Acceso desde su propio ensamblado. partial Clases, estructuras o mtodos parciales en
mismo ensamblado
Miembros Acceso desde u propio ensamblado. readonly Campo slo lectura
sealed Clase no heredable
static Pertenece a la clase, y no a ningn objeto
protected
Tipos Propio ensamblado, su clase y derivadas.
internal unsafe Contexto no seguro
virtual Mtodo a ser sobreescrito en clase derivada

volatile Campo puede ser modificado por S.O, el


hardware u otro hilo.

A. P. Visual C# 2010 v.1 47


Modificadores de clases
Modificadores de clase
abstract [abstracta]: no instanciable. Slo son instanciables sus clases derivadas.
sealed [sellada]: no heredable.
static [esttica] : slo contiene miembros static. No se pueden heredar ni instanciar.
unsafe [insegura]: denota un contexto no seguro. [Se recurre a l para operaciones con punteros.]
partial [parcial]: dividida entre varios ficheros. Uno suele ser autogenerado y el otro creado por cdigo.

[modificadoracceso] [modificador] class Coche [:] [clase base] [interfaces separados por comas]
Modificadores de acceso a clase
public [pblica]: accesible a toda clase o ensamblado.
private [privada]: accesible a cdigo dentro de la misma clase.
internal [interna]: accesible dentro programa (ensamblado). Por defecto: internal
protected [protegida]: accesible a su clase y a sus clases derivadas.
protected internal [protegida interna]: accesible a misma clase y derivadas, y a su propio programa (ensamblado).
Ensamblado [programa] EA
Otro ensamblado
public class A1

private class A2

internal class A3

protected class A4 Clase derivada

protected internal class A5 Clase derivada

A. P. Visual C# 2010 v.1 48


Clases abstractas
Una clase abstracta permite definir propiedades comunes que utilizarn sus clases derivadas.
No admite instancias, sino es a travs de sus clases derivadas, que heredan sus caractersticas.
Las clases abstractas pueden contener mtodos abstractos que se implementan en sus clases derivadas.

Una clase abstracta No-abstracta


hereda de clase abstracta abstracta INSTANCIAS
o no-abstracta.

Puede contener mtodos [public] abstract class Cuenta


abstractos y no abstractos.
Campo uno
Los mtodos abstractos slo CLASE
contienen la declaracin. Mtodo uno ABSTRACTA
NO ADMITE
Una clase derivada de una clase Mtodo dos INSTANCIAS
abstracta debe implementar
todos los miembros abstractos Mtodo abstracto
de la clase mediante override,
a no ser que ella misma sea una
clase abstracta. INSTANCIAS de clase derivada
: herencia

El constructor en una clase abstracta public class Saldo : Cuenta Campo uno
se define como protected porque Campo uno
slo se usa en subclases. Mtodo uno
Al crear objetos de una subclase instanciacin
Mtodo uno Mtodo dos Mtodo dos
concreta, se invoca el constructor de
la clase base para inicializar campos
de datos definidos en ella. Mtodo abstracto Mtodo abstracto
A. P. Visual C# 2010 v.1 49
Clases static
Las clases static [estticas] slo contiene miembros static. No se instancian, ni se heredan.
Son clases que exponen toda su funcionalidad, que suele ser de uso general, a nivel de clase.
Las clases o estructuras que slo tienen funcionalidad a nivel de clase (static) tambin se llaman utility class.

Namespace
System
System.Math y System.Environment son 2 clases estticas.
public static class public static class

Math Environment La clase esttica System.Math contiene mtodos para realizar


funciones matemticas bsicas.
La clase Math se incorpora automticamente con System
Min() GetCommandLineArgs() y no necesita la sentencia using.
Mtodos static

GetEnvironmentVariable() Todos sus mtodos son estticos -> usar nombre de clase Math en
Max() lugar del objeto llamador.
Round() GetLogicalDrives() Math.IEEERemainder(222,5);

Sin() SetEnvironmentVariable()
Mtodos static

Cos() CommandLine
Tan() CurrentDirectory
Propiedades static

La clase esttica System.Environment contiene propiedades y


IEEERemainder() MachineName mtodos para realizar obtener/establecer datos del equipo.
La clase Environment se incorpora automticamente con System
Pow() UserDomainName y no necesita la sentencia using.
Todos sus mtodos son estticos -> usar nombre clase Environment
Log() UserName
en lugar del objeto llamador.
Log10() WorkingSet Environment.GetLogicalDrives();

A. P. extracto extracto Visual C# 2010 v.1 50


Miembros de clases
Una clase es una estructura que puede guardar datos [campos] y ejecutar cdigo [mtodos].
Contiene:
Miembros de datos : guardan datos asociados atributos - con la clase o una instancia de la clase (Data members).
Miembros de funcin: ejecutan cdigo, definiendo el comportamiento de la clase o sus objetos (Function members).

Modificadores miembros Modificadores acceso


extern: el mtodo se Clase public: accesible a toda
implementa externamente. clase o ensamblado.
override : reescribe un
Miembros de Datos Miembros de Funcion: ejecutan cdigo private: accesible a cdigo
mtodo virtual heredado dentro de la misma clase.
con la misma firma. Campos Propiedades Mtodos Eventos internal: accesible dentro
new : oculta un miembro programa (ensamblado).
heredado de su clase base Constantes Constructores Por defecto: internal
Operadores
partial: tiene varias partes protected: a su clase o a
en el ensamblado. sus clases derivadas.
readonly: slo lectura.
Destructores Indexadores protected internal: a
Asignacin en declaracin o misma clases y derivadas, y
a travs constructor. a su propio programa.
sealed: invalida en clase
base. Un modificador no puede repetirse.
static: pertenece a la Debe existir al menos uno de los modificadores : static, virtual y override.
clase, no a sus objetos. El modificador new no puede coexistir con override.
virtual : modificable en Con el modificador abstract, no pueden ir : static, virtual, sealed o extern.
clase derivada. Con el modificador private, no pueden ir : virtual, override o abstract.
Al modificador sealed, debe acompaar override.

A. P. Visual C# 2010 v.1 51


Modificadores de acceso de miembros [access modifiers]
El modificadoracceso especifica qu otras partes del cdigo tienen acceso a un miembro dado.
El modificadoracceso se coloca inmediatamente antes del miembro.

Public: accesible por cualquier clase o ensamblado. [modificadoracceso] tipodato NombreCampo


Private: accesible a cdigo dentro de la misma clase.
Internal: accesible a cdigo del mismo ensamblado.
Protected: desde dentro misma clase o derivadas.
[modificadoracceso] tipodato NombrePropiedad
Protected internal: desde mismo ensamblado o
clases derivadas en otro ensamblado. [modificadoracceso] TipoRetorno NombreMtodo ()

Ensamblado [programa] EB

public class B1 miembros


private

internal
Otro ensamblado public Mismo
Misma clase
ensamblado
protected
internal

Clase derivada : B1 protected

A. P. Visual C# 2010 v.1 52


Miembros static
Los miembros static pertenecen a la clase, no a sus objetos.

Clase A Otras clases


static Campos
clase B A.nombremiembro
static Acceso a miembros static
Mtodos
a travs del nombre de la
static Constantes* clase, sin necesidad de
instanciar objetos clase C A.nombremiembro
static Constructores
con la notacin de punto (.)
static Eventos tras el nombre de la clase.

Objetos de clase A
Campos Operadores Mtodos Los objetos acceden o1 o1.nombremiembro
Propiedades Indexers Constructores a los miembros non-static
con la notacin de punto (.)
Eventos Destructores tras el nombre del objeto. o2 o2.nombremiembro

static non-static
Campos static en una clase son campos o variables de clase. Campos no-static en una clase son campos o variables de instancia.
Mtodos static en una clase son mtodos de clase. Mtodos no-static en una clase son mtodos de instancia.
Para usar un campo o mtodo static, no se necesita un objeto. Para usar un campo o mtodo no-static, hay que hacerlo desde un objeto.
Si una clase tiene un campo static, y se instancian 100 objetos, slo existe Si una clase tiene un campo no-static, y se instancian 100 objetos, habr 100 copias del
en memoria una copia del campo, vista por los 100 objetos. campo en memoria. Cada objeto tendr su valor propio.
Si una clase tiene un mtodo static, y se instancian 100 objetos, slo existe Si la clase tiene un mtodo no-static, y se instancian 100 objetos, slo una copia del
una copia en memoria, y el mtodo no recibe referencia del objeto que lo mtodo existe en memoria, y el mtodo recibe una referencia con la direccin del objeto
est llamando. que lo est llamando.
Los mtodos static no pueden acceder a miembros de instancias. Los mtodos no-static acceden a miembros de instancias.
Para llamar a miembro static desde fuera de su clase, usar operador . Para llamar a un miembro no-static desde fuera de su clase, se usa el operador .
A.nombreclase.nombremiembro.
P. * Las constantes son implicitamente static. nombreobjeto.nombremiembro.
Visual C# 2010 v.1 53
Campos [Fields]
Los campos se definen como las variables, incluyendo la opcin de inicializacin en la definicin.
Los campos son el estado o caractersticas de los objetos que las clases representan.
Modificadores de acceso
Public: accesible desde cualquier
clase o ensamblado. Defecto.
Private: accesible a cdigo dentro
de la misma clase. Modificadores de campos
Internal: accesible a cdigo static: pertenece a la clase,
dentro del mismo ensamblado no a sus objetos. Nombre de campos public: notacin Pascal: NombreCampo.
Protected: misma clase o clases readonly: slo lectura. Los private, usan Camel : nombreCampo [1 letra en minscula].
derivadas. Asignacin en declaracin o a
Protected internal: mismo travs constructor.
ensamblado o clases derivadas en - Campos numricos se inicializan a 0.
otro ensamblado. - Campos boolean se inicializan a false.
- Tipos referencia se inicializan a null.

[modificadoracceso] [modificadorcampo] tipodato NombreCampo = [valor inicial] ;


Los campos non-static son variables de instancia, y los static son variables de clase. Si no se asigna valor inicial,
Un campo esttico es compartido por todas las instancias de las clase y todas ellas hacerlo en sentencia separada.
acceden a la misma ubicacin de memoria. Si se cambia su valor en memoria,
el cambio afecta a todas las instancias.

public class Coche


{ [modificadores] tipodato NombreCampo ; Declaracin
public string Color ; //campo
public int Num ; //campo
... NombreCampo = expresion ; Inicializacin
}
Declaracin e inicializacin en 2 sentencias

Por seguridad, es recomendable declarar como private los campos que no interese que sean accesibles desde fuera de la clase,
y usar como Property esos mismos campos, y acceder a ellos con sus mtodos get y set, que adems permiten validaciones.
A. P. Visual C# 2010 v.1 54
Propiedades [Properties]
Las properties son iguales a los campos desde el exterior, pero contienen lgica interna, como los mtodos.
Se declaran como los campos pero son mtodos con bloques - accessors - set y get adicionales.
Modificadores de acceso
public: accesible desde Se obtiene o establece una propiedad
cualquier clase o exactamente igual que con los campos.
ensamblado.
private: accesible a get y set se llaman implicitamente.
cdigo dentro de la TestPropiedad tp = new TestPropiedad();
misma clase. tp.Edad = 25; // asignacin
internal: accesible a int z = tp.Edad; // lectura
cdigo dentro del mismo
ensamblado
protected: misma clase
o clases derivadas. Nombre de la propiedad en Pascal.

[modificadoracceso] tipodato NombrePropiedad


class TestPropiedad
{ // El campo se nombra en notacin Camel y la propiedad en Pascal.
private int edad ; // Campo privado edad, que se har accesible a travs de la propiedad Edad backing field
public int Edad // Propiedad Edad : la definicin de la propiedad no acaba con ; (el campo si).
{
set // set tiene como parmetro implcito value, que es el valor que se asigna a la variable es un mutator.
{ edad = value; }
get // get devuelve (lee) el valor como return es un accessor.
{ return edad; }
Si no hay lgica especial dentro de get y set, puede usarse
}
} public int Edad { get; set; }
que implementa el campo automticamente, sin necesidad de declararlo.

La accesibilidad permitida a get y set depende de la de su property, y no puede ser nunca mas amplia que la propiedad a que pertenecen.

Por seguridad, es recomendable declarar como private los campos que no interese que sean accesibles desde fuera de la clase,
y usar como Property esos mismos campos, y acceder a ellos con sus mtodos get y set, que adems permiten validaciones.
A. P. Visual C# 2010 v.1 55
Constantes
Una constante puede ser cualquier de los tipos numricos predefinidos: bool, char, string, o una enumeracin.
Una constante se declara con const y tiene que inicializarse a su valor constante.
Las constantes son por definicin static, y por tanto no necesitan llevar el modficador static explicitamente.
En C# no existen las constantes globales, las constantes tienen que definirse de un tipo, normalmente clase.

const es la palabra reservada de C# para declarar una constante

[modificadoracceso] const int giro = 360 ;

Public: accesible por cualquier


clase o ensamblado.
Modificadores de acceso

Private: accesible a cdigo


dentro de la misma clase.
Internal: accesible a cdigo
dentro del mismo ensamblado
Protected: dentro misma
clase o derivadas.
Protected internal: mismo
ensamblado o clases derivadas
en otro ensamblado.

A. P. Visual C# 2010 v.1 56


Mtodos
El bloque bsico de ejecucin es el mtodo, siempre formando parte de clases o structs.
C# soporta 2 tipos de mtodos : mtodos de instancia y mtodos de clase (static).

extern: el mtodo se Los nombres de los mtodos deberan contener


implementa externamente. verbos, ya que los mtodos realizan acciones.
override : reescribe un Se usa la notacin Pascal, como en MiMetodo.
public: accesible por cualquier mtodo virtual heredado
clase o ensamblado. con la misma firma.
new : oculta un miembro
private: accesible a cdigo
heredado de su clase base [Modo] cualifica como se pasan los parmetros.
dentro de la misma clase.
partial: tiene varias partes Por defecto por valor, se pasa copia del parmetro.
internal: accesible a cdigo en el ensamblado.
dentro del mismo ensamblado out : pasa parmetro out a variable dentro mtodo.
sealed: invlida en clase
protected: dentro misma base. ref : paso de parmetros por referencia. Se asignan
clase o derivadas. static: pertenece a la por mtodo llamador. Inicializarlos antes pasarlos.
void si no se
protected internal: mismo clase, no a sus objetos. params: se envian varios param como uno solo.
devuelve
ensamblado o clases derivadas virtual : modificable en ningn valor
en otro ensamblado. clase derivada. Nombre parmetros en notacin Camel, ej. minMax

[modificadoracceso] [modificador] tiporetorno NombreMetodo ([modo] lista parametros)


{ //La potencia de los mtodos radica en sus parmetros.
// cuerpo del mtodo La firma de un mtodo es su nombre y lista de parmetros.
//si hay tipo retorno: return [resultadotiporetorno] Lista de parmetros : n de parmetros, tipo y orden de los parmetros,
} con sus modificadores si los tienen. No incluye tiporetorno.
void Invocacin o llamada de mtodo int
void: una llamada al mtodo es una sentencia, acabada con ;. Si un mtodo retorna un valor,
Console.WriteLine( Esto es C# !) ; int lado = max(3, 4);

Extension methods son una forma de aadir un nuevo mtodo de instancia a una clase existente fuera de su declaracin..
A. P. Visual C# 2010 v.1 57
Paso de argumentos [a mtodos]
Los mtodos pueden tener una lista de parmetros, que les dan su potencia y versatilidad.
Los parmetros definen un conjunto de argumentos que deben ser proporcionados al mtodo.
Los argumentos pueden pasarse por valor o por referencia, con indenpendencia de que sean de tipo valor o referencia.

Por defecto, en C#, los argumentos se pasan por valor.


Si el argumento es de tipo de valor, por valor se pasa al mtodo una
copia del valor, creada al efecto. Ninguno : por valor, se pasa copia del parmetro.
Si el argumento es un tipo de referencia, en el paso por valor se pasa out : argumento se pasa por referencia.
una copia de la referencia, no del objeto. ref : igual que out pero con valor asignado al param.
Para pasar por referencia, se usa el modificador de parmetro ref. params: parmetro con n variable de argumentos.

Nombre parmetros en notacin Camel, ej. minMax

[modificador acceso] tiporetorno NombreMetodo ([modo] lista parametros)


{ //La potencia de los mtodos radica en sus parmetros.
// cuerpo del mtodo
La firma de un mtodo es su nombre y lista de parmetros.
//si hay tiporetorno : return [resultadotiporetorno]
Lista de parmetros : n de parmetros, tipo y orden de los parmetros,
} con sus modificadores si los tienen. No incluye el tipo de valor devuelto.

Optional parameters permiten a las funciones dar parmetros por defecto de forma que los llamadores pueden omitir el paso de esos argumentos.
Una declaracin de parmetro opcional:
void Fijo (int x = 222) { MessageBox.Show (x.ToString()); }
Se puede llamar as :
Fijo ( ); // Presentara en ventana 222
Named arguments permiten a un llamador identificar un argumento por nombre ms que por su posicin.
Por ejemplo, el mtodo anterior puede ser llamado as:
Fijo (x :555); // Presentara en ventana 555

A. P. Visual C# 2010 v.1 58


Acceso a miembros de una clase
El operador (.) se usa para acceder a miembros de una clase desde fuera de ella.

Clase A Otras clases


static Campos
clase B A.nombremiembro
static Acceso a miembros static
Mtodos
a travs del nombre de la
static Constantes* clase, sin necesidad de
instanciar objetos clase C A.nombremiembro
static Constructores
con la notacin de punto (.)
static Eventos
Objetos de clase A
Campos Operadores Mtodos Los objetos acceden o1 o1.nombremiembro
Propiedades Indexers Constructores a los miembros non-static
con la notacin de punto (.)
Eventos Destructores o2 o2.nombremiembro

Instanciar con new, reserva memoria montn para cada uno de los campos y mtodos de la clase. Al declarar una variable de una clase,
La referencia al objeto sirve para acceder a sus campos y mtodos usando el operador dot (.). se reserva memoria para la referencia,
Empleado emp = new Empleado ( ); //declara e instancia objeto Empleado pero no para los datos de la clase.
emp.nombre = Pepe Gmez; //accede y asigna el campo nombre del objeto Es el operador new el que reserva e
inicializa memoria para la instancia.
La operacin emp.nombre accede al campo nombre del objeto Empleado al que referencia emp.
La referencia se guarda en la memoria
De igual manera, para invocar un mtodo del objeto Empleado: de pila y montn, segn el tipo.
emp.mail ( );

this this se usa cuando un mtodo necesita acceder a campos o mtodos dentro de su misma clase. Datos
public double calculoPaga ( ) referencia
{
return this.salario/12; // aqui this es opcional aunque facilita la comprensin
} Pila [stack] Montn [heap]
A. P. Visual C# 2010 v.1 59
Diferentes clases
Clase : (herencia) Clase derivada Permiten instanciacin y
herencia.
Ni miembros static La clase derivadas heredan
ni constructores son los miembros de su clase
new new heredables. new new base, que ellas pueden
modificar, y/o aadir
Modificadores nuevos miembros.
Objeto1 Objeto2 Objeto1 Objeto2

Permiten herencia pero


No admite Clase abstracta : (herencia) Clase derivada no instanciacin.
instanciar
Ni miembros static La clase abstracta no est
ni constructores son new new diseada para ser usada
heredables. directamente, sino a
travs de sus clases
Instanciacin Modificadores derivadas, que son las
Objeto1 Objeto2 que implementan sus
miembros abstractos.

No admite
Ni instanciacin ni
instanciar
ni heredar
Clase static : (herencia) No heredable
herencia.

Son clases con utilidades


de carcter genrico.
Instanciacin Slo miembros static.
Ejemplo es la clase
System.Math

A. P. Visual C# 2010 v.1 60


Overloading vs. Overriding

Overloading Sobrecarga Sobreescritura Overriding

Los mtodos, incluso los constructores, pueden ser Una subclase puede sobreescribir los mtodos que hereda.
sobrecargados. Sobreescrito, un mtodo contiene la misma firma (nombre
Sobrecarga significa que dos o ms mtodos tienen el y lista de parmetros) que el mtodo en la clase base, pero
mismo nombre, pero diferentes lista de parmetros. puede tener diferente implementacin.
Tienen que tener lista de parmetros diferentes, y En la clase base el mtodo debe tener el modificador
adems pueden tener diferente return. virtual, y en la clase derivada el mismo mtodo debe
Tener diferente slo el return no es sobrecarga. presentar el modificador override

class ClaseBase class ClaseBase


{ {
public int Calcular(int x, int y) virtual public int Calcular()
{...} {...}
} }

class ClaseDerivada : ClaseBase class ClaseDerivada : ClaseBase


{ {
public int Calcular(double x, double y) override public int Calcular()
{......} //diferente lista de parmetros {......} //diferente implementacin
} }

La firma de un mtodo se compone de su nombre y de su lista de parmetros.


Lista de parmetros comprende : n de parmetros, tipo y orden de los parmetros, con sus modificadores de parmetros si los tienen.
El tipo de retorno no forma parte de la firma.

A. P. Visual C# 2010 v.1 61


Constructores
Constructores : es un tipo especial de mtodos que se invocan para instanciar objetos e inicializarlos.
A diferencia de propiedades y mtodos, los contructores no se heredan.
Son opcionales, tienen exactamente el mismo nombre que su clase, y no tienen return como los mtodos.
Una clase puede tener mltiples constructores. Es un caso de sobrecarga (mismo nombre, distintos parmetros).
Si una clase no tiene constructores definidos, C# crea automticamente uno public y sin argumentos, para ella.
El contructor llamado en cada momento es el que coincide con la firma que aparece en la llamada.
Normalmente, se declaran los constructores public para que otras clases puedan instanciar objetos de esa clase.

Cuenta c1 = new Cuenta (firma1);); c1 Inicializado


segn firma1
public class Cuenta { La firma de la llamada selecciona el constructor
public Cuenta (firma1) {....}
public Cuenta (firma2) {....} c2 Inicializado
public Cuenta ( ) { }
Cuenta c2 = new Cuenta (firma2 ); segn firma2
}

Clase con 3 constructores (sobrecargados).


Notar que los constructores son mtodos con Cuenta cx = new Cuenta ( ); cx Inicializado
por defecto
0 ms parmetros, sin retorno.
Si se crean constructores con firma, La misma operacin en 2 fases:
C# elimina el que hubiera creado por defecto. Cuenta cn;
new crea el objeto y el
constructor lo inicializa. cn = new Cuenta ( ); //inicializacin por defecto

Los constructores se justifican cuando una clase tienen muchos campos variables de instancia - que
inicializar uno a uno. Se reduce el esfuerzo de inicializacin utilizando constructores con firma.

A. P. Visual C# 2010 v.1 62


Otros miembros de clases
Destructores Indexers
Los destructores se encargan de liberar recursos cuando un objeto Indexers acceden a elementos en una clase o estructura.
de una clase ya no es referenciado. La clase string class tiene un indexador que permite acceder a sus valores
Slo puede haber un destructor por clase. a travs de un indice int.
Los destructores no tienen parmetros. string s = "hola";
Los destructores no tienen modificadores de acceso. Console.WriteLine (s[0]); // 'h'
Un destructor tiene el nombre de su clase precedido de tilde ~. Console.WriteLine (s[3]); // a'
Un destructor acta en instancias de clases, no son static. La sintaxis como la de los arrays con indice entero.
No se puede llamar explicitamente a un destructor por cdigo. Indexers tienen los mismos modificadores que las propiedades.
Se llaman durante el proceso de recoleccin de basura, cuando ste
analiza el cdigo y verifica que no hay ninguna referencia al objeto.
Class1
{
~Class1() // El destructor
{
// cdigo
}
...
}
No es preciso implementar un destructor si no es necesario.
Un destructor slo debe liberar recursos propios del objeto.
Un destructor no debe acceder a otros objetos porque no se
puede saber si esos objetos han sido ya destruidos.

Antes de C# 3.0 los destructores eran finalizadores (finalizers).

A. P. Visual C# 2010 v.1 63


Instanciar [crear] objetos
En C#, se usa la palabra clave new para instanciar un objeto, y el constructor (con/sin firma) adecuado.
new crea un objeto en memoria y devuelve una referencia al objeto creado, en la variable objeto.
El objeto permanece en memoria mientras que el programa retenga una referencia al objeto.

Coche car; //declara referencia (car) a Coche

car = new Coche( ); //asigna la referencia a nuevo objeto Coche, que guarda en montn

La referencia car no es un objeto. El objeto en s, no tiene un nombre de variable, y la nica forma de acceder a l es a travs de su referencia car.

Una referencia es (tipicamente) un entero de 32-bits con la direccin de memoria del objeto al que hace referencia.

Coche car = new Coche( );


new crea un nuevo objeto Coche haciendo uso del constructor Coche(), y asigna a la variable car una referencia a dicho objeto.
La variable creada car es de tipo Coche y en realidad guarda una referencia al objeto, no el objeto mismo.

Los constructores son mtodos de las clases. Una clase puede tener varios con distinta firma (sobrecargados).
Si la clase no tiene ningn constructor definido, se crea uno para ella por defecto, sin parmetros.
El nombre del (mtodo) constructor debe ser igual al de la clase a que pertenece.
Un contructor con firma, crea objetos con la inicializacin proporcionada por la firma (argumentos) del constructor.
A. P. Visual C# 2010 v.1 64
Clases y Objetos : ilustracin [uso de constructor sin argumentos]
Clase Creacin Objetos (instanciacin) Inicializacin Objetos

Coche c1=new Coche(); c1.color = verde;


c1.num = 1;
1

Instanciacin c2.color = rojo;


Coche c2=new Coche();
c2.num = 2;
public class Coche

Inicializacin
{ 2

public string color;


public int num;
2

} c3.color = azul;
Coche c3=new Coche();
c3.num = 3;
Si la clase no cuenta
con constructores, 3
C# crea uno sin
argumentos.
3
Clase C#
Instanciacin con palabra clave new Incializacin con asignacin atributos
A. P. Visual C# 2010 v.1 65
Indice
Clases y Objetos : ilustracin [uso de constructor con argumentos]
Instanciacin e
Clase Inicializacin Objetos

Coche c1 = new Coche (verde,1)

Instanciacin + Inicializacin
Coche c2 = new Coche (rojo,2)
public class Coche
{ 2

public string color;


public int num;
2
public Coche (string co, int nu)
{
color = co
num = nu Constructor Coche Coche c3 = new Coche (azul,3);
} con parmetros
3

3
Clase C# Instanciacin con palabra clave new
Instanciacin e inicializacin
A. P. Visual C# 2010 v.1 66
Indice
Herencia
Mecanismo para definir una nueva clase (derivada) a partir de otra clase (base).
La herencia es la forma bsica de reutilizacin de cdigo en la programacin [P.O.O.].
Una clase slo puede heredar de una nica clase base. En C# no hay herencia mltiple.
Por defecto toda clase deriva de la clase Object, base de toda la jerarqua de clases C#.
La herencia crea clases parecidas a su clase base, modificando y/o aadiendo miembros propios.
Los nicos miembros que no se heredan son los mtodos private, y los constructores (aunque son public).

class Tecnico : Empleado


Miembros aadidos y/o
modificados en Tecnico.
...override ...{..} Sobreescribible

Se implementa
....................{...} en derivada
Oculta este
..new ...... {...}
class Empleado mtodo heredado

...virtual ......{..}

...abstract.....
Miembros aadidos y/o
Miembros aadidos y/o
modificados en Empleado.
modificados en Empleado.
: herencia No aparecen los heredados.
class Object No aparecen los heredados.

clase derivada
clase base

Object : herencia Object Object

Base de todas
las clases de C# Implicitamente deriva de object

La herencia entre clases se declara con la sintaxis: class ClaseBase : ClaseDerivada


A. P. Visual C# 2010 v.1 67
Encapsulacin
La encapsulacin es impedir que los datos internos de una clase sean accesibles desde sus objetos.
Los datos de las clases deben preferiblemente ser marcados como private.
Para modificar los datos de un clase, deberan usarse indirectamente miembros public..

Encapsulacin
class Coche

Accesible a usuarios de la clase


Detalles de implementacin ocultos
public variables ; 1

private variables ;
public get () {...} // tpico de Java
private constants ; Objetos
private methods () public set () {...} // tpico de Java
de la
2

{Cdigo de mtodos public y private} public Property //preferido en C# clase


Una clase no debera tener campos public, public constants ;
3
y usar Property o bien mtodos get y set. public methods ()
Miembros public de la clase

Private significa que un campo instance variable - no puede ser accedido desde otras clases.
Podra usarse un miembro Property para leer/establecer el valor de un campo private.
Tambin podran usarse mtodos set y get para leer o escribir campos private.
Por seguridad, es recomendable declarar todos los campos private, y Property o set y get .

A. P. Visual C# 2010 v.1 68


Indice
Clase Object
La clase Object es la madre de todas las clases. De ella heredan todas las dems.
Object proporciona una serie de mtodos que pone a disposicin de todos los objetos de C#.
Incluso las subclases heredan en ltima instancia de la clase Object.
Si al definir una clase no se especifica de qu clase deriva, por defecto la clase deriva de Object.
Clase

System.Object La palabra clase de C# object representa a la clase base System.Object.

Determina si las instancias de System.Object especificadas se consideran iguales.


Miembros de System.Object

Determina si el objeto System.Object especificado es igual al objeto System.Object actual.

Obtiene HashCode

Devuelve el tipo del objeto como System.Type

Obtiene el objeto System.Type de la instancia actual.

Determina si las instancias de System.Object especificadas son la misma instancia.

Devuelve una clase System.String que representa la clase System.Object actual.

A. P. Visual C# 2010 v.1 69


Indice
Genricos
C# tiene 2 mecanismos para la reutilizacin de cdigo : herencia y genricos.
Mientras que la herencia expresa la reusabilida a travs de clases base y sus derivadas,
los genricos la expresan como una plantilla que contiene ubicaciones para los tipos.

Clases construidas
Instanciacin formal de objeto miGen1 de la clase Generica.
class Generica < int >
Generica < int> miGen1 = new Generica <int> ( ) ;
Clase genrica { int var1 ; }
class Generica < T1> Instanciacin formal de objeto miGen2 de la clase Generica.
{ class Generica < double > Generica < double> miGen2 = new Generica <double> ( ) ;
public T1 var1 = new T1(); { double var1 ; }
}
Instanciacin formal de objeto miGen3 de la clase Generica.
class Generica < short > Generica < short> miGen3 = new Generica <short> ( ) ;
{ short var1 ; }

T1 representa al tipo final real Clases que utilizan la plantilla Instanciaciones a partir de las clases construidas segn la clase Generica

La definicin es como la de una clase normal, colocando los parmetros de tipo entre corchetes angulares < > y separados por comas.

C# tiene 5 clases de genricos: clases, estructuras, interfaces, delegados, y mtodos. 4 son tipos y mtodos son miembros de tipos.

Los genricos permiten disear cdigo reutilizable y parametrizable que sirva para ms de un tipo.
El cdigo genrico contiene espacios para tipos, que se ocupan con los tipos reales al crear la instancia de la clase.
Un genrico no es un tipo sino una plantilla para un tipo.

El uso de genricos reduce cdigo: un nico cdigo con una misma funcionalidad que puede actuar sobre diversos tipos.

A. P. Visual C# 2010 v.1 70


Indice
Interfaces
Un interface es un tipo de referencia, formado por miembros abstractos [propiedades, mtodos, eventos], sin implementar.
Un interface define el comportamiento de una clase o estructura pero sin desarrollar su implementacin.
Un interface refleja un comportamiento que una determinada clase o estructura puede decidir implementar.
Las clases o estructuras que implementen un interface, deben implementar todos sus miembros.
Una clase no puede derivar de varias clases base, pero s puede implementar mltiples interfaces.
Las interfaces dan a una clase mltiples comportamientos, y por ello son base del polimorfismo.

Una interface se parece a una clase en que: Un interface se diferencia de una clase en que:
Puede declarar cualquier n de miembros. Los interfaces no se instancian.
No tienen constructores.
Todos sus mtodos son abstractos.
Un interface se implementa por una clase o struct.
Los nombres de las interfaces deberan ser
adjetivos, y terminar en able o ible . Un interface puede heredar de mltiples interfaces.
apropiado. Por lo dems como las clases.

[modificador acceso] interface ITest Una declaracin de interface puede tener cualquiera de los
Declaracin
interface

{ modificadores de acceso : public, protected, internal o private.


int Cal ( int x, int y, int z); Los miembros de un interface son implicitamente public,
} y no se permiten modificadores de acceso ni siquiera public.
Declaracin clase
implementadora

[modificador acceso] class Prueba : ITest Clase que implementa el interface ITest implementando su mtodo int Cal.
{ En la declaracin de la clase, se separa con : el interface implementado.
Si la clase derivara de una clase base, el interface(s) aparecera tras la clase base.
int Cal ( int x, int y, int z) {..implementacin..} [modificador acceso] class Prueba : ClaseBase1 , ITest , ITest1
}
Que la clase implementa un interface se denota con la
misma notacin como si la clase derivara del interface.

La documentacin .NET especifica al detalle las condiciones requeridas a un mtodo para implementar un Interface.
A. P. Visual C# 2010 v.1 71
Uso de los interfaces
Al ser los interfaces tipos, .NET, se pueden disear mtodos que toman interface(s) como parmetros.

Exponer mtodos : [implementa]


Implementar : herencia Seleccionar
Una clase slo
Una clase puede implementar
Interface I1 Clase A : I1, I2 varios interfaces (I1, I2). Clase A1 : A hereda de 1 clase,
su clase base (A).
Mtodo M11( ) Mtodo M11( ) Mtodo M11 ( I1 )
Mtodo M12( ) Mtodo M12( ) Mtodo M12 ( I1 )
Mtodo M13( ) Mtodo M13( ) Mtodo M13 ( I1 )

: A
: I1,I2

Slo declaraciones Mtodo M90() Estas clases son objetos de I1 e I2.

Interface I2 Mtodo M91() Clase A2 : A


Mtodo M21( ) Mtodo M21( ) Mtodo M21 ( I2 )

Mtodo M22( ) Mtodo M22( ) Mtodo M22 ( I2 )


Slo declaraciones Implementaciones en clases Mtodos con un interface como argumento.
Esto expone ciertos mtodos de la clase A,
(los del interface referenciado) ocultando otros.

Las interfaces se usan para dar ms potencia y flexibilidad al uso de clases:


Exponiendo mtodos (M11, M12, M13) de clase (A) a travs de interface (I1), y ocultando el resto a A1.
Exponiendo mtodos (M21, M22) de clase (A) a travs de interface (I2), y ocultando el resto a A2.
Forzando a una clase a implementar un determinado interface.

A. P. Visual C# 2010 v.1 72


Polimorfismo
El polimorfismo en los lenguajes humanos es la posibilidad de utilizar la misma palabra con significados distintos segn el contexto.
En lenguajes de programacin es usar un bloque de cdigo con resultados distintos segn el contexto u objeto sobre el que aplica.
El polimorfismo pretende consiguir la reduccin de cdigo, a travs de permitir a un bloque de cdigo tener mltiples formas.
El polimorfismo se produce al variar la implementacin de un mtodo o propiedad. Este proceso se conoce por overloading (sobrecarga).
Podemos crear varias funciones con el mismo nombre pero con diferentes parmetros y por tanto con diferente comportamiento.
Los mtodos o propiedades polimrficos son por definicin overridable (sobreescribibles).
Este polimorfismo o sobrecarga se consigue:
- a travs de la herencia declarando virtual los mtodos modificables y modificando su implementacin en las clases derivadas,
- a travs de interfaces, que definen mtodos abstractos que se desarrollan de manera distinta en las clases implementadoras.

Mtodo (argumentos1)
Polimorfismo (Sobrecarga)

Mtodo (argumentos2) Mtodo (argumentos)

Mtodo (argumentos3)

Mismo mtodo, diferentes argumentos diferentes comportamientos.

A. P. Visual C# 2010 v.1 73


Interfaces y Polimorfismo
Un interface es un tipo de referencia. No se puede acceder directamente a un interface a travs de objetos de clases.
Se puede, sin embargo, obtener una referencia al interface convirtiendo la referencia del objeto de clase al tipo interface.
Una vez obtenida la referencia al interface, se usa la notacin de punto (.) con la refencia para acceder a los miembros del interface.

interface IDuplo
{ Interface Distinta implementacin !
int Doble (int x) ;
}
Clase implementadora Clase implementadora

public class Duplo1 : IDuplo public class Duplo2 : IDuplo


{ {
public int Doble (int x) ; public int Doble (int x) ;
{ Clase { Clase
return x * 2 ; return x + 2 ;
} }
} }

Objetos de las clases que


Duplo1 d1 = new Duplo1 implementan la interface IDuplo Duplo2 d2 = new Duplo2

IDuplo id1 = (IDuplo) d1; Convierte a tipo interface los objetos d1 y d2 IDuplo id2 = (IDuplo) d2;
para poder acceder a mtodo(s) del interface

public void Calcular (IDuplo Id, int x )


{
MessageBox .Show(Id.Doble(x).ToString()) ;
}
Mtodo con parmetro de tipo interface.
Accede a mtodo declarado en interface
e implementado en clases base de los objetos.
Calcular (d1, 5) ; Calcular (d2, 5) ;
Muestra 10 Muestra 7

Polimorfismo mediante interface : uso del mismo mtodo con diferentes comportamientos segn los argumentos pasados (d1 d2).
A. P. Visual C# 2010 v.1 74
Herencia y Polimorfismo
public class Duplo
{
virtual public int Doble (int x)
{ Clase base
return x * 2 ;
}
Implementacin modificada !
} Implementacin modificada !

Duplo d = new Duplo


Clase derivada Clase derivada
public class Duplo1 : Duplo
public class Duplo2 : Duplo
{
{
override public int Doble (int x)
override public int Doble (int x)
{
{
return x 2 ; Clase Clase
return x + 2 ;
}
} }
}

Duplo1 d1 = new Duplo1 Objetos de las clases Duplo2 d2 =new Duplo2

public int Calcular (Duplo cd, int x)


{
MessageBox.Show (cd.Doble(x).ToString()) ;
}

Mtodo con parmetro de tipo clase.


Accede a mtodo declarado virtual en clase base,
y sobreescrito en clases derivadas.

Calcular (d1, 5) Calcular (d, 5) Calcular (d2, 5)


Muestra 3 Muestra 10 Muestra 7

Polimorfismo mediante herencia : uso del mismo mtodo con diferentes comportamientos segn los argumentos pasados (d,d1, d2).

A. P. Visual C# 2010 v.1 75


Acceso a miembros de interfaces
El operador (.) se usa para acceder a miembros de un interface desde fuera de l.

Los interface son tipos de referencia.


No se puede acceder directamente a un interface a
travs de objetos de sus clases implementadoras.
Se puede, sin embargo, obtener una referencia al
interface convirtiendo la referencia del objeto de
clase al tipo interface.
Una vez obtenida la referencia al interface, se usa
la notacin de punto (.) con la refencia para
acceder a los miembros del interface.

Interface IA clase Implementadora : IA


{
Metodo1 Metodo1 { ....}
.........
}
Propiedades
objeto i1
i1.Mtodo1 ();
Eventos

Indexers Conversin de referencia de objeto i1 a referencia tipo interface n1.


IA n1 = (IA) i1
Esto es posible, porque el objeto i1 es de una clase que implementa IA.

Llamada a mtodo de interface IA mediante notacin de punto (. dot).


n1.Metodo1(); Permite discriminar el interface origen del mtodo, lo que puede ser necesario
cuando la clase implementa 2 mtodos con igual nombre y de 2 interfaces.

A. P. Visual C# 2010 v.1 76


Interfaces vs Abstract Classes
Clases abstractas e Interfaces tienen en comn los miembros abstractos que ambos exponen.
Mientras que una clase derivada slo puede acceder a los miembros de la lnea de su clase base,
puede implementar cuantos interfaces sean convenientes a su necesaria funcionalidad.

Clase Abstracta1

Una clase slo puede derivar de una Una clase derivada de una clase
sola clase base, y por tanto abstracta debe implementar todos
implementar en todo caso, los los miembros abstractos de la clase,
miembros (abstractos) de dicha los use o no, mediante override,
clase base y su lnea jerrquica. a no ser que ella misma sea Interface1
No de otras clases fuera de esa lnea declarada abstracta.

Clase Derivada1 : Abstracta1, Interface1,Interface2, Interface3 Interface2

La clase Derivada1 debe implementar todos los miembros de los interfaces que
decida implementar, y puede hacerlo de varios interfaces.

Interface3

A. P. Visual C# 2010 v.1 77


Indice
Interfaces pblicos
Los interfaces no tienen utilidad hasta que son implementados por alguna clase o estructura.

namespace
Ejemplos de interfaces predefinidos en librera de clases BCL*, subconjunto de FCL*.
System Estos interfaces representan un contrato que los desarrolladores deben respetar System.Collections
para garantizar a sus consumidores el uso de sus clases que los implementan.

public interface IComparable public interface IEnumerator


Interface { { Interface
bool MoveNext ();
int CompareTo ( object obj ) ; object Current { get;}
Compara objeto actual Admite una iteracin simple.
con otro mismo tipo . } void Reset ();
}

Interface public interface ICloneable public interface IEnumerable Interface


{ {
Crea nuevo objeto object Clone ( ) ; IEnumerator GetEnumerator();
Expone el enumerador, que admite
copiado del actual.
} } una iteracin simple.

Implementar estas interfaces predefinidas, permite disponer de funcionalidades como clonar, ordenar, y enumerar.
Dichas funcionalidades son asimismo accesibles a travs del uso de clases derivadas de otras que las implementen.

La documentacin .NET especifica al detalle las condiciones requeridas a un mtodo para implementar un Interface.
* BCL = Base Class Library subconjunto de FCL = Framework Class Library
A. P. Visual C# 2010 v.1 78
Indice
Enumeraciones [enum ]

El tipo enum permite definir un conjunto de posibles valores o estados.


Una enumeracin [ enum ], es un tipo personalizable como una clase (class) o una estructura (struct).

[modificador acceso] enum Zona {Norte, Centro, Sur} : [ tipo int ]


Una Enumeracion es un conjunto de pares nombre/valor. Opcional:
Al primer nombre se asigna el valor entero 0, y as sucesivamente. Se puede definir el tipo de los valores
Este valor se puede forzar a voluntad en la asignacin. entre los tipos enteros .
Puede haber algn valor duplicado, pero no nombres duplicados. Por defecto es del tipo int.

enum Zona
{
MessageBox.Show(((int) Zona.Centro).ToString());
Norte, Centro, Sur string z1 = Zona.Centro;
} Acceso por nombre
Asignacin por defecto,
valores enteros desde 0.
int z2 = (int) Zona.Centro;
MessageBox.Show( Zona.Centro.ToString());
Acceso por valor

enum Zona 2 tipos de accesos a las enumeraciones


{
Norte = 10, Centro = 20, Sur= 30
} MessageBox.Show(((int) Zona.Centro).ToString());
Asignacin forzada

Las enumeraciones son tipos de valor y guardan sus datos directamente en la memoria de pila [stack].
Enums slo tienen un tipo de miembros: constantes con nombre y valores enteros.
A. P. Visual C# 2010 v.1 79
Indice
Estructuras [ struct ]
Una estructura se usa en lugar de una clase cuando se desea disponer de un tipo de valor.
Cada instancia de una estructura se guarda en la memoria de pila que es ms rpida y eficiente.
Las estructuras no soportan herencia, salvo la de derivar implicitamente de System.ValueType.

struct NombreStruct
{ Una struct puede tener todos los miembros de una clase, salvo constructor sin parmetros
// ...miembros (que es aadido automaticamente), destructor, y miembros virtuales.
}
Esquema definicin de estructura

struct Point struct Point


Sin constructor.

Definicin struct con constructor.


{ {
public int X; public int X;
public int Y; public int Y;
} public Point (int x1, int y1)
{
Constructor
class Programa X = x1; con parmetros
{ Y = y1;
static void Main() }
{ }
Point eje= new Point();
eje.X = 10; eje.Y = 10; class Programa
} {
} static void Main()
{
Al ser instanciada con new Point ( ), se asignan valores iniciales por defecto. Point eje= new Point(10,10);
Se puede instanciar, sin new, en cuyo caso no se asignan valores. }
}
Instanciacin e inicializacin
A. P. Visual C# 2010 v.1 80
Indice
Delegados [Delegates]
Un delegado es un tipo personalizable, como una clase, que apunta a uno o ms mtodos.
Delegados que hacen referencia a ms de un mtodo se llaman multimtodo [multicast delegates]. Todos tienen misma firma y retorno.
No necesitan declararse dentro de una clase, ya que es un tipo.
Nombre [Convencin: Nombre+Delegate en Pascal ]
Valor de
retorno Firma

Clases Delegados Declarar un nuevo tipo delegado con firma y tipo de retorno.
Declarar tipo Declarar Clase Declarar Delegado delegate int Multiplicar (int x) ;
Declarar una variable delegado del nuevo tipo delegado.
Declarar Declarar variable Declarar variable
variable del tipo de la clase del tipo delegado
MultiDelegate t ;
del tipo
Crear objeto del tipo delegado, y asigna a variable delegado.
El nuevo objeto delegado incluye una referencia a un mtodo
Crear instancia Crear instancia con la misma firma definida en la declaracin.
Instanciar de la clase y asignar su del delegado, asignar su t = new Multiplicar (Duplicar); t = Duplicar;
referencia a la variable referencia con el 1
mtodo a la variable. int Duplicar (int x) { return x * 2}; Es un posible mtodo de t.
Otros podran ser int Triplicar(int x){return x*3};,
Aadir mtodos : t +=Triplicar;
t=Quintuplicar;. int Quintuplicar (int x) {return x*4}; , etc.
Quitar mtodos : t -= Duplicar; . Todos con misma firma y retorno declarados en delegado !.
Se forma as la lista de invocacin t = Duplicar; es una forma vlida abreviada de hacer lo mismo.
de los llamados multicast delegates.
En el cdigo se invoca al delegado, como si fuera un mtodo,
y se ejecutan sus mtodos, pasando a todos el mismo argumento.
Usar la
variable Usar el objeto Invocar objeto delegado int result = t (3) ; int result = t. Invoke (3);
Sus propiedades y mtodos. Se invocan todos mtodos de la lista. Tambin es vlido int result =t. Invoke (3);

A. P. Visual C# 2010 v.1 81


Delegados [continuacin]
Un Delegado es un tipo seguro que hace referencia a uno o ms mtodos, cuya firma y retorno
coinciden con la declarada en el delegado, y que puede ser invocado en Runtime.
Los delegados son objetos que contienen una referencia a algn mtodo de algn otro objeto.

int Duplicar (int x ); Mtodos con firma susceptibles


de llamada por objetos del
delegado MultiDelegate.
Los mtodos referenciados
Declaracin [public] delegate int Multiplicar (int x); int Triplicar (int x ); pueden ser de cualquier clase o
estructuraque tengan mismo
tipo de retorno y misma firma.
Los mtodos invocados pueden
La declaracin define un tipo de datos basado ser mtodos de instancia o
en una firma determinada. int Quintuplicar (int x ); mtodos estticos [static].

Alternativa opcional creacin variable e instanciacin en 1 lnea


Multiplicar t; Multiplicar t = new Multiplicar (Triplicar);
Instanciacin t= new Multiplicar (Triplicar);
Creain de un objeto Delegado con mtodo deseado como parmetro. Creacin de un objeto Delegado con mtodo deseado como parmetro.
Forma simplificada a partir de C#2.0 : t =Triplicar; Forma simplificada a partir de C#2.0 : Multiplicar t = Triplicar;

La declaracin de un delegado hace que se cree


internamente una clase sealed, con 3 mtodos:
Invoke, BeginInvoke y EndInvoke,
Invocacin int result = t ( 3); cuyos parmetros y retorno de la declaracin.
Invoke() se usa para llamar sincronamente a
Invocacin del mtodo, con el argumento de firma del objeto. cada mtodo registrado en el delegado.
t en realidad llama al mtodo Invoke de la clase creada por el runtime. BeginInvoke() y EndInvoke() llaman al mtodo
Tambin posible : int result = t.Invoke (3); actual asincronamente en un hilo separado de
ejecucin proporcionado por el delegado.
A. P. Visual C# 2010 v.1 82
Indice
Delegados : mtodos annimos y expresiones lambda
Los mtodos annimos y las expresiones lambda constituyen 2 formas simplificadas de acceder y
definir mtodos del delegado, habilitadas a partir de C# 2.0 y C# 3.0 respectivamente.

Un mtodo separado que se incluye C# 2.0 C# 3.0


por su nombre en el delegado.
Es la forma normal.
Un mtodo annimo se declara en Las expresiones Lambda son una
int Triplicar (int x)
lnea, al instanciar el delegado. forma alternativa de asignar
{
No existe como mtodo separado, al
return x*3 mtodos a delegados de forma
que se pueda llamar por su nombre
} an ms simplificada.
desde otro sitio. Se define en el
=> es el operador Lambda.
delegado al declararlo.
delegate int Multiplicar (int x); delegate int Multiplicar (int x); delegate int Multiplicar (int x);
Multiplicar int t = new Multiplicar (Triplicar); Multi tri = delegate (int x) Multiplicar tri => (int x)
{ {
return x*3 return x*3
} }
int Duplicar (int x) Introducido con C# 2.0
{ return x*2 } delegate int Multiplicar (int x);
Multiplicar tri => x
int Triplicar (int x)
{ return x*3 }
{
return x*3
} Opciones
If (a=true) cuando
{ t = new Multiplicar (Triplicar); } existe un
else delegate int Multiplicar (int x); solo
{ t = new Multiplicar (Duplicar) ; } parmetro
Multiplicar tri => x
.... {
Console.WriteLine (t (x)); x*3
}
Aqui en la sentencia final, la variable delegado t se usa
como parmetro de la funcin WriteLine que ejecutar Introducido con C# 3.0
a su vez la funcin marcada en la decisin del delegado.
A. P. Visual C# 2010 v.1 83
Indice
Eventos : modelo simplificado
Un evento es un mensaje que enva un objeto cuando ocurre una accin, a la que procede una reaccin.
Los eventos en C# se basan en un modelo de delegado, que acta como intermediario entre el origen del evento
y el cdigo que finalmente responde al evento.

Se genera el evento

Emisor Delegado Suscriptor[es]


Declaracin evento Suscriptores registran
del tipo Delegado. controladores de eventos
en el delegado.

Llamada a controladores registrados

Controlador evento 1 Respuesta al evento

Controlador evento 2 Respuesta al evento

A. P. Visual C# 2010 v.1 84


Modelo simplificado de eventos (continuacin)
Un evento es un mensaje que enva un objeto cuando ocurre una accin, a la que procede una reaccin.
Los eventos en C# se basan en un modelo de delegado, que acta como intermediario entre el origen del evento
y el cdigo que finalmente responde al evento.

Se genera el evento, y
a travs del delegado se
invoca a mtodo(s)
controlador(es).

Suscriptor1
Cdigo que genera
el evento. ControlEvento1 (firma)
evento (firma);
delegate void delegado (firma);
Clase emisora Lista de llamadas
[controladores registrados
[Publisher o con la misma firma y
Broadcaster] retorno del delegado]
Suscriptores registran
controladores de eventos
Declaracin evento evento += new delegado(ControlEvento1); en el delegado con
del tipo Delegado. operadores += y .=. Suscriptor2
event delegado evento; evento += new delegado(ControlEvento2);
ControlEvento2 (firma)

Un evento es un miembro de Llamada a controladores registrados en delegado


una clase [emisora].

ControlEvento1 (firma)
Los controladores de evento
pueden ser de la misma clase del
ControlEvento2 (firma) emisor o de clases diferentes.
Registro tambin posible:
Pueder ser mtodos estticos
evento += ControlEvento1; Se llaman sucesivamente todos los controladores registrados,
o de instancia.
evento += ControlEvento2; con los mismos argumentos para todos ellos.
Pueden ser mtodos annimos o
expresiones lambda.
A. P. Visual C# 2010 v.1 85
Eventos : pasos necesarios
Cdigo necesario para la gestin de eventos
Clase Emisora La declaracin del Delegado y el registro de
Declaracin
1 Delegado
controladores pueden ir fuera de la clase emisora.
Objeto que genera evento Informacin adicional Si el delegado se declara dentro de la clase, puede
llevar prefijos public, protecte, internal o private.
public delegate void EventHandler ( object sender, EventArgs e ) ;
El delegado EventHandler es un tipo delegado predefinido, dentro del espacio System.
Se podra usar un delegado existente, pero es recomendable usar el estandar definido.
Clase Suscrita
El delegado define la firma de los eventos que lo usan y de los controladores que se registran en l. Se pueden suscribir varios controladores a un mismo
evento, y todos sern llamandos al generarse el
Declaracin
2 Evento
evento. Estos pueden ser controladores que forman
parte de la clase que genera el evento, o
Tipo Delegado Nombres de eventos separados por comas controladores definidos en otras clases (suscritas).

public [static] event EventHandler evento1;


Se declara dentro de la clase emisora. Este evento se tratar a travs del delegado EventHandler.
[static] es la clase la que registra el evento, no sus instancias. os es un
objeto de
la clase Declaracin
Registro
+= Aadir controlador
-= Quitar controlador Evento(s)
4 Suscrita 3 Controladores
oe es un Evento(s)
[tambin en runtime]
objeto de
la clase
oe.Evento1 += new EventHandler(os.Control1);
emsora public void Control1 (object source, EventArgs args);
Registro a travs de delegado predefinido EventHandler. {
[static] es la clase la que registra el evento, no sus instancias. ....
Estas 2 formas de }
registrar eventos oe.Evento1 += os.Control1; Declaracin de controlador de evento en clase suscrita,
cdigo que genera son vlidas.
5 el evento Forma simplificada a partir de C# 2.0. con misma firma declarada en el delegado del evento,
[static] es la clase la que registra el evento, no sus instancias. y cuyo nombre suele ser el nombre del evento seguido
de EventHandler.
evento1 (source, args) ; Puede ser un mtodo de instancia o de clase.
Debe registrarse para el evento al que responde.
Generacin del evento con nombre evento y parmetros.
Puede ser mtodos annimos o expresiones lambda.
Slo desde la propia clase que lo define.
A. P. Visual C# 2010 v.1 86
Eventos : qu delegado usar
Aunque los eventos de las clases que defina se pueden basar en cualquier tipo de delegado vlido, normalmente
es aconsejable que los eventos se basen en el modelo de .NET Framework a travs del delegado EventHandler.

delegate void delegadovalido (firma); Los eventos pueden usar cualquier delegado vlido, incluso sin firma.

Recomendado [si no se devuelven datos]


La firma de EventHandler define mtodos que no devuelven un valor.
El 1 parmetro es de tipo object y es el objeto que genera el evento.
delegate void EventHandler (object sender, EventArgs e); El 2 parmetro deriva de EventArgs y contiene los datos de evento.
No necesita declararse. Incluido en System.
Si el evento no genera datos de evento, el 2 parmetro es
simplemente el valor del campo EventArgs.Empty .

Recomendado [si se devuelven datos]


La clase de datos de eventos personalizada FinalEventArgs, deriva
delegate void FinalEventHandler (object sender, FinalEventArgs e); de la clase EventArgs, y debe almacenar el dato a pasar como
campo o como propiedad de un objeto e de la clase [ ej. e.dato].
El nombre de la clase de datos de eventos personalizada debe
public class FinalEventArgs : EventArgs public class FinalEventArgs : EventArgs
finalizar con EventArgs.
{ {
private string dato; // campo privado public string dato;
public string Dato //propiedad }
{
Como campo [e.dato]
get {return dato; }
set { dato = value ; }
}
}
Como propiedad [e.Dato]

Recomendado : delegado genrico [si se devuelven datos]


Si el evento genera datos, se puede usar la clase
delegado genrico EventHandler<TEventArgs>.
delegate void EventHandler <TEventArgs> (object sender, TEventArgs e);

A. P. Visual C# 2010 v.1 87


Controladores de eventos [EventHandlers]
Los controladores de eventos son esencialmente mtodos.
Su condicionante es que deben tener el mismo tipo de retorno y la misma firma que el delegado del evento.
Como nombre se recomienda el nombre del evento concatenado con EventHandler.
Pueden ser mtodos de instancia o estticos. Pueden ser mtodos annimos o expresiones lambda.
Deben registrarse con el delegado del evento al que responden.

delegate void delegadovalido (firma);

Declaracin de
controlador evento
de una clase
[modificadoracceso] tiporetorno Evento1EventHandler (firma)
suscrita al evento.

Registro
Registro
Evento(s)

oe.evento1 += new delegadovalido (os.Evento1EventHandler);


+= Aadir controlador Estas 2 formas de oe es un objeto de la clase emsora
-= Quitar controlador registrar eventos os es un objeto de la clase suscriptora
[tambin en runtime] son vlidas.

oe.evento1 += os.Evento1EventHandler;
Forma simplificada de registro a partir de C# 2.0. [method group conversion]

Si el evento es static,
la clase registra el evento
clase.evento1 += os.Evento1EventHandler; Evento static

A. P. Visual C# 2010 v.1 88


Generacin del evento [Raise event]
Dentro de la clase emisora del evento, se necesita cdigo que lance el evento en el momento apropiado.
Antes de proceder con el evento, procede comprobar que hay algn controlador de evento registrado.
Lanzar el evento es como llamar a un mtodo, declarando nombre del evento con sus parmetros.

OnEvento1 (argumentosfirma) En alguna parte del programa se aloja la llamada al mtodo OnEvento1, que se produce
cuando se dan las condiciones de ocurrencia del evento.
.... Se sugiere el nombre OnEvento1 para este mtodo.
.... Con la firma se pueden pasar como argumentos datos, como objeto emisor, etc.
public class EmisoraEjemplo Ejemplo con: delegate void delegadovalido(object sender); //delegado
{ public void Evento1EventHandler(object sender) {...} / /controlador
....
.... OnEvento1(azul); //azul es el objeto emisor en este ejemplo
public event delegadovalido Evento1; ....
.... ....
public void OnEvento1(firma) Evento1(sender); //bajo sender se enva azul al controlador
....
{
If (Evento1 != null)
Evento1 (firma) ;
}
..
}

En la clase emisora se incluye un mtodo con el


nombre (recomendado) OnEvento1 que: delegate void delegadovalido (firma);
- comprueba que el evento tiene controladores
registrados (si no los tuviera, se dara un error).
- lanza el evento invocando el evento como un
mtodo con nombre y firma.
[modificadoracceso] void Evento1EventHandler (firma)

A. P. Visual C# 2010 v.1 89


Ejemplo simple de eventos : planteamiento

class Carrera
Partimos de la clase Coche a la 1

que queremos aadir un evento Coche c1 = new Coche() ;


que se producir cuando el c1.color = verde;
campo recorrido de sus objetos c1.numero = 1; 1
(coches) alcancen un c1.recorrido = 0 ;
determinado valor (meta).

class Coche 2

Coche c2 = new Coche() ;


c2.color = rojo;
c2.numero = 2; 2
c2.recorrido = 0 ;

3
Coche c3 = new Coche() ;
c3.color = azul;
public string color ;
public int numero ; c3.numero = 3; 3
public int recorrido ; c3.recorrido = 0 ;

En una carrera participan 3 coches.


Su campo recorrido se hace avanzar por algn mtodo (no contemplado).
Cuando el campo recorrido de alguno de los objetos (coches) llegue a un
valor predeterminado (Meta) se lanzar un evento que marcar el ganador.

A. P. Visual C# 2010 v.1 90


Ejemplo simple de eventos : pasos previos
class Carrera
public delegate void EventHandler ( object sender, EventArgs e ) ;
Declaracin del delegado que tratar el evento Final. Es el recomendado en C#.
Podra ser cualquier delegado vlido, respetando su firma y tipo de retorno.

Registro de controlador(es)
c1.Final += new System.EventHandler(Llegada); (Llegada) con el delegado
c2.Final += new System.EventHandler(Llegada);
c3.Final += new System.EventHandler(Llegada); 1
Coche c1 = new Coche() ;
Si el evento se declara static, bastara con un slo controlador c1.color = verde;
1
Coche.Final += new System. EventHandler(Llegada); c1.numero = 1;
public static event EventHandler Final ; // evento static c1.recorrido = 100 ;

class Coche
Coche c2 = new Coche() ; 2

c2.color = rojo;
c2.numero = 2; 2
Slo falta que c2.recorrido = 200 ;
aparezca el
evento !
Coche c3 = new Coche() ; 3
Algn cdigo se encarga de hacer
public string color ; c3.color = azul;
avanzar el recorrido de cada coche 3
public int numero ; c3.numero = 3;
[no contemplado aqu].
public int recorrido ; c3.recorrido = 300 ;

public event EventHandler Final; public void Llegada (object sender, EventArgs e);
{
Declaracin del evento declarando MessageBox.Show (Ganador: + sender.ToString()) ;
el delegado al que se acoje. }
Controlador que evento que actuar en respuesta al evento, una vez registrado.
Puede ser un slo controlador, o bien tantos controladores como objetos (coches).

A. P. Visual C# 2010 v.1 91


Ejemplo simple de eventos : generacin del evento
class Carrera
public delegate void EventHandler ( object sender, EventArgs e ) ;

c1.Final += new System.EventHandler(Llegada);


c2.Final += new System.EventHandler(Llegada);
3 c3.Final += new System.EventHandler(Llegada);
1

Coche c1 = new Coche() ;


class Coche c1.color = verde;
4 1
c1.numero = 1;
c1.recorrido = 100 ;

2
Aqui llega el evento !
Coche c2 = new Coche() ;
c2.color = rojo;
.... 2
c2.numero = 2;
If (c1.recorrido >= meta) c2.recorrido = 200 ;
{OnFinal (verde, EventArgs.Empty);}
public string color ; If (c2.recorrido >= meta)
3
public int numero ; {OnFinal (rojo, EventArgs.Empty);} Coche c3 = new Coche() ;
public int recorrido ; If (c3.recorrido >= meta) c3.color = azul;
{OnFinal (azul, EventArgs.Empty);} c3.numero = 3; 3
public event EventHandler Final; .... c3.recorrido = 300 ;

Aqui se generan los


1 datos del evento.
public void Llegada (object sender, EventArgs e);
2 {
MessageBox.Show("Ganador: " + sender.ToString()); // sender = azul en este caso
public void OnFinal (object sender, EventArgs e)
}
{
If (Final != null) //se comprueba que hay algn controlador registrado Aunque hay un slo controlador, a travs de sender se obtiene el coche ganador.
Final (sender, e) ; //se lanza el evento, como si fuera un mtodo normal En este caso a travs de su campo color [azul es el ganador].
} Se podran haber escrito 3 controladores, uno para cada coche, con lo cual la
asignacin al ganador sera inmediata, sin recurrir al paso del parmetro sender.

A. P. Visual C# 2010 v.1 92


Indice
Cdigo simplificado del ejemplo Carrera
using System; Se han eliminado
... Sentencias using public class Coche
using System.IO; todos los detalles {
salvo los relativos al public string Name;
namespace WPFCarrera evento Final. public int CarNum;
{ public string CarCol;
public partial class Carrera : Window public int CarPos; //este campo detectar la Meta 1
{
public static event EventHandler Final; //Declaracin Evento
static Coche c1 ;
static Coche c2;
static Coche c3; public void OnFinal(object sender, EventArgs e) 5
static int Meta = 1400; 2 {
if (Final != null) //se comprueba haya algn controlador registrado
public delegate void SystemEventHandler(object sender, EventArgs e); Declaracin Delegado {
Final(sender, e); //se lanza evento como un mtodo normal
public Carrera ( ) }
{ }
InitializeComponent ( );
public Coche() { }
c1 = new Coche("Coche1", 1, "verde", 0);
c2 = new Coche("Coche2", 2, "rojo", 0); public Coche(string CarName1,int CarNum1, string CarCol1, int CarPos1)
c3 = new Coche("Coche3", 3, "azul", 0); {
Name = CarName1;
Coche.Final += new System.EventHandler(Llegadacompleta);
3 Asignacin controlador
al evento Final de Coche
CarNum = CarNum1;
} CarCol = CarCol1;
public void Llegadacompleta(object sender, EventArgs e) Controlador que CarPos = CarPos1;
{ responde al evento, }
MessageBox.Show("Ganador: " + sender.ToString()); 6 presentando ventana }
} con color del ganador. }
public void Tick (object sender, EventArgs e) //sin detalles
{
Acumular();
}
public void Acumular()
{ Deteccin del evento, uno
//no se detalla como se efecta la acumulacin en campo CarPos. por cada objeto. No se
Carrera.c1.OnFinal("verde", EventArgs.Empty); indican los detalles de
Carrera.c2.OnFinal("rojo", EventArgs.Empty); alcanzar la Meta.
Carrera.c3.OnFinal("azul", EventArgs.Empty); 4 En la llamada que se hace
} al mtodo OnFinal se
} incluye el color del
ganador como argumento.

A. P. Visual C# 2010 v.1


Ventana del programa de ejemplo Carrera
93
Indice
Eventos de controles
Utilizar el entorno de desarrollo (IDE) Visual C# para ver los eventos de un control y seleccionar los que desea controlar.
El IDE agrega automticamente un mtodo de controlador de eventos vaco y el cdigo para suscribirse al evento.
Evento Descripcin
Click Cuando se hace click sobre un control. A veces cuando se pulsa la tecla Enter.
DoubleClick Cuando se hace dobleclick sobre un control. Tratar el evento click, hace inaccesible DoubleClick.
DragDrop Cuando se completa una operacin de arrastrar y soltar. Un objeto ha sido arrastrado sobre el control, y se suelta el botn del ratn.
DragEnter Cuando un objeto que est siendo arrastrado entra los lmites del control.
DragLeave Cuando un objeto que est siendo arrastrado sale de los lmites del control.
DragOver Cuando un objeto ha sido arrastrado sobre el control.
KeyDown Cuando se pulsa una tecla mientras el control tiene el foco. Ocurre siempre antes de KeyPress y KeyUp.
KeyPress Cuando se pulsa una tecla mientras el control tiene el foco. Ocurre siempre trasKeyDown y antes de KeyUp.
La diferencia entre KeyDown y KeyPress es que KeyDown pasa el cdigo de teclado de la tecla pulsada, mientras que KeyPress para su valor char.
KeyUp Cuando se suelta una tecla mientras un control tiene el foco. Ocurre siempre tras KeyDown y KeyPress.
GotFocus Cuando un control recibe el foco.
LostFocus Cuando un control pierde el foco.
MouseDown Cuando el puntero del ratn est sobre un control y se pulsa un botn del ratn.
No es el mismo que Click porque MouseDown ocurre tan pronto como el botn es pulsado y antes de que se suelte.
MouseMove Ocurre continuamente al desplazar el ratn sobre el control.
MouseUp Cuando el puntero del ratn est sobre un control y se suelta un botn del ratn.
Validated Cuando un control que tiene puesta en true la propiedad CausesValidation est a punto de recibir el foco.
Se lanza despus de finalizar el evento Validating indicando que la validacin se ha completado.
Validating Cuando un control que tiene puesta en true la propiedad CausesValidation est a punto de recibir el foco.
Notar que el control a ser validado es el control que est perdiendo el foco, no el que lo est recibiendo.
Paint Cuando se ha trazado el control.

private void bSalir_Click(object sender, RoutedEventArgs e) { ...................} // controlador agregado automaticamente por el IDE al hacer click en botn bSalir.

A. P. Visual C# 2010 v.1 94


Indice
Timers - I
La clase Timer genera eventos - Elapsed - a intervalos regulares de tiempo en aplicaciones de CONSOLA.

Namespace
Consola
System.Timers
Ejemplo: aparecer por pantalla un texto a cada intervalo de tiempo.
clase
Timer using System; Se crea objeto Timer
using System.Timers; de nombre timer1, se
le asigna un intervalo
namespace ConsolaTimer de 1000 ms.
Start()
{ El objeto timer1
class Programa genera el evento
Stop()
mtodos

{ Elapsed, y el delegado
static string VerTxto= Consola"; ElapsedEventHandler,
Timer() Timer timer1 = new Timer(); static void Main ( ) llama al mtodo
constructores { Escribe al que apunta,
Timer timer1 = new Timer(1000) ; Timer timer1 = new Timer(1000); el cual presenta el
Timer(ms)
timer1.Elapsed += new ElapsedEventHandler(Escribe); texto de la variable
timer1.Start(); VerTxto.
Console.ReadKey();
propiedades

Interval timer1.Interval = 1000;


}
En milisegundos
static void Escribe(object source, ElapsedEventArgs e)
Enabled {
Console.Write(VerTxto);
Console.WriteLine();
Evento Elapsed }
}
}

Hay otras clases Timer en .NET: en System.Threading [WPF], y en System.Windows [Windows Forms].
A. P. Visual C# 2010 v.1 95
Timers - II
La clase DispatcherTimer genera eventos - Tick - a intervalos regulares de tiempo en aplicaciones WPF.

Namespace
WPF System.Windows.Threading
Ejemplo: aparecer por pantalla un texto a cada intervalo de tiempo.
clase
Se crea objeto Timer using System; DispatcherTimer
de nombre timer2, se using System.Windows;
le asigna un intervalo using System.Windows.Threading;
de 1000 ms.
El objeto timer2 Start()
namespace WpfApplicationTimer

mtodos
genera el evento Tick, {
y el delegado Stop()
public partial class MainWindow : Window
EventHandler llama al
mtodo Tick al que { DispatcherTimer()
apunta, el cual genera public MainWindow() constructor
la ventana de texto. {

propiedades
InitializeComponent(); Interval
DispatcherTimer timer2 = new DispatcherTimer();
timer2.Interval = TimeSpan.FromMilliseconds(1000);
IsEnabled
timer2.Tick += new EventHandler(Tick);
timer2.Start();
} Tick Evento
static void Tick(object source, EventArgs e)
{ MessageBox.Show("DispatcherTimer"); }
}
}

Hay otras clases Timer en .NET: en System.Timers [CONSOLA], en System.Windows.Forms [Windows Forms].
A. P. Visual C# 2010 v.1 96
Indice
Timers - III
La clase Timer genera eventos - Tick- a intervalos regulares de tiempo en aplicaciones Windos FORMS.

Namespace

System.Timers Windows Forms


Ejemplo: aparecer por pantalla un texto a cada intervalo de tiempo.
clase
Timer using System; Se crea objeto Timer
using System.Windows; de nombre timer3, se
le asigna un intervalo
namespace FormsTimer de 1000 ms.
Start()
{ El objeto timer3
public partial class Form1 : Form genera el evento Tick,
Stop()
mtodos

{ y el delegado
public Form1() EventHandler llama al
Timer() Timer timer3 = new Timer(); { mtodo Tick al que
constructor InitializeComponent(); apunta, el cual genera
Timer timer3 = new Timer(); la ventana de texto.
timer3.Interval = 1000;
timer3.Tick += new EventHandler(Tick);
propiedades

Interval timer3.Interval = 1000;


En milisegundos
timer3.Start();
}
Enabled static void Tick(object source, EventArgs e)
{
MessageBox.Show(FormsTimer");
Evento Tick }
}
}

Hay otras clases Timer en .NET: en System.Threading [WPF], en System. TimerS [CONSOLA].
A. P. Visual C# 2010 v.1 97
Indice
Entradas/Salidas por consola

Espacio de nombres Espacio de nombres

System System
Clase Console Clase Console

Console Console

Console.Read( ); Console.Write( );
Console.ReadLine( ); Console.WriteLine( );
Console.ReadKey( );

La diferencia entre Write y WriteLine es que


La diferencia entre Read y ReadLine es que WriteLine incluye un salto de lnea al final
ReadLine lee despus de detectar ENTER. del texto y Write no.

Ejemplo de sentencia WriteLine.


Console.WriteLine(El resultado es {0} y {1}.", 5, 9);
{0} y {1} son marcadores que sealan la posicin en
que se reflejarn los datos que aparecen tras las .
El resultado es 5 y 9. Es la salida de este WriteLine.

A. P. Visual C# 2010 v.1 98


Entradas por teclado
Es importante observar que KeyPress, KeyDown y KeyUp son detectados por el control que tiene el foco.
Normalmente, no son recibidos por los controles padre tales como los Panel y otros que contienen el control.
Microsoft ha creado la propiedad KeyPreview en la clase Form con este propsito. Si esta propiedad se pone a True, Form recibir todos los
eventos del teclado antes de ser pasados al control en curso. Si el controlador de evento pone la propiedad Handled a True, el control con el
foco no recibir la entrada de teclado.

El evento KeyPress permite el tratamiento genrico de los caracteres del teclado.

Evento Descripcin Argumento Event


KeyDown Cuando una tecla es pulsada Clase KeyEventArgs
KeyPress Cuando se pulsa un carcter en el teclado, y Clase KeyPressEventArgs
de nuevo se repite mientra continua pulsada
KeyUp Cuando una tecla es liberada Clase KeyEventArgs

La clase KeyEventArgs se asocia con KeyDown y KeyUp.


Representa la tecla presionada o liberada.
Es parte del namespace System.Windows.Forms, y hereda de la clase
System.EventArgs.
Alt Si se puls tecla Alt
La clase KeyPressEventArgs se asocia con KeyPress.
Control Si se puls tecla Control
Representa al carcter pulsado.
Handled Obtiene o establece si el evento ha sido tratado.
Es parte del namespace System.Windows.Forms, y
KeyCode Obtiene la tecla pulsada como un valor de la
hereda de la clase System.EventArgs.
enumeracin Keys.
Handled Obtiene o establece si el Propiedades KeyData Obtiene la combinacin de teclas pulsadas al mismo
carcter ha sido tratado. public tiempo la enumeracin Keys.
Si es True, el control no KeyValue Obtiene el valor int del carcter correspondiente a la
Propiedades
recibir el carcter. combinacin de teclado.
public
Modifiers Obtiene la combinacin de teclas modificadoras
KeyChar Obtiene el valor del carcter pulsadas o liberadas usando la enumeracin Keys.
presionado. Shift Obtiene si se puls la tecla Shift.
A. P. Visual C# 2010 v.1 99
Entradas por ratn
Los eventos de ratn son similares a los de teclado, ya que sus botones suben y bajan como teclas del teclado.
El ratn incorpora eventos del puntero del ratn y sus movimientos.

Evento Descripcin Argumento Event


MouseDown Cuando se pulsa un botn del ratn mientras el puntero est sobre el control Clase MouseEventArgs
MouseEnter Cuando el puntero entra en el control Clase MouseEventArgs

MouseHover Cuando el puntero est sobre el control por un tiempo configurable Clase MouseEventArgs
MouseLeave Cuando el puntero deja el control Clase MouseEventArgs
MouseMove Cuando el puntero se mueve sobre el control Clase MouseEventArgs
MouseUp Cuando se libera un botn del ratn mientras el puntero est sobre el control Clase MouseEventArgs
MouseWheel Cuando la rueda del ratn se mueve mientras el control tiene el foco. Clase MouseEventArgs
La propiedad de slo lectura MouseWheelPresent en la clase SystemInformation
indica si el sistema operativo cree que hay una rueda de ratn presente.

La clase MouseEventArgs se asocia con los eventos del ratn.


Representa la informacin sobre el ratn y la posicin del puntero al ocurrir el evento.
Es parte del namespace System.Windows.Forms, y hereda de clase System.EventArgs.

Button Obtiene la enumeracin MouseButtons


correspondiente al botn del ratn pulsado.
Clicks Obtiene el n de veces que se puls y liber el botn
del ratn. El DoubleClick es un evento propio del ratn.
Propiedades
Delta Obtiene un entero con signo representado el n de
giros de la rueda del ratn en un slo movimiento.
X Obtiene la coordenada x de la posicin del puntero.
Y Obtiene la coordenada y de la posicin del puntero
A. P. Visual C# 2010 v.1 100
Indice
MessageBox
La clase MessageBox es una caja de dilogo modal con un mensaje o pregunta y espera respuesta del usuario.
MessageBox no se instancia. Se usa su mtodo static Show con muchas sobrecargas - para mostrar el dilogo.
Enumeraciones [System.Windows]
Button Image Options Result
Namespace

System.Windows

Clase MessageBox

Show(Mensaje)
Show(Mensaje, Rtulo)
Mtodos

Show(Mensaje, Rtulo, Button)


Show(Mensaje, Rtulo, Button, Image)
Show(Mensaje, Rtulo, Button, Image,Result)

Ejemplo
var result = MessageBox.Show(" Volver a jugar ? ", "Rtulo", MessageBoxButton.OKCancel, MessageBoxImage.Stop);
If (result == MessageBoxResult.Cancel)
{.....}

Ejemplo
var result = MessageBox.Show(" Volver a jugar ? ", "Rtulo", MessageBoxButton.YesNo, MessageBoxImage.Question);
If (result == MessageBoxResult.Yes)
{.....}

A. P. Visual C# 2010 v.1 101


Indice
Files y Streams [archivos y secuencias]
Un archivo [file] es una serie de bytes de datos relacionados en un disco.
Cuando se accede a un archivo, debe considerarse si los bytes representan caracteres, enteros, cadenas, etc.
Segn la clase de datos del archivo, son posibles 3 tipos de accesos:
Secuencial, para leer/escribir texto en bloques continuos. Los datos se almacenan como caracteres ANSI. La ms habitual.
Aleatorio, para leer/escribir archivos de texto o binarios estructurados como registros de longitud fija.
Binario, para leer/escribir archivos estructurados arbitrariamente.

Los ficheros se clasifican segn contengan texto o datos binarios.


Un fichero de texto, tambin llamado fichero ASCII, se lee y edita con editores de texto como Bloc de Notas.
Todos los dems son ficheros binarios. No se pueden leer ficheros binarios con un editor de texto.
Stream es la clase base de todas las secuencias. Una secuencia es una abstraccin de una secuencia de bytes,
como un archivo, un dispositivo de E/S, un canal de comunicacin interprocesos o un socket TCP/IP.

Para trabajar con ficheros, generalmente hay que hacer uso de streams.
La clase Stream sirve para la
entrada y salida de bytes.

StreamReader est diseado StreamReader


para la entrada de caracteres FileStream
texto
mediante una codificacin StreamWriter Cada secuencia
determinada. MemoryStream
tiene su almacn
bytes de respaldo
StreamWriter est diseado BufferedStream asociado.
int
para obtener caracteres como BinaryReader
double
salida en una codificacin string NetworkStream
determinada. ... BinaryWriter

BinaryReader lee datos primitivos como valores BinaryWriter escribe datos primitivos como
A. P.
binarios en una codificacin especfica. valores binarios en una codificacin especfica.
Visual C# 2010 v.1 102
System.IO
System.IO

BinaryReader Lee tipos de datos primitivos como valores binarios en una codificacin especfica

BinaryWriter Escribe tipos primitivos como valores binarios en una codificacin especfica
abstract

FileSystemInfo Clase base de FileInfo y DirectoryInfo.


static

File
FileInfo mtodos de instancia para crear, copiar, borrar, mover y abrir archivos
static

Directory
DirectryInfo mtodos de instancia para crear, mover y borrarr directorios y subdirectorios
static

Path abstract
Cada clase derivada de Stream proporciona una implementacin
Stream
especfica para un entorno particular.

FileStream Implementacin para archivos en disco

MemoryStream Implementacin para memoria

NetworkStream Implementacin para redes

BufferedStream Implementacin para buffer intermedio


abstract
TextReader Para leer una serie secuencial de caracteres.

StreamReader Lee caracteres de una secuencia de bytes en codificacin determinada.

StringReader Igual que StreamReader pero para buffer en lugar de fichero.


abstract
TextWriter Para escribir una serie secuencial de caracteres.

StreamWriter Escribe caracteres de una secuencia de bytes en codificacin determinada.

* static : no se necesitan objetos StringWriter Igual que StreamWriter pero para buffer en lugar de fichero.
** abstract : miembros que usarn sus clases derivadas
A. P. Visual C# 2010 v.1 103
Manejo de Ficheros
System.IO dispone de una serie de clases para realizar operaciones con ficheros y directorios, como copiar,
mover, crear, borrar, y leer o establecer sus atributos y permisos.
System.IO
clase
Utility class* Utility class* Utility class* FileSystemInfo abstracta

File Directory Path FileInfo DirectoryInfo


Create() CreateDirectory() GetDirectoryName() Attributes Attributes

CreateText() DeleteDirectory() CreationTime CreationTime


GetExtension()
Open() GetDirectories() Exists Exists
GetFileName()
Extension Extension
OpenRead() GetFiles() GetRandomFileName()
FullName FullName
OpenText() Exists() GetTempPath() LastAccessTime LastAccessTime
OpenWrite() Move() GetTempFileName() LastWriteTime
Miembros

Miembros
LastWriteTime
AppendText() GetFileNameWithoutExtension()
Mtodos static Name Name
Delete() Mtodos static AppendText()
Create()
Exists() CopyTo()
Mtodos para manipular CreateDirectory()
nombres de ficheros y vias a Create()
Copy() dierctorios. Delete()
CreateText()
Move() Delete() GetDirectories()

ReadAllText() Directory GetFiles()


Similar funcionalidad entre File y FileInfo, y entre Directory y DirectoryInfo.
DirectoryName
WriteAllText() MoveTo()
Length
GetCreationTime() MoveTo() Parent
GetLastAccessTime() Open() Root
Mtodos static OpenRead()
*Una clase utilitaria (utility class) es una clase que expone toda OpenText()
su funcionalidad a nivel de clase, es decir con miembros static.
Son clases pensadas para uso general, sin recurrir a objetos. OpenWrite()
A. P. Visual C# 2010 v.1 104
Lectura/escritura de texto desde clase File
System.IO Espacio de nombres System.IO

Mtodos estticos para crear, copiar, borrar, mover y abrir archivos Tambin posible
y contribuye a la creacin de objetos System.IO.FileStream.
File Clase [static] File FileInfo desde FileInfo

Mtodos Mtodos
estticos*
de la clase File OpenText CreateText AppendText estticos*

Retorna un Exists Retorna un Crea fichero si no


de la clase File

StreamReader StreamWriter existe, y retorna un


Abre un archivo existente con
StreamWriter para
Crea o abre un archivo para escribir
codificacin UTF-8 para lectura. escribir al final fichero
texto con codificacin UTF-8.

Las clases StreamReader y StreamWriter .


StreamReader leen/escriben lneas, caracteres o bloques
StreamWriter
en objetos Stream, como FileStream.
Derivan de TextReader y TextWriter resp.

Mtodo Descripcin Mtodo Descripcin


Peek Lee siguiente carcter del texto sin cambiar el estado del reader, de Flush Escribe datos en buffer en la salida subyacente
forma que otros mtodos puedan leer el carcter ms tarde
Write Escribe valor en la salida. Este mtodo tiene muchas sobrecargas para
Read Lee datos desde la entrada. Versiones sobrecargadas de este mtodo escribir caracteres, array de caracteres, enteros, etc.
leen un nico carcter o un array de caracteres hasta cierta longitud.
WriteLine Escribe datos en la salida seguidos por secuencia de nueva lnea
ReadBlock Lee datos desde la entrada a un array de caracteres
Close Cierrar el writer y libera recursos en uso
ReadLine Lee una lnea de caracteres en la entrada y los devuelve en una cadena .

ReadToEnd Lee los caracteres restantes en la entrada y los devuelve en una cadena.

Close Cierrar el reader y libera recursos en uso

StreamReader str = File.OpenText(@"E:\test.txt"); StreamWriter stwa = File.AppendText(@"E:\test.txt");


MessageBox.Show(str.ReadLine()).ToString(); stwa.WriteLine(Linea aadida");
str.Close(); stwa.Close();

* Mtodos estticos : se llaman sin necesidad de instanciar la clase. Por ejemplo File.OpenText directamente.
A. P. Visual C# 2010 v.1 105
Lectura/escritura de texto con StreamReader y StreamWriter
Los ficheros se clasifican segn contengan texto o datos binarios.
Un fichero de texto, tambin llamado fichero ASCII, se lee y edita con editores de texto como Bloc de Notas.
Todos los dems son ficheros binarios. No se pueden leer ficheros binarios con un editor de texto.

Para trabajar con ficheros, generalmente hay que hacer uso de streams.
namespace
System.IO

clase StreamReader Stream es la clase base de todas las secuencias. StreamWriter clase
Es un canal entre la aplicacin y una fuente de datos.
Una secuencia es una abstraccin de una secuencia de bytes,
como un archivo, un dispositivo de E/S, o un socket TCP/IP.
Peek () Flush()
StreamReader lee lneas de informacin desde un archivo de

mtodos
Read () //2 sobrecargas texto estndar. Write () //varias sobrecargas
StreamWriter est diseado para dar salida a caracteres
ReadBlock () WriteLine ()
mtodos

//varias sobrecargas
en una codificacin determinada.
ReadLine () Estas 2 clases se usan para leer/escribir textos en un fichero. Close ()
No soportan acceso aleatorio.
ReadToEnd ()

propiedad
Peek : devuelve el siguiente carcter disponible pero no lo consume.
Close () Flush : borra todos los bufferes internos. NewLine
propiedad

EndOfStream //bool

El carcter @ precediendo al nombre de un fichero Append


hace que se tome dicho nombre literalmente.
@"C:\Temp\MyDir\MyFile.doc StreamWriter stout = new StreamWriter(@E:\test.txt,true);
StreamReader stin = new StreamReader(@E:\test.txt); es equivalente a stout.WriteLine(); //linea en blanco
MessageBox.Show(stin.ReadLine().ToString()); "C:\\Temp\\MyDir\\MyFile.doc" stout.WriteLine(Nueva linea aadida); // linea aadida
stin.Close(); que usa \\ para insertar la barra invertida. stout.Close();

Las clases StreamReader y StreamWriter disponen de una amplia gama de constructores.


A. P. Visual C# 2010 v.1 106
Indice
Lectura/escritura de datos primitivos
System.IO

BinaryReader Lectua/escritura de tipos de datos primitivos como valores binarios en una codificacin especfica BinaryWriter

Mtodos Read
sobrecargados Mtodos Write
sobrecargados

FileStream fs = new FileStream(@"E:\test.txt",FileMode.Open); BinaryWriter binWriter = new BinaryWriter(File.Open(@"E:\test.txt", FileMode.Create))


BinaryReader binReader = new BinaryReader(fs); {
{ binWriter.Write(una cadena texto");
MessageBox.Show(binReader.ReadString()); binWriter.Close();
fs.Close(); }
}
A. P. Visual C# 2010 v.1 107
Indice
Bucles de decisin if y switch
switch ( variable) {case1 .................................}
if (condicion) {...} else {...}

Condition No
= true ? else Case 1 default
switch
Si (variable)
{ {
{ { Case 2 Case 3 sentenciasn
sentencias1
sentencias1 sentencias2 break;
break;
} } }
}

{ {
sentencias2 sentencias3
break; break;
} }
if/else opera slo sobre expresiones Boolean

if (condicion) {...} else if (condicion {...} else {}


switch (variable) La variable usada en switch
{ puede ser numrica o incluso
case valor1 : una cadena o enumeracin.
else if Condition else //sentencias1
= true ?
break;
{ { case valor2 : Tras cada bloque de sentencias
sentencias2 Si sentencias3 //sentencias2
ejecutable, debe ir
} } break;
{ obligatoriamente un break.
default :
sentencias1 //sentenciasn
} break;
} default es una opcin fuera de
las conmutables.

A. P. Visual C# 2010 v.1 108


Bucles while y do/while
El bucle while se usa para ejecutar un bloque de do/while se usa para realizar una accin un n
sentencias hasta que se alcanza una condicin. indeterminado de veces.
Puede no ejecutarse nunca, si no se d la condicin. El bloque de cdigo se ejecuta al menos 1 vez.

while (condicion) { ... } do { ... } while (condicion) ;


while do
continue ;
{
Condicion No
= true ? sentencias
}
continue ; Si
{ loop while break ;
sentencias
} Condicion
break ;
Si = true ?
loop
No

do
while (int n == 5) {
{ MessageBox.Show (bucle do/while");
MessageBox.Show (bucle while"); }
} while (int n == 5);

A. P. Visual C# 2010 v.1 109


Indice
Bucles for y foreach
Recorre todos los elementos de un contenedor, Repeticin de un bucle un n definido de veces,
linealmente, sin preocuparse de su lmite superior. desde condicin inicial hasta final.

for (inicial; condicin; actualizacin) { ... }


int [ ] dec = {10, 20, 30, 40, 50};

foreach (int n in dec) continue ; for (i=0; i<10;i++)

sentencias i++

Condicin No
next n break ;
10
true ?
20
No
Si
30

40 continue ;
{
Recorre todos
sentencias break ;

los elementos
50 }
de la matriz
Si

int[] dec = { 10, 20, 30, 40,50 }; for (i = 0; i < 10; i++)
foreach (int n in dec) {
{ MessageBox.Show(i.ToString());
MessageBox.Show(n.ToString()); }
}
"i" slo es visible dentro del bucle.
A. P. Visual C# 2010 v.1 110
Indice
Manejo de errores y excepciones
Una excepcin es un tipo de error. C# incorpora el tratamiento estructurado de excepciones.
Las excepciones proporcionan un mecanismo seguro para tratar errores de sistema y de la aplicacin.
Todas las excepciones heredan de la clase System.Exception.

Tratamiento de excepciones
El bloque try termina donde ocurre la try
excepcin.
{
// cdigo que trata y lanza las excepciones
}
catch (<exceptionType> e) catch contiene el cdigo que se ejeucta
{ cuando se producen las excepciones.
//explicita excepciones a tratar Los bloques catch se pueden especializar
para tratar tipos concretos de excepciones,
} por lo que puede haber varios bloques catch.
catch [opcional - alternativa] Es posible omitir totalmente este parmetro,
{ y tener un un bloque general catch para
//explicita excepciones alternativas todas las excepciones.
}
finally cdigo que se ejecuta siempre, Finally [opcional]
bien tras un bloque try sin excepcin, o tras {
tratar una excepcin en bloque catch o bien //se ejecuta ocurran o no excepciones
antes de que no excepcin no tratada
progrese hacia arriba en la pila de llamadas.
}

Las excepciones ignoradas, por defecto,


producen el bloqueo del programa.

A. P. Visual C# 2010 v.1 111


Indice
Directivas de preprocesamiento [preprocessor directives]
Las directivas de preprocesamiento indican al compilador cmo tratar al cdigo fuente.
Las directivas de preprocesamiento :
Van en lneas separadas del cdigo C#
No terminan con punto y coma (;)
Cada lnea comienza con un carcter #
Puede haber espacios antes de # y entre # y directiva
Se permiten comentarios tras // en una lnea directiva.

Directiva Significado
#define identifier Define un smbolo de compilacin
#undef identifier Anula smbolo de compilacin
#if expression Si la expresin es true, compila la seccin siguiente
#elif expression Si la expresin es true, compila la seccin siguiente #region Bloque1
#else Si el #if #elif anteriores son false, compila la seccin siguiente #region y #endregion definen el inicio y
final de un bloque de cdigo que puede
#endif Marca el final de un #if
ser expandido o contraido a voluntad,
#region name Marca el inicio de una seccin de cdigo. Sin efectos de compilacin. para tener un vista rpida o detallada.
#endregion name Marca el final de la seccin de cdigo antes abierta con #region name. Es para facilitar la visibilidad del cdigo.
#endregion Bloque1
#warning Mensaje* Visualiza Mensaje de advertencia en tiempo de compilacin
#error Mensaje* Visualiza Mensaje de error en tiempo de compilacin
El bloque queda comprimido a una sola
#line integer Fuerza la siguiente lnea de cdigo a ser el n lnea dado por integer.
lnea con el nombre del bloque. Al hacer
#line default Restablece la numeracin y en su caso el nombre del fichero click sobre el signo +, se abre el bloque.
#line hidden Oculta el cdigo que sigue. Se cancela con directiva #line
#line filename Cambia el nombre aparente del fichero a filename
#pragma warning Activa/desactiva mensajes de advertencia con disable y restore.
* Mensaje sin comillas
A. P. Visual C# 2010 v.1 112
Indice
Reflexin
La reflexin obtiene en RunTime los tipos de un ensamblado *dll *.exe, con sus mtodos, campos, propiedades y eventos.
Por cada tipo utilizado en un programa, el CLR crea un objeto de la clase Type* con informacin sobre dicho tipo.
Namespace
// Uso de mtodo GetType () de System.Object.
using System.Reflection; Coche cx = new Coche();
Type t = cx.GetType( );
Se necesita un objeto
Clase abstracta
System.Type* 3 formas distintas de obtener un objeto Type*
// Obtener tipo con typeof.
GetFields() GetField() FieldInfo[ ] Type t = typeof(Coche);
No se necesita un objeto
Mtodos relevantes

GetProperties() GetPropertie() PropertyInfo[ ]

GetMethods() GetMethod() MethodInfo[ ] //Obtener tipo con GetType**() de System.Type.


Type t = Type.GetType(WPFCarrera.Coche);
GetEvents() GetEvent() EventInfo[ ]
Usar el string oficial completo del tipo buscado.

GetConstructors() GetConstructor() ConstructorInfo[] ** El mtodo Type.GetType() tiene una sobrecarga


que admite 2 argumentos booleanos, el primero
para lanzar o no una excepcin si no se encuentra
Name Obtenido un Type t por alguno de los 3 mtodos: el nombre del tipo, y el segundo para considerar o
propiedades

FieldInfo[ ] fi = t.GetFields ( ); no diferencias entre maysculas y minsculas .


MessageBox.Show ( fi [0].ToString ( ) );
Namespace ** Para examinar un tipo de un ensamblado
GetFields(), GetMethods(), GetProperties(),
externo, se debe dar nombre completo del tipo, y
GetEvents() y GetConstructors()
Assembly separado por coma (,) el nombre del ensamblado.
dan como respuesta una matriz
FieldInfo[] , MethodInfo[] , PropertyInfo[],
EventInfo[], y ConstructorInfo[] respectivamente.
Estas matrices son miembros de System.Reflection.

* Type es una clase abstracta, no instanciable. Por tanto, el CLR crea en realidad instancias de la clase derivada de Type RunTimeType.
Accediendo a instancias de RunTimeType, el CLR devuelve referencias del tipo de su clase base Type.
A. P. Visual C# 2010 v.1 113
Indice
Atributos
Los atributos son una forma de incorporar metadatos a un ensamblado, a sus tipos, o miembros.
Hay atributos predefinidos en .NET, y tambin pueden usarse atributos propios.
Los atributos .NET son clases que derivan de la clase base abstracta System.Attribute.
Se aplican atributos a entidades de programacin en el cdigo fuente.
Un atributo se coloca inmediatamente antes de la entidad.
Un atributo consiste de un nombre entre corchetes y una lista de parmetros opcional.
La mayora de atributos aplican solamente a la entidad de programa que le sigue.
Una entidad de programa a la que se aplica un atributo se dice estar adornada o decorada.
Por convencin, los atributos usan la notacin Pascal aadiendo el sufijo Attribute al final: [<nombreAttribute>(<parmetros>)]

Algunos atributos predefinidos en .NET Framework


Atributo* Significado Los atributos aplican a los targets siguientes:
Tipos (clases, enum, structs, delegates, interfaces)
CLSCompliant Comprueba la conformidad con el CLS Ensamblados
Serializable Declara que la entidad es serializable Mdulos
Mtodos
NonSerialized Decladra la entidad no serializable Campos
Propiedades
Obsolete La entidad no es utilizable Eventos
Parmetros
DLLImport Declara que la entidad es cdigo no gestionado (unmanaged).
return
WebMethod Declara que el mtodo es parte de un servicio web XML.
AttributeUsage Declara a qu tipos de entidades se puede aplicar el atributo. Se pueden asociar explicitamente atributos a
determinadas entidades, colocando el target
* Se ha omitido el sufijo Attribute en los nombres de los atributos. El compilador lo acepta.
seguido por dos puntos antes del atributo.
[Serializable()] [method : ObsoleteAttribute ]
public class Coche()
{
...
}
A. P. Visual C# 2010 v.1 114
Indice
C# y Windows Forms - un ejemplo bsico

Cdigo C# con 2 controladores de eventos sencillos


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication22
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void btnVer_Click(object sender, EventArgs e)
Ventana del programa {
textBox1.Text = "Altamira";
}
Colocacin en ventana(s) de controles y edicin de sus caractersticas de tamao, private void btnSalir_Click(object sender, EventArgs e)
ubicacin, color, etc, en la Ventana de Propiedades de cada control. {
Close();
}
}
}

Lgica del programa en C#.

A. P. Visual C# 2010 v.1 115


Indice
WPF y XAML
Cada elemento en XAML representa una instancia de una clase de .NET,
y cada atributo representa una propiedad o evento de la clase.
El nombre del elemento tiene que coincidir exactamente con el de una clase.
Clase Atributo = Propiedad de la clase
e1.Width = 100;
Acceso a Cdigo C#
XAML <Label Name=e1" Width=100 Height="20"> Calle </Label> travs de e1.Height = 20;
En el marcado XAML, hay que dar nombre a los elementos que se tratan en cdigo. Name e1.Text = Calle;

Un fichero XAML se compone de un nodo raiz del que cuelgan todos los dems nodos subordinados.
Un nodo es todo lo que se encuentra entre una etiqueta de apertura <Nodo> y una de cierre </Nodo>.
Los atributos son informaciones que se colocan en la etiqueta de apertura, como <Nodo Valor= "222">.
El atributo va seguido de = y el valor entre comillas , incluso para valores numricos, o Boolean.
Si un nodo slo contiene atributos, se puede cerrar el nodo con / al final. Ej. <Nodo Valor = "222"/>.
Los comentarios se hacen con una etiqueta especfica : <! aqui comentarios -->.

Aunque se pueden escribir programas WPF sin usar XAML, combinar XAML y cdigo C#, permite usar :
- XAML para concentrarse en definir la interface grfica del usuario, sus clases y sus propiedades.
- Cdigo C# para definir el comportamiento de los controles ante las acciones del usuario, y otras tareas.
Para una misma clase, tendremos un fichero XAML y otro de cdigo .NET que se funden al compilar.

XAML es un lenguaje basado en XML para crear e inicializar


objetos
Lo que se.NET.
hace con XAML se hace tambn con cdigo C#, y viceversa.
Los mtodos y los controladores de eventos, no tienen implementacin a travs de XAML.

Expression Blend = herramienta Microsoft para desarrollar UI y su XAML.


A. P. Visual C# 2010 v.1 116
Indice
C# y WPF - un ejemplo bsico
El marcado XAML crea los objetos de la
ventana, definiendo propiedades: color,
fuente, tamaos, etc, e incluso definiendo los
eventos a los que respondern y sus
controladores de eventos.
La potencia de XAML permite realizar casi
todas las tareas relacionadas con la parte
visual, incluso programar formas, estilos,
plantillas, etc.

XAML se concentra en la creacin de objetos y definicin de sus propiedades

Cdigo con 2 controladores de eventos sencillos


using System;
using System.Windows;

namespace WpfApplicationTest
{
public partial class MainWindow : Window
{
public MainWindow()
{ InitializeComponent(); }
private void button1_Click(object sender, RoutedEventArgs e)
Con cdigo se programan mtodos en { textBox1.Text = "Altamira"; }
private void button2_Click(object sender, RoutedEventArgs e)
general, en particular los controladores { Close(); }
de eventos, y se generan bucles y tratan }
decisiones lgicas. }

A. P. Visual C# 2010 v.1 117


Indice

A. P. Visual C# 2010 v.1 118

Vous aimerez peut-être aussi