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

Lenguaje C # 2010

Indice

[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

Plataforma .NET

Lenguajes de
Visual Studio

Especificacin
comn lenguaje

C++

C#

J#

Common Type Specification [CTS]


Common Language Specification [CLS]

Biblioteca de clases
organizada en
Espacios Nombres

.NET Framework

Servicios necesarios
para ejecutar una
unidad de cdigo

Common Language Runtime [CLR]

Funciones del SO
[Windows]
A. P.

Visual Studio .NET

Definicin de tipos,
bloques de programa,
y sus metadatos.

Visual
Basic

Otros lenguajes compatibles .NET

Application Programming Interface [API]


Visual C# 2010 v.1

Generacin de cdigo intermedio y cdigo mquina


Cdigo fuente
VB2010

Cdigo fuente
C++

Cdigo fuente
C#

Compilador
VB2010

Compilador
C++

Compilador
C#

Indice
Indice

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]
por CPU

Just-in-Time [JIT]
por CPU

Just-in-Time [JIT]
por CPU

Cdigo mquina ejecutable


[x86 machine instructions]
100100101010101010101010101010101010101010101
00
A. P.

Visual C# 2010 v.1

Indice

Ensamblados
Cdigo fuente
C#

Common Intermediate Language [CIL]


es un lenguaje intermedio, el mismo
para todos los lenguajes segn CLR.

Los Metadatos describen en detalle los tipos


[clases, etc ] contenidos en el Ensamblado y
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.
Puede haber sin embargo ensamblados
multifichero, con varios mdulos.
Es la unidad de despliegue en .NET, y
contiene el cdigo compilado y metadatos
necesarios para correr el cdigo bajo CLR.

El Manifiesto son metadatos sobre el


propio ensamblado, que lo identifican.
Contiene las referencias a ensamblados
externos, n versin, autor, cultura
[pais, idioma] y otros datos.

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

Estructura de los ensamblados


Los ensamblados
contienen espacios de
nombres que a su vez
contienen las clases y
otros tipos.

Manifiesto contiene lista de los


elementos contenidos en el
ensamblado, y la informacin
bsica sobre el ensamblado.

Nombre
Version

Ensamblado

Pais
Manifiesto
Metadatos,
MSIL, y
Recursos,
se pueden
dividir en
varios ficheros.

Identificacin
Lista ficheros

Metadatos
(Tipos)

(opcional)

Strong
Name
(opcional)

(opcional)

Cdigo MSIL

Ensamblados
referenciados

Recursos

Atributos
Ensamblado
cliente

Pais e idioma
Strong name
es una clave
encriptada
generada por
el autor que
identifica el
ensamblado.

Descripcin

(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

Ensamblados

Indice

(continuacin)
Directorio
de la aplicacin

Private

Ensamblado: Es la unidad resultado de


la compilacin del cdigo fuente.
Normalmente un ensamblado se
corresponde con un fichero .dll o .exe.
Puede haber sin embargo ensamblados
multifichero, con varios mdulos.
Es la unidad de despliegue en .NET, y
contiene cdigo compilado y metadatos
necesarios para correr cdigo bajo CLR.
Los ensamblados
contienen espacios de
nombres que a su vez
contienen las clases y
otros tipos.

Los ensamblados Private residen unicamente en el mismo


directorio que la aplicacin que los referencia.
Las aplicaciones que mantienen una referencia a un
ensamblado Private necesitan una copia del ensamblado
en su mismo directorio. Si hay 10 aplicaciones que usen
un cierto ensamblado, tendr que haber 10 copias.
La modalidad de distribucin Xcopy hace uso de esto.

Tanto los ensamblados Private como Shared pueden configurarse usando un fichero *.config.
Antes de desplegar un ensamblado en el GAC, hay
que asignarle un nombre seguro [strong name], para
identificar univocamente al autor del cdigo .NET.

Shared
Los ensamblados compartidos [Shared] son ficheros con firma
digital que se instalan en el Global Assembly Cache, lo que
permite disponer de una nica copia, si sta es de confianza.
GAC slo admite ficheros .dll [ no .exe ].

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.

Los ensamblados Private se instalan


en el directorio llamado bin bajo el
directorio de la aplicacin.
Son privados de la aplicacin.

Visual C# 2010 v.1

GAC
Global Assembly Cache
C:\Windows\assembly\

El GAC es un depsito de ensamblados compartidos.


Compartido significa que una aplicacin puede hacer una
referencia a los ensamblados disponibles en GAC sin tener
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.

Runtime CLR - en accin


El cdigo ejecutado por
el CLR es seguro
managed porque usa
objetos, variables, etc,
gestionados por el CLR.
C# slo opera con cdigo
managed.
C++ p.ej. puede ejecutar
tambin cdigo inseguro
(unmanaged code).

Cdigo fuente
en lenguaje
compatible
. NET

Compilador .NET
segn lenguaje

Ensam blado
*.dll o *.exe
[ CIL, Metadatos, Manifiesto ]

El compilador C#
referencia mscorlib.dll
automaticamente.

Libreras de
Clases
[ mscorlib.dll ]
[ y otras ]

Las clases de .NET son


comunes a todos los
lenguajes .NET.

. NET Execution Engine


[ mscoree.dll ]
Cargador
Clase(s)

The Common Language Runtime (CLR)


es el corazn de .NET.
CLR carga la aplicacin con seguridad,
la aisla, gestiona la memoria y cdigo,
compila en lenguaje nativo y ejecuta.

Jitter
Instrucciones
especficas de
Plataforma

Ejecucin
miembro
A. P.

CIL es el nico cdigo que acepta el CLR.


CIL da a .NET su capacidad multilenguaje.
Los lenguajes que se puedan compilar a
CIL son programas compatibles .NET.

Visual C# 2010 v.1

Una CPU slo ejecuta instrucciones


en formato de lenguaje mquina.
9

Indice

Visin general de tareas


Windows Forms
[ opcin WPF]

Web Forms
[ASP.Net]

Crear
interfaz
usuario

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

Escribir
Debug
cdigo
and Deploy

Programacin por objetos


Los objetos interactan entre s,
y con el usuario,
y responden a eventos

Uso de Visual
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.

A. P.

Visual C# 2010 v.1

Resultado del programa.


La consola permanece estable,
porque se est a la espera de
pulsar cualquier tecla, o salir.
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.
El compilador C# combina el
codigo de usuario con el cdigo
generado automticamente al
arrancar la aplicacin.

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

Al arrancar, Visual Studio genera un fichero


Program.cs que contiene el mtodo Main,
el cual llama al mtodo Run, el cual a su
vez crea Form1 llamando a su constructor.

Llamada a constructor de clase Form1.


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

Pestaa MainWindow.xaml.cs

Clases, estructuras e interfaces,


pueden ser divididas en varios
ficheros usando partial.
El compilador C# combina el
codigo de usuario con el cdigo
generado automticamente
al arrancar la aplicacin.
Al crear una aplicacin WPF, el compilador
convierte la definicin XAML en un objeto
Application que controla la vida de la
aplicacin y carga el formulario inicial.
Para ello usa la propiedad StartupUri de
App.xaml que especifica el fichero XAML
de la ventana a crear.
Al compilar, adems, Visual Studio genera
2 ficheros intermedios en obj\x86\Debug*:
App.g.cs y MainWindow.g.cs.
[g de generado].
La clase parcial MainWindow se compone
de MainWindow.xaml.cs bajo nuestro
control, y estos 2 ficheros autogenerados.
En App.g.cs se encuentra el mtodo Main
que crea y presenta el formulario
especificado por la propiedad StartupUri.
Como resultado de la compilacin, se
fusionan el fichero MainWindow.xaml
con el cdigo de MainWindow.xaml.cs
para crear WPFCSharp.exe.

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) en el programa, que
se instancia automaticamente al compilar.
Constructor de la clase MainWindow.

La plantilla inicial no contiene ninguna funcionalidad, pero incluye


el constructor por defecto de MainWindow, que llama a
InitializeComponent cuando se crea una instancia de la clase.

InitializeComponent es generado
automaticamente en MainWindow.g.cs,
e instancia y configura controles, y enlaza
controladores de la ventana.
NO debe borrarse en ningn caso.

Depuracin, compilacin y ejecucin.


Crea WPFCSharp.exe en Debug o Release.

Mensaje de salida del programa


al pulsar el botn button1.

* Ver en Explorador de Soluciones


A. P.

Fichero XAML inicial

Visual C# 2010 v.1

15

Compilacin:

Indice

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
binding

Enlace temprano

Late binding=dynamic binding

Enlace tardo

Tiempo de diseo

Tiempo de diseo

Clase Coche

Dim c1 As Coche

Clase Coche

Dim cx As Object

- Propiedades
- Mtodos
- Eventos

- Propiedades
- Mtodos
- Eventos

Runtime

Runtime

cx = New Coche

c1 = New Coche

A. P.

Menos flexible,
pero ms rpido

Visual C# 2010 v.1

Ms flexible,
pero ms lento

16

Programas en C#

Indice

[ Consola ]

Un programa C# es realmente un conjunto de declaraciones de tipos.


Acceso a clases

Estructura tpica de programas C#

a travs de namespaces

Namespace Uno
[espacio de nombres]
agrupa al conjunto de
tipos (clases, etc) del
programa.

Declaraciones
de Tipos

using System; //acceso a espacio de nombres System


using ...

Declaraciones y sentencias
acaban todas con ; .

Namespace Uno
{
class Programa
{
// aqu puede haber otros mtodos
static void Main ()
{
System.Console.WriteLine(Hola C#");
}
// aqu puede haber mtodos que instancien objetos,

Todo cdigo C# tiene que


aparecer dentro de un tipo,
y los tipos dentro de un espacio
de nombres [Namespace].

// y/o hagan uso de propiedades y mtodos de su


// clase o de otras.

}
class Otra
{
//cuerpo de la clase Otra con sus miembros.

Punto de entrada (Main)

El programa se inicia a partir


del mtodo Main.
Restantes mtodos se ejecutan
segn vayan siendo llamados.
Todos los mtodos y cualquier
elemento de cdigo, forman parte
de una clase (tipo en general).
Una aplicacin es una clase
con un mtodo Main, que tiene
que ser un mtodo static, y con
tipo de retorno void o int.
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#
Namespaces:
libreras de clases

System

System.Windows

(continuacin)

System.IO

......

using System;
using ....

Se crean objetos a partir


de clases propias o de
libreras.

Namespace Uno
{
public class Programa
{
static void Main( )
{
Coche c1 = new Coche();
c1.Metodo1 ( );
//...........
}
}

A. P.

Una clase que contiene Main

Con metodo Main


se inicia programa
Se ejecutan mtodos
de la propia clase y/o
de los objetos creados.

class Coche

Definicin de clases

En C# no existen las variables globales,


variables definidas fuera de un tipo.
Todos los campos deben alojarse en la
declaracin de tipo (normalmente clase).

Un namespace aloja todo el programa

// propiedades
// mtodos
// constructor(es)
}

}
Visual C# 2010 v.1

#region Bloque1
#region y #endregion definen el inicio y
final de un bloque de cdigo que puede
ser expandido o contraido a voluntad,
para tener un vista rpida o detallada.
#endregion
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)


static void 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
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 ( )
Llamada al mtodo2()
que pasa arriba de la pila.

- Retorna valor a llamador


- No retorna valor (void)
- Excepcin

Metodo1 ( )
- Retorna valor a llamador
- No retorna valor (void)
- Excepcin

Llamada al mtodo1()
que pasa arriba de la pila.

Main( )

Entrada a programa

A. P.

Visual C# 2010 v.1

20

POO : Programacin Orientada a Objetos

Indice

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

Tipos soportados en Common Type Specification [CTS]

Indice

C# tiene un sistema unificado de tipos, en que todos los tipos una funcionalidad comn.

Son referencias a mtodos en memoria.


Los delegados slo apuntan a mtodos
que tienen su misma firma.
Son tipos de referencia.

Agrupaciones de pares
nombres/valores.
Son tipos de valor.

Delegados
Estructuras

Enumeraciones

Interfaces
Abstraccin de objetos.
Las clases contienen
una serie de miembros:
- campos [datos]
- propiedades [datos]
- mtodos [acciones]
- eventos [interaccin].
Las clases son una plantilla
para la creacin de objetos.
Son tipos de referencia.
A. P.

Clases

Visual C# 2010 v.1

Alternativa a las clases


para estructuras simples.
No admiten herencia.
Implementan interfaces.
Son tipos de valor.

A estos tipos,
C# aade los
arrays, y los
tipos
predefinidos.

Slo definiciones de
miembros, que son
implementados en
las clases o estructuras.
Admiten herencia.
Base del polimorfismo.
Tipos de referencia. 22

sbyte

short

ushort

int

uint

long

ulong

float
double

Datos

decimal

Los datos se crean


al instanciar
un determinado
tipo.

bool

Todos los valores en C# son instancias


de un cierto tipo.
Su significado y rango de valores, son
determinados por su tipo de dato.
En C#, true y false no son nmeros, ni pueden
convertirse a ningun tipo numrico.
Los tipos de valor pueden ser nullable types
que admiten el valor null, con la definicin
int? a = 222 ; //usando el sufijo ? al tipo.

string

object

struct

enum

array

delegate

interface

class
Visual C# 2010 v.1

Tipos referencia

char

Tipos personalizables
A. P.

byte

En C# hay que declarar el tipo de dato.


Hay 15 tipos de datos predefinidos.
Para datos ms complejos, se crea una
nueva clase y con ello un nuevo tipo
de dato sobre la base de los tipos
predefinidos, o las clases predefinidas
de C#, o del usuario.

Tipos de valor

Tipos predefinidos en C#

Tipos de datos

Los tipos predefinidos y los personalizables


tienen pocas diferencias entre s.
Los predefinidos se instancian directamente.
Los tipos personalizables deben declararse
antes de su instanciacin, definiendo su tipo,
nombre, y en su caso (clases), sus miembros.

Al crear una nueva clase, array,


interface, delegado, struct, enum,
se crea un nuevo tipo de datos.
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

short

System.Int16

2 byte

-32.768 a 32.767

int

System.Int32

4 byte

-2.147.483.648 a 2.147.483.647

long

System.Int64

8 byte

-263 a 263 -1

byte

System.Byte

1 byte

0 a 255

ushort

System.UInt16

2 byte

0 a 65.535

uint

System.UInt32

4 byte

0 a 232 -1
264 -1

lL

ul UL

ulong

System.UInt64

ul UL

8 byte

0a

float

System.Single

fF

4 byte

(10-45 a 238)

double

System.Double

dD

8 byte

(10-324 a 2308)

decimal

System.Decimal

mM

16 byte

(10-28 a 228)

int y long son los tipos favorecidos por C# y el runtime.


decimal se usa tipicamente para clculos financieros.
*u como prefijo de un tipo significa unsigned (sin signo)
A. P.

Enteros pueden entrarse


en decimal o hexadecimal
int n = 222;
//decimal
int m = 0xDE; //prefijo 0x

Los nmeros reales pueden


entrarse en decimal o
exponencial
double d = 1.5;
double million = 1E06;
Tipos de punto flotante tienen
como valores especiales:
NaN (Not a Number),
+,
-,
-0.
Dividir un n por 0 d por
resultado infinito.
Dividir 0 entre 0 o restar infinito
de infinito da por resultado NaN.

Sufijos F y M son obligatorios con fracciones en


punto flotante o literales decimales.
float f = 4.5F;
// no compila sin sufijo
decimal d = -1.23M; // no compila sin sufijo

Visual C# 2010 v.1

24

Jerarqua de clases
Todas las clases .NET derivan de System.Object

String
Array

Tipos de referencia

Type

ValueType

Byte

Clase base
para todos los
tipos de valor,
enumeraciones
y
estructuras.
Todos los tipos
que derivan de
ValueType son
estructuras,
no clases.

Char

Exception

Integer
Single
Double

Tipos primitivos de datos

System.Object

Boolean

Tipos de valor

Long
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

\
\"
\'
\\
\n
\r
\t

Carcter secuencia de escape. Un \ precediendo un carcter indica que ste no tiene significado normal.
- Dobles comillas
- Comillas simples
- Barra atrs
- Nueva lnea. Ir a principio de nueva lnea
- Retorno carro. Ir a principio lnea actual
- 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
#endregion

- Marca el inicio y final de una zona de cdigo que puede ser expandida o contraida.

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 :
Letra o guin bajo.
No nmeros

A. P.

siguientes caracteres:
Letra, nmero, guin bajo.
No @

Notacin

Descripcin

Recomendado para

Ejemplos

Pascal

Cada palabra empieza con mayscula

Espacios de nombres,
tipos y miembros

PrimeraClase, MiPos

Camel

Cada palabra, excepto la primera, con


mayscula

Variables locales, campos


privados, y parmetros

miCuenta, miVar

Maysculas

Todo en maysculas

Solo abreviaturas

XML, IO

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

A. P.

Tipos de referencia

Son los tipos numricos, boolean y char:


char, byte, short, ushort, int, uint, long, ulong, float, double
y decimal, as como las estructuras y las enumeraciones.

N ilimitado de tipos, ya que son definibles por usuario:


Clases, arrays, delegados e interfaces, String y Object.
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


mismo tipo, se pasa una copia.

Cuando un tipo de referencia se pasa a otro tipo de referencia,


ambos apuntan al mismo objeto.

Cuando se pasa un tipo primitivo a un mtodo, slo se pasa


una copia. El mtodo llamado no tiene acceso al valor
primitivo original, y no puede por tanto modificarlo.
El mtodo llamado puede modificar el valor copiado.

Cuando un objeto se pasa a un mtodo, el mtodo llamado


puede cambiar el contenido del objeto pasado pero no la
direccin del objeto.

Admiten nullable types, que se definen con el smbolo ? como


sufijo al tipo de dato que modifica. Ej. int? x =222.
Estos tipos admiten el valor null como un valor ms.
De inters cuando se trata con bases de datos con campos vacios.

No admiten nullable types.


Los tipos de referencia reciben por defecto el valor null.

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]
Memoria montn [heap]

byte var1 (ocupa 1 byte)

byte 0
byte 1
byte 2
byte 3
byte 4
byte 5
byte 6
byte 7
byte 8
byte 9
byte 10
byte 11
byte 12
byte 13
byte 14
byte 15

char var21 (ocupa 2 bytes)


short var2 (ocupa 2 bytes)

Tipos de valor

int var40 (ocupa 4 bytes)

r (referencia ) ( tipo int de 4/8* bytes)


byte var11 (ocupa 1 byte)

Tipo referencia

Objeto**
referenciado
por
r

Memoria de pila
funciona segn
principio LIFO
[last in, first out]

A. P.

* 4 byte en plataformas 32 bits, 8 bytes para 64 bits.

El programa guarda tipos de referencia en montn,


en cualquier orden, pero no se pueden borrar.
De eso se ocupa el recolector de basura.

Visual C# 2010 v.1

** Requiere tantos bytes como requieran sus datos internos,


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.

Mtodo o bloque.

public
Una variable de instancia public es accesible desde cualquier clase.

[modificador acceso]

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.

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.
No accesible desde otras clases, ni desde subclases de la clase en que se declara.

s1 = expresion ;
Asignacin de valor a una variable previamente declarada

[modificador acceso]

tipodato s1 = expresion ;

Variable de Instancia
Las variables se ubican en uno de estos bloques

Si no se inicializa la variable, se le asigna un valor por


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.

Declaracin y asignacin de variable en una sola sentencia.


Declaracin y asignacin de mltiples variables en una sentencia, separadas por comas.

Se usa la palabra clave var para hacer una declaracin implcita del tipo de dato.
var unidades = 22 ;
El compilador infiere el tipo de dato por esta asignacin [int], y queda ya fijado.
A. P.

Visual C# 2010 v.1

Una variable o constante tiene un mbito


scope desde el punto donde se declara hasta
el final del bloque donde se declara.
Un bloque comprende el cdigo contenido entre
un par de llaves { ...}.

En C# no existen las variables globales.


Todas las variables se definen dentro de tipos
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.
Int edad = 30; // declaracin y asignacin en 1 sentencia. Se reserva y guarda.

Uno de los 13
tipos de datos
predefinidos

Valor de variable se
guarda en la misma
ubicacin de la variable

valor

Pila [Stack]

Tipos de valor

variable

String var1;
//creacin referencia
var1 = Pepe;
//creacin objeto
String var1=Pepe //referencia y objeto
var1 es una variable String, y es un tipo de
dato de referencia.
Al definir una variable de referencia,
se guarda una referencia en la pila a la
ubicacin de memoria montn donde se
guarda el valor real de la variable.

referencia

Slo hay estos 2


tipos de variables

Referencia
a un objeto
Tipos de referencia

El valor de variable es la direccin


de memoria [referencia] del
objeto que contiene los datos de
la variable

valor

Monton [Heap]
Aqui se guarda el objeto

A. P.

Tipos valor

Tipos referencia

Declaracin

int d1
int d2

string s1
string s2

Uso

d1 = 111
d2 = d1
d1 = 222

s1 = pepe
s2 = s1
s1 = juan

Resultado

Valor de d2 sigue siendo = 111

Valor de s2 ha cambiado a juan

Visual C# 2010 v.1

32

Variables de valor y de referencia


Asignacin

Variables de valor

Memoria
pila [stack]

Las variables de valor se guardan


directamente en la memoria pila,
con tamao predefinido segn tipo.
v2 = v1 genera una copia de v1 y
la guarda en v2.
Ambas variables son independientes,
aunque guardan el mismo valor.
Se puede cambiar el valor de v1 v2,
sin afectar a la otra.

v1 = 22

Valor

v2 = 22

Referencia

r1

Referencia

r2

Memoria
montn [heap]
pepe

juan
Tipos de referencia

Tipos valor

Memoria pila (stack)

Memoria montn (heap)

Almacena tipos valor


* byte
* bool
* char
* short
* int
* long
* float
* decimal
* double
* sbyte
* ushort
* uint
* ulong
* struct
* enum

Almacena tipos referencia


* string
* object
* array
* interface
* delegate
* class

v2
A. P.

Valor

Variables de referencia

r2

r1

r1 guarda una direccin de la memoria


montn donde se guarda el valor de la
variable (pepe).
r2 apunta inicialmente a otra direccin de la
memoria montn donde se guarda el valor de
la variable (juan).
r2 = r1 asigna el valor referenciado por r1 a r2.
Qu pasa con el valor antes referenciado por
r2 ?
El dato sigue donde estaba, pero no puede ser
accedido porque r2 apunta ahora a otro sitio.
Finalmente el recolector de basura reconocer
que el objeto r2 ya no est en uso y lo borrar.
Al asignar una variable de referencia a otra,
se hace una nueva referencia a un objeto
existente.
Las 2 variables apuntan al mismo objeto.
Slo se copia la referencia al objeto.
Si se modifica el valor a travs de una de las
referencias, este cambio afecta a la otra.

v1
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.
Namespace

Un string es una serie contigua de caracteres (ej. pepe) entre comillas dobles, mientras que char es 1 carcter (ej. p') entre comillas simples.

Enum

System
Char
IsControl()

char inicial = e';

// carcter simple entre comillas simples

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

IsDigit()

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.
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].

Mtodos estticos

IsLetterOrDigit()

Una conversin implicita de un char


a un tipo numrico slo vale con
ushort (0 a 65.535).
Para otros tipos numricos, se
requiere conversin explcita.

IsSeparator()
IsSymbol()
IsLower()
IsUpper()
ToLower()
ToUpper()

MessageBox.Show(char.ToUpper((char)(101)).ToString());
* Ambas son vlida \x0065\ y \u0065

ToString()
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

System
Clase

String

Propiedad

Length

Concatenacin de cadenas
mediante operador +.

string nombre = pepe";


Declaracin y asignacin en una sola sentencia

Contains()
EndsWith()

string a = "pepe";
MessageBox.Show(a.EndsWith("e").ToString()); //true

Mtodos destacados

IndexOf()
Insert()
LastIndexOf()
Remove()
Replace()
StartsWith()
Substring()
Trim()
ToUpper() ToLower()

A. P.

El carcter @ precediendo al nombre de un fichero


hace que se tome dicho nombre literalmente.
@"C:\Temp\MyDir\MyFile.doc
Es equivalente a
"C:\\Temp\\MyDir\\MyFile.doc"
que usa \\ para insertar la barra invertida.

Las cadenas C# pueden contener varios


caracteres de escape, que indican como
imprimir el carcter.
Las secuencias de escape son (\) seguido
por una letra(s) o caracteres.
Char

Significado

Inserta comillas simples

Inserta comillas dobles

\\

Inserta barra invertida

\a

Inserta alarma

\b

Inserta retroceso

\f

Inserta salto pgina

\n

Inserta nueva lnea

\r

Inserta retorno de carro

\t

Inserta tabulacin horizaontal

\v

Inserta tabulacin vertidal

\xhhhh

Carcer Unicode en hexadecimal

\xhhh

Caracter ASCII en hexadecimal

Si \ precede a un carcter que no aparece en la


tabla, se trata como el carcter como tal, sin mas.
P. ej. \c se trata como una c.

En C#, un objeto String es inmutable significando que sus caracteres no pueden ser cambiados, sino
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,
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

Un tipo A cuyo rango de valores


entra dentro del rango de otro
tipo B, puede ser objeto de
conversin implicita a ese tipo.
La conversin implcita es
posible en todas circunstancias.

TIPOS
ENTEROS
byte
sbyte
short
ushort
int
uint
Long
ulong

Implcita

float
double

explcita

explcita
explcita

implcita

explcita

decimal

El sistema de tipos de C# es unificado, de manera que un valor


de cualquier tipo puede tratarse como un objeto. Todos los tipos
de C# derivan directa o indirectamente de la clase Object.
Los valores de los tipos de referencia se tratan ya como objetos.
Los valores de los tipos de valor se tratan como objetos con la
realizacin de operaciones de conversin boxing y unboxing.
object a = b;
// Boxing : asignacin de tipo valor b a objeto a
int j = (int) a; // Unboxing : conversin de objeto a tipo valor j.
La unificacin permite que las bibliotecas de uso general que
utilizan el tipo object puedan usarse tanto con los tipos de
referencia como con los tipos de valor.
A. P.

Conversin explcita (casting)


Cuando sea posible una prdida de precisin,se hace una conversin
explcita (casting), en determinadas circunstancias.
Sintaxis: se d el tipo de destino entre parntesis, seguido de la variable.
double x = 9.997 ;
int nx = (int) x ;
conversin explcita a int
Una conversin se puede declarar anteponiendo checked en cuyo caso se
produce un error en caso de desbordamiento, o unchecked, en que no.
Ejemplo : int nx = checked (int) x ;
Visual C# 2010 v.1

36

Clase Convert
La clase Convert contiene mtodos para diferentes conversiones entre tipos.
namespace

System
Clase
static

Convert

Mtodos static [extracto]

ToInt32()

int x = Convert.ToInt32(textBox1.Text.ToString());

Conversion a int de un entrada en TextBox

ToDecimal()
ToDouble()
ToByte()
ToChar()
ToDateTime()

Otros operadores de conversin

ToString()

as

is

A. P.

Visual C# 2010 v.1

El operador as, si falla la conversin, devuelve null, no excepcin.


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.
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.
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

mtodos

struct

Representa un intervalo de tiempo

DateTime

TimeSpan

Add ()

Add ( )

Compare ()

Substract( )

DateTime ()

Compare()

Date

TimeSpan ()

Ejemplos

DateTime dt = new DateTime(2015, 12, 20);


TimeSpan ts = new TimeSpan(5,0,0,0);
MessageBox.Show((dt + ts).ToString());
DateTime dt = new DateTime(2015, 12, 20);
DateTime dt1 = new DateTime();
dt1=dt.AddDays(5);
MessageBox.Show(dt1.ToString());

Year
Month

propiedades

Day

Operadores

DayOfYear

DayOfWeek
Hour

Days

+
!=
==
<
>
>=
<=

Menos
Ms
No es igual
Igual
Menor que
Mayor que
Mayor o igual
Menor o igual

Hours

Minute

Second
Millisecond

Minutes

Ejemplo

Seconds

TimeSpan ts = new TimeSpan(4, 30, 0); //intervalo en h, m,s.


MessageBox.Show(ts.ToString());
// resta 15 m y muestra en ventana.
MessageBox.Show(ts.Subtract(new TimeSpan(0, 15, 0)).ToString());

Now
Today
A. P.

Milliseconds
Visual C# 2010 v.1

38

Arrays

Indice

[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 .


El ndice va desde 0 a n-1.

char[n] vocales ;

Una vez creado, los elementos reciben el valor por defecto del
tipo a que pertenecen (para int 0, etc).

Definicin e instanciacin de array de n elementos

char[ ] vocales = new char [n] ;

Se leen/escriben los elementos a partir de


escribir: vocales [0] = a; //leer: char x = vocales[0] ;

Namespace

System
Clase
abstracta

Se puede declarar e inicializar un array en un solo paso:

Creado un array, su tamao es fijo.


C# no soporta arrays dinmicos.

char[] vocales = new char[] {'a','e','i','o','u'};


o simplemente:

char[] vocales = {'a','e','i','o','u'};

Array
Length

int p1 = vocales.Length; // 5

int x = miArray [2, 2, 2]

Rank

int p2 = vocales.Rank; // 1

Array de 3 dimensiones

Propiedades

int y = ArrayArray [2][3][4]

Clear()

Array de arrays, cada uno de su dimensin

Algunos mtodos

IndexOf()
LastIndexOf()

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

char[] vocales = {'a','e','i','o','u'};

a e i o u

Reverse()

Uso de foreach para recorrer todo el array.


foreach (char c in vocales) Console.Writeline (c);

Sort()
GetValue()
GetUpperBound()

A. P.

int p3 = Array.IndexOf(vocales,a); // 0

char x = (char) vocales.GetValue(1);

// e

Int p6 = vocales.GetUpperBound(0); //4

Uso de un bucle para recorrer el array.


for (int i = 0; i < vocales.Length; i++) Console.WriteLine (vocales [i]);
Visual C# 2010 v.1

39

Indice

Operadores
Operaciones numricas

Operaciones de comparacin

Op.

Nombre

Ejemplo

Resultado

Op.

Nombre

Ejemplo

Resultado

Suma

5+5

10

<

Menor que

(5 < 9)

true

Resta

55

>

Mayor que

(5 > 9)

false

Multiplicacin

5*5

25

<=

Menor o igual

(5 <= 9)

true

Divisin

5/5

>=

Mayor o igual

(5 > = 9)

false

Resto

5%5

==

Igual

(5==5)

true

!=

No igual a

(5!=5)

false

Operaciones asignacin aumentada


Nombre

Ejemplo

Equivale

+=

Asignar suma

a += 5

a=a+5

-=

Asignar resta

a -= 5

a= a-5

*=

Asignar multiplicar

a *= 5

a=a*5

/=

Asignar divisin

a /= 5

a=a/5

%=

Asignar resto

a %= 5

a=a%5

Op

Operaciones incremento/decremento

Evala una condicin, y asigna valores segn


resultado de la condicin.
Condicion ? Expresion1 : Expresion2 ;
int k = x < y ? a : b;
//ejemplo en 1 lnea
int k = x < y
// ejemplo en 3 lneas
?a
:b;
[Esta es la versin C# de IIf(x<y,a,b) de VB]

Operaciones lgicas

Op.

Nombre

Ejemplo

Resultado

Op.

Nombre

Ejemplo

Resultado

++a

Preincremento
[nuevo valor a ]

a = ++ i

a=i+1
i=i+1

&

Y [And]

1&0

a++

Postincremento
[valor original a ]

a = i ++

a=i
i=i+1

O [Or]

1|0

1^0

Predecremento
[nuevo valor a ]

a = -- i

O Exclusivo
[ exclusive or ]

No [Not]

Postdecremento
[valor original a ]

a = i --

--a
a-A. P.

Operador condicional (ternario)

a=i1
i=i-1

La clase System.Random sirve para obtener


nmeros pseudoaleatorios.
Mtodos:
Next(int max)
Next(int min, int max)
Su mtodo Next (int min, int max)
genera valores >= min y <max.
Random rnd = New Random();
rnd = Next(0,10);
//entre 0 y 9
NextDouble()
// >= 0,0 y < 1,0.
La clase esttica System.Math contiene
mtodos para realizar funciones
matemticas bsicas.
Math se incorpora automticamente y no
necesita la sentencia using.
Todos sus mtodos son estticos -> usar
nombre de clase Math .
El operador + concatena cadenas.
Las operaciones numricas y de comparacin,
aplican tambin a tipos char, ya que se
tratan como enteros.
&& y || son versiones cortocircuito de & y | resp.
&& devuelve true si ambos operandos son true.
Si cualquiera de ellos es false, devuelve false.
Se llama cortocircuito AND porque si el operando
izquierdo es false, devuelve false sin evaluar el otro.
|| devuelve true si cualquier operando es true.
Si ambos son false, devuelve false.
Se llama cortocircuito OR porque si el operando
izquierdo es true, devuelve true sin evaluar el otro.

a=i
i=i-1
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 representan


entidades del mundo real
a travs de sus atributos y
comportamiento.
A. P.

Clase
Visual C# 2010 v.1

Las clases son una plantilla conceptual a


travs de la cual generar, mediante el
proceso llamado de instanciacin,
objetos con sus mismos atributos y
comportamiento, los cuales
interactuando entre s y con otros
objetos de otras clases, realizan las
tareas previstas por el programa.
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

Objetos

Cada objeto tiene las caractersticas


[campos] y comportamiento [mtodos]
de su clase.

Objetos
Un universo
de objetos

Objetos se interrelacionan entre s


y con el usuario.
Generan y reaccionan a eventos.

Encapsulacin
Polimorfismo

Instanciacin

Sin detalles

Detalles
ocultos

Interface(s)

Interfaces son puras declaraciones


abstractas de comportamiento.
A. P.

[implementacin]

Clase (base)

Instanciacin
Nuevo atributo

Detalles
ocultos

: [Herencia]

Clases son plantillas para la creacin deobjetos.


Pueden implementar una o ms interfaces.
Visual C# 2010 v.1

Clase derivada

Clases derivadas heredan de su clase base y


pueden aadir o variar mtodos y propiedades.

43

Clases y Objetos : ilustracin


Abstraccin

Declaracin de clase

Interface

Crear Objeto
Instanciado
e inicializado

Interface
Objeto coche [F1 real]

IComportamiento
public void avanzar ( )

2
public class Coche : IComportamiento

Propiedades
Sus caractersticas

public string color;


public int num;

Abstraccin
Abstraer sus caractersticas y
acciones relevantes al fin deseado

A. P.

Miembros abstractos que


definen el comportamiento.
Sin implementacin de mtodos.
Las clases pueden decir que
interface(s) o comportamiento(s)
implementan.
Uso, por tanto, OPCIONAL.

Visual C# 2010 v.1

public void avanzar ( )


{
..//implementacin

Mtodos
Su comportamiento

Objeto Coche [virtual]

}
Clase Coche [virtual]

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
acceso a la clase y
modificadores de clase

Nombres de clases:
Pascal [1 letra en
maysculas].

[clase] : [clase base]


de la que hereda
Opcional

[clase ] : [interfaces] implementados por


la clase, separados por comas.
Opcional

Opcional

[modificador clase] class Coche [:] [clase base] [interfaces separados por comas]
Miembros
de datos

Miembros
de funcin

{
// campo(s)
// constante(s)
// propiedad(es)
// mtodo(s)
// constructor(es)
// destructor(es)
// evento(s)
// indice(s)
//operador(es)
}

datos (variables) que contienen el estado o caracteristicas de los objetos


datos que no varian durante la ejecucin
son como los campos pero con mtodos de acceso get/set
son las acciones que ejecutan los objetos, su comportamiento
mtodos que instancian nuevos objetos
mtodos que destruyen objetos
sucesos detectables por el objeto
como propiedades pero con acceso por ndice
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

Delegados

Enumeraciones

Campo

acceso

public
private
internal

Constante

protected

Propiedad

abstract

Mtodo

const

async
event

Estructuras

Constructor
Finalizador

Interfaces

extern
new
override
partial

Operador

readonly
sealed

Arrays

Evento

unsafe

Indexador

A. P.

virtual
volatile

Clases
Los 6 tipos personalizables de C#

static

Miembros de que se
componen los tipos
Visual C# 2010 v.1

Afectan al acceso o comportamiento


de los tipos y miembros

46

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

public

Tipos
Miembros

private

protected

internal

protected
internal

A. P.

Tipos

Tipos

Acceso desde ensamblado externo.

Modificadores de tipos y miembros


Modificador

Significado

abstract

Sirve de clase base para otras clases

async

El mtodo modificado, expresin lambda, o


mtodo annimo es asncrono

const

Valor de campo o variable local no modificable

extern

El mtodo se implementa externamente

event

Declara evento

new

Oculta explicitamente un miembro heredado

override

Nueva implementacin de mtodo virtual


heredado

Acceso desde objetos o clases derivadas.


Acceso desde su propia clase o struct.

Acceso desde su clase y clases derivadas

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

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.

Tipos

Propio ensamblado, su clase y derivadas.

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


A. P.

Clase derivada
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
hereda de clase abstracta
o no-abstracta.

Puede contener mtodos


abstractos y no abstractos.
Los mtodos abstractos slo
contienen la declaracin.
Una clase derivada de una clase
abstracta debe implementar
todos los miembros abstractos
de la clase mediante override,
a no ser que ella misma sea una
clase abstracta.

No-abstracta

abstracta

INSTANCIAS

[public] abstract class Cuenta


Campo uno
CLASE
ABSTRACTA
NO ADMITE
INSTANCIAS

Mtodo uno

Mtodo dos
Mtodo abstracto

INSTANCIAS de clase derivada

: herencia
El constructor en una clase abstracta
se define como protected porque
slo se usa en subclases.
Al crear objetos de una subclase
concreta, se invoca el constructor de
la clase base para inicializar campos
de datos definidos en ella.
A. P.

public class Saldo : Cuenta

Campo uno

Campo uno
Mtodo uno

Mtodo dos

Mtodo abstracto
Visual C# 2010 v.1

instanciacin

Mtodo uno
Mtodo dos

Mtodo abstracto
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

Environment

Min()

GetCommandLineArgs()

Round()

GetEnvironmentVariable()
GetLogicalDrives()

CommandLine

Tan()

CurrentDirectory

IEEERemainder()
Pow()
Log()
Log10()

extracto

La clase esttica System.Math contiene mtodos para realizar


funciones matemticas bsicas.
La clase Math se incorpora automticamente con System
y no necesita la sentencia using.
Todos sus mtodos son estticos -> usar nombre de clase Math en
lugar del objeto llamador.
Math.IEEERemainder(222,5);

SetEnvironmentVariable()

Cos()
Propiedades static

Mtodos static

Sin()

Mtodos static

Math

Max()

A. P.

public static class

MachineName
UserDomainName

UserName
WorkingSet

extracto

La clase esttica System.Environment contiene propiedades y


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

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

extern: el mtodo se
implementa externamente.
override : reescribe un
mtodo virtual heredado
con la misma firma.
new : oculta un miembro
heredado de su clase base
partial: tiene varias partes
en el ensamblado.
readonly: slo lectura.
Asignacin en declaracin o
a travs constructor.
sealed: invalida en clase
base.
static: pertenece a la
clase, no a sus objetos.
virtual : modificable en
clase derivada.

A. P.

Modificadores acceso

Clase

Miembros de Datos
Campos

Miembros de Funcion: ejecutan cdigo


Propiedades

Constantes

Mtodos

Eventos

Constructores

Operadores

Destructores

Indexadores

public: accesible a toda


clase o ensamblado.
private: accesible a cdigo
dentro de la misma clase.
internal: accesible dentro
programa (ensamblado).
Por defecto: internal
protected: a su clase o a
sus clases derivadas.
protected internal: a
misma clases y derivadas, y
a su propio programa.

Un modificador no puede repetirse.


Debe existir al menos uno de los modificadores : static, virtual y override.
El modificador new no puede coexistir con override.
Con el modificador abstract, no pueden ir : static, virtual, sealed o extern.
Con el modificador private, no pueden ir : virtual, override o abstract.
Al modificador sealed, debe acompaar override.

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.


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

[modificadoracceso] tipodato NombreCampo


[modificadoracceso] tipodato NombrePropiedad
[modificadoracceso] TipoRetorno

NombreMtodo ()

Ensamblado [programa] EB

miembros

public class B1

private
internal
Otro ensamblado

public

Misma clase

protected
internal
protected

Clase derivada : B1

A. P.

Mismo
ensamblado

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

static

Mtodos

static

Constantes*

static

Constructores

static

Eventos

clase B

Acceso a miembros static


a travs del nombre de la
clase, sin necesidad de
instanciar objetos
con la notacin de punto (.)
tras el nombre de la clase.

A.nombremiembro

clase C A.nombremiembro

Objetos de clase A

Campos

Operadores

Mtodos

Propiedades

Indexers

Constructores

Eventos

Destructores

Los objetos acceden


a los miembros non-static
con la notacin de punto (.)
tras el nombre del objeto.

static

o1

o1.nombremiembro

o2

o2.nombremiembro

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
en memoria una copia del campo, vista por los 100 objetos.

Si una clase tiene un campo no-static, y se instancian 100 objetos, habr 100 copias del
campo en memoria. Cada objeto tendr su valor propio.

Si una clase tiene un mtodo static, y se instancian 100 objetos, slo existe
una copia en memoria, y el mtodo no recibe referencia del objeto que lo
est llamando.

Si la clase tiene un mtodo no-static, y se instancian 100 objetos, slo una copia del
mtodo existe en memoria, y el mtodo recibe una referencia con la direccin del objeto
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 .


A.nombreclase.nombremiembro.
P.
* Las constantes son implicitamente static.

Para llamar a un miembro no-static desde fuera de su clase, se usa el operador .


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.
Internal: accesible a cdigo
dentro del mismo ensamblado
Protected: misma clase o clases
derivadas.
Protected internal: mismo
ensamblado o clases derivadas en
otro ensamblado.

Modificadores de campos
static: pertenece a la clase,
no a sus objetos.
readonly: slo lectura.
Asignacin en declaracin o a
travs constructor.

[modificadoracceso] [modificadorcampo]

Nombre de campos public: notacin Pascal: NombreCampo.


Los private, usan Camel : nombreCampo [1 letra en minscula].
- Campos numricos se inicializan a 0.
- Campos boolean se inicializan a false.
- Tipos referencia se inicializan a null.

tipodato NombreCampo

= [valor inicial] ;

Los campos non-static son variables de instancia, y los static son variables de clase.
Un campo esttico es compartido por todas las instancias de las clase y todas ellas
acceden a la misma ubicacin de memoria. Si se cambia su valor en memoria,
el cambio afecta a todas las instancias.
public class Coche
{
public string Color ;
public int Num ;
...
}

//campo
//campo

Si no se asigna valor inicial,


hacerlo en sentencia separada.

[modificadores] tipodato NombreCampo ;

Declaracin

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
cualquier clase o
ensamblado.
private: accesible a
cdigo dentro de la
misma clase.
internal: accesible a
cdigo dentro del mismo
ensamblado
protected: misma clase
o clases derivadas.

[modificadoracceso]

Se obtiene o establece una propiedad


exactamente igual que con los campos.
get y set se llaman implicitamente.
TestPropiedad tp = new TestPropiedad();
tp.Edad = 25;
// asignacin
int z = tp.Edad;
// lectura

Nombre de la propiedad en Pascal.

tipodato

NombrePropiedad

class TestPropiedad
{

private int edad ;


public int Edad

// El campo se nombra en notacin Camel y la propiedad en Pascal.


// Campo privado edad, que se har accesible a travs de la propiedad Edad backing field
// Propiedad Edad : la definicin de la propiedad no acaba con ; (el campo si).

// set tiene como parmetro implcito value, que es el valor que se asigna a la variable es un mutator.

set
{ edad = value; }

get
{ return edad; }
}
}

// get devuelve (lee) el valor como return es un accessor.


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 ;

Modificadores de acceso

Public: accesible por cualquier

A. P.

clase o ensamblado.
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.

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).

clase o ensamblado.
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.

extern: el mtodo se
implementa externamente.
override : reescribe un
mtodo virtual heredado
con la misma firma.
new : oculta un miembro
heredado de su clase base
partial: tiene varias partes
en el ensamblado.
sealed: invlida en clase
base.
static: pertenece a la
clase, no a sus objetos.
virtual : modificable en
clase derivada.

[modificadoracceso]

[modificador]

public: accesible por cualquier

Los nombres de los mtodos deberan contener


verbos, ya que los mtodos realizan acciones.
Se usa la notacin Pascal, como en MiMetodo.

void si no se
devuelve
ningn valor

Nombre parmetros en notacin Camel, ej. minMax

tiporetorno NombreMetodo ([modo] lista parametros)

{
// cuerpo del mtodo

//si hay tipo retorno: return [resultadotiporetorno]


}

void

[Modo] cualifica como se pasan los parmetros.


Por defecto por valor, se pasa copia del parmetro.
out : pasa parmetro out a variable dentro mtodo.
ref : paso de parmetros por referencia. Se asignan
por mtodo llamador. Inicializarlos antes pasarlos.
params: se envian varios param como uno solo.

//La potencia de los mtodos radica en sus parmetros.


La firma de un mtodo es su nombre y lista de parmetros.
Lista de parmetros : n de parmetros, tipo y orden de los parmetros,
con sus modificadores si los tienen. No incluye tiporetorno.

Invocacin o llamada de mtodo

void: una llamada al mtodo es una sentencia, acabada con ;.


Console.WriteLine( Esto es C# !) ;

int

Si un mtodo retorna un valor,


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.
Si el argumento es un tipo de referencia, en el paso por valor se pasa
una copia de la referencia, no del objeto.
Para pasar por referencia, se usa el modificador de parmetro ref.

Ninguno : por valor, se pasa copia del parmetro.


out : argumento se pasa por referencia.
ref : igual que out pero con valor asignado al param.
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


//si hay tiporetorno : return [resultadotiporetorno]

La firma de un mtodo es su nombre y lista de parmetros.


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

static

Mtodos

static

Constantes*

static

Constructores

static

Eventos

Acceso a miembros static


a travs del nombre de la
clase, sin necesidad de
instanciar objetos
con la notacin de punto (.)

clase B

A.nombremiembro

clase C A.nombremiembro

Objetos de clase A
Campos

Operadores

Mtodos

Propiedades

Indexers

Constructores

Eventos

Destructores

Los objetos acceden


a los miembros non-static
con la notacin de punto (.)

Instanciar con new, reserva memoria montn para cada uno de los campos y mtodos de la clase.
La referencia al objeto sirve para acceder a sus campos y mtodos usando el operador dot (.).
Empleado emp = new Empleado ( );
//declara e instancia objeto Empleado
emp.nombre = Pepe Gmez;
//accede y asigna el campo nombre del objeto
La operacin emp.nombre accede al campo nombre del objeto Empleado al que referencia emp.
De igual manera, para invocar un mtodo del objeto Empleado:
emp.mail ( );

this

A. P.

this se usa cuando un mtodo necesita acceder a campos o mtodos dentro de su misma clase.
public double calculoPaga ( )
{
return this.salario/12;
// aqui this es opcional aunque facilita la comprensin
}
Visual C# 2010 v.1

o1

o1.nombremiembro

o2

o2.nombremiembro

Al declarar una variable de una clase,


se reserva memoria para la referencia,
pero no para los datos de la clase.
Es el operador new el que reserva e
inicializa memoria para la instancia.
La referencia se guarda en la memoria
de pila y montn, segn el tipo.

Datos
referencia

Pila [stack]

Montn [heap]
59

Diferentes clases
Clase

new

new

Objeto1

Objeto2

(herencia)

Ni miembros static
ni constructores son
heredables.

Clase derivada

Permiten instanciacin y
herencia.

new

new

La clase derivadas heredan


los miembros de su clase
base, que ellas pueden
modificar, y/o aadir
nuevos miembros.

Objeto1

Objeto2

Modificadores

No admite
instanciar

Clase abstracta

Clase derivada

(herencia)

Ni miembros static
ni constructores son
heredables.

Instanciacin

No admite
instanciar
ni heredar

Clase static

Modificadores

(herencia)

new

Objeto1

Objeto2

No heredable

La clase abstracta no est


diseada para ser usada
directamente, sino a
travs de sus clases
derivadas, que son las
que implementan sus
miembros abstractos.

Ni instanciacin ni
herencia.
Son clases con utilidades
de carcter genrico.
Slo miembros static.
Ejemplo es la clase
System.Math

Instanciacin

A. P.

new

Permiten herencia pero


no instanciacin.

Visual C# 2010 v.1

60

Overloading vs. Overriding

Overloading

Sobrecarga

Sobreescritura

Overriding

Los mtodos, incluso los constructores, pueden ser


sobrecargados.
Sobrecarga significa que dos o ms mtodos tienen el
mismo nombre, pero diferentes lista de parmetros.
Tienen que tener lista de parmetros diferentes, y
adems pueden tener diferente return.
Tener diferente slo el return no es sobrecarga.

Una subclase puede sobreescribir los mtodos que hereda.


Sobreescrito, un mtodo contiene la misma firma (nombre
y lista de parmetros) que el mtodo en la clase base, pero
puede tener diferente implementacin.
En la clase base el mtodo debe tener el modificador
virtual, y en la clase derivada el mismo mtodo debe
presentar el modificador override

class ClaseBase
{
public int Calcular(int x, int y)
{...}
}

class ClaseBase
{
virtual public int Calcular()
{...}
}

class ClaseDerivada : ClaseBase


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

class ClaseDerivada : ClaseBase


{
override public int Calcular()
{......} //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););


public class Cuenta {

c1

Inicializado
segn firma1

La firma de la llamada selecciona el constructor

public Cuenta (firma1) {....}


public Cuenta (firma2) {....}
public Cuenta ( ) { }
}
Clase con 3 constructores (sobrecargados).
Notar que los constructores son mtodos con
0 ms parmetros, sin retorno.
Si se crean constructores con firma,
C# elimina el que hubiera creado por defecto.

Cuenta c2 = new Cuenta (firma2 );

c2

Inicializado
segn firma2

Cuenta cx = new Cuenta ( );

cx

Inicializado
por defecto

new crea el objeto y el


constructor lo inicializa.

La misma operacin en 2 fases:


Cuenta cn;
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


de una clase ya no es referenciado.
Slo puede haber un destructor por clase.
Los destructores no tienen parmetros.
Los destructores no tienen modificadores de acceso.
Un destructor tiene el nombre de su clase precedido de tilde ~.
Un destructor acta en instancias de clases, no son static.
No se puede llamar explicitamente a un destructor por cdigo.
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.

Indexers acceden a elementos en una clase o estructura.


La clase string class tiene un indexador que permite acceder a sus valores
a travs de un indice int.
string s = "hola";
Console.WriteLine (s[0]); // 'h'
Console.WriteLine (s[3]); // a'
La sintaxis como la de los arrays con indice entero.
Indexers tienen los mismos modificadores que las propiedades.

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;
car = new Coche( );

//declara referencia (car) a 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

Inicializacin Objetos

Creacin Objetos (instanciacin)

c1.color = verde;
c1.num = 1;

Coche c1=new Coche();

public string color;


public int num;

c2.color = rojo;
c2.num = 2;

Coche c2=new Coche();

Inicializacin

public class Coche


{

Instanciacin

Coche c3=new Coche();


Si la clase no cuenta
con constructores,
C# crea uno sin
argumentos.

2
c3.color = azul;
c3.num = 3;
3

Clase C#
Instanciacin con palabra clave new
A. P.

Visual C# 2010 v.1

Incializacin con asignacin atributos


65

Indice

Clases y Objetos : ilustracin [uso de constructor con argumentos]

Instanciacin e
Inicializacin Objetos

Clase

Coche c1 = new Coche (verde,1)

Instanciacin + Inicializacin

public class Coche


{
public string color;
public int num;
public Coche (string co, int nu)
{
color = co
num = nu
}

Constructor Coche
con parmetros

Coche c2 = new Coche (rojo,2)


2

Coche c3 = new Coche (azul,3);


3

}
3

Clase C#
A. P.

Instanciacin con palabra clave new


Visual C# 2010 v.1

Instanciacin e inicializacin
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

..new ...... {...}

class Empleado

Oculta este
mtodo heredado

...virtual ......{..}
...abstract.....
Miembros aadidos y/o
modificados en Empleado.
No aparecen los heredados.

Base de todas
las clases de C#

: herencia

Object

Object

Implicitamente deriva de object

La herencia entre clases se declara con la sintaxis:


A. P.

clase derivada

Object

: herencia
clase base

class Object

Miembros aadidos y/o


modificados en Empleado.
No aparecen los heredados.

Visual C# 2010 v.1

class ClaseBase : ClaseDerivada


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

Detalles de implementacin ocultos


private variables ;
private constants ;
private methods ()
{Cdigo de mtodos public y private}
Una clase no debera tener campos public,
y usar Property o bien mtodos get y set.

Accesible a usuarios de la clase

public variables ;
public get () {...}
public set () {...}
public Property
public constants ;
public methods ()

// tpico de Java
// tpico de Java

//preferido en C#

Objetos
de la
clase

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

Miembros de System.Object

Clase

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.

A. P.

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.


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.

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

Clase genrica

class Generica < T1>


{
public T1 var1 = new T1();

Instanciacin formal de objeto miGen1 de la clase Generica.

class Generica < int >


{ int var1 ; }

Generica < int> miGen1 = new Generica <int> ( ) ;


Instanciacin formal de objeto miGen2 de la clase Generica.

class Generica < double >


{ double var1 ; }

Generica < double> miGen2 = new Generica <double> ( ) ;


Instanciacin formal de objeto miGen3 de la clase Generica.

class Generica < short >


{ short var1 ; }
T1 representa al tipo final real

Generica < short> miGen3 = new Generica <short> ( ) ;

Instanciaciones a partir de las clases construidas segn la clase Generica

Clases que utilizan la plantilla

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:
Puede declarar cualquier n de miembros.

Declaracin clase
implementadora

Declaracin
interface

Los nombres de las interfaces deberan ser


adjetivos, y terminar en able o ible .
apropiado. Por lo dems como las clases.

[modificador acceso] interface ITest

{
int Cal ( int x, int y, int z);
}
[modificador acceso] class Prueba : ITest
{
int Cal ( int x, int y, int z) {..implementacin..}
}

Un interface se diferencia de una clase en que:


Los interfaces no se instancian.
No tienen constructores.
Todos sus mtodos son abstractos.
Un interface se implementa por una clase o struct.
Un interface puede heredar de mltiples interfaces.

Una declaracin de interface puede tener cualquiera de los


modificadores de acceso : public, protected, internal o private.
Los miembros de un interface son implicitamente public,
y no se permiten modificadores de acceso ni siquiera public.
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.
[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

Seleccionar

: herencia
Una clase puede implementar
varios interfaces (I1, I2).

Mtodo M11( )

Mtodo M11( )

Mtodo M11 ( I1 )

Mtodo M12( )

Mtodo M12( )

Mtodo M12 ( I1 )

Mtodo M13( )

Mtodo M13( )

Mtodo M13 ( I1 )

Slo declaraciones

Mtodo M90()

: A

Clase A : I1, I2

: I1,I2

Interface I1

Clase A1 : A

Estas clases son objetos de I1 e I2.

Mtodo M91()

Clase A2 : A

Mtodo M21( )

Mtodo M21( )

Mtodo M21 ( I2 )

Mtodo M22( )

Mtodo M22( )

Mtodo M22 ( I2 )

Interface I2

Slo declaraciones

Implementaciones en clases

Una clase slo


hereda de 1 clase,
su clase base (A).

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

Polimorfismo (Sobrecarga)

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)

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
{
int Doble (int x) ;
}

Clase implementadora

public class Duplo1 : IDuplo

Interface

Distinta implementacin !
Clase implementadora

public class Duplo2 : IDuplo


{

{
public int Doble (int x) ;

Clase

public int Doble (int x) ;

Clase

return x * 2 ;

return x + 2 ;
}

}
}

Duplo1 d1 = new Duplo1


IDuplo id1 = (IDuplo) d1;

Objetos de las clases que


implementan la interface IDuplo
Convierte a tipo interface los objetos d1 y d2
para poder acceder a mtodo(s) del interface

Duplo2 d2 = new Duplo2


IDuplo id2 = (IDuplo) d2;

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 (d2, 5) ;

Calcular (d1, 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)
{
return x * 2 ;
}
}

Implementacin modificada !

Clase base

Implementacin modificada !

Duplo d = new Duplo


Clase derivada

Clase derivada

public class Duplo1 : Duplo


{
override public int Doble (int x)

public class Duplo2 : Duplo


{
override public int Doble (int x)

{
return x 2 ;

Clase

{
return x + 2 ;

Clase

}
}

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)
Muestra 3

Calcular (d, 5)

Calcular (d2, 5)

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

IA n1 = (IA) i1
n1.Metodo1();

A. P.

Visual C# 2010 v.1

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


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).
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.

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


sola clase base, y por tanto
implementar en todo caso, los
miembros (abstractos) de dicha
clase base y su lnea jerrquica.
No de otras clases fuera de esa lnea

Una clase derivada de una clase


abstracta debe implementar todos
los miembros abstractos de la clase,
los use o no, mediante override,
a no ser que ella misma sea
declarada abstracta.

Clase Derivada1 : Abstracta1, Interface1,Interface2, Interface3

Interface1

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

System

Interface
Compara objeto actual
con otro mismo tipo .

Interface
Crea nuevo objeto
copiado del actual.

Ejemplos de interfaces predefinidos en librera de clases BCL*, subconjunto de FCL*.


Estos interfaces representan un contrato que los desarrolladores deben respetar
para garantizar a sus consumidores el uso de sus clases que los implementan.

public interface IComparable


{
int CompareTo ( object obj ) ;
}

public interface IEnumerator

public interface ICloneable


{
object Clone ( ) ;
}

public interface IEnumerable


{

{
bool MoveNext ();
object Current { get;}
void Reset ();
}

IEnumerator GetEnumerator();

System.Collections

Interface

Admite una iteracin simple.

Interface

Expone el enumerador, que admite


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.
Al primer nombre se asigna el valor entero 0, y as sucesivamente.
Este valor se puede forzar a voluntad en la asignacin.
Puede haber algn valor duplicado, pero no nombres duplicados.
enum Zona
{
Norte, Centro, Sur
}

MessageBox.Show(((int) Zona.Centro).ToString());

Opcional:
Se puede definir el tipo de los valores
entre los tipos enteros .
Por defecto es del tipo int.

string z1 = Zona.Centro;
Acceso por nombre

Asignacin por defecto,


valores enteros desde 0.
MessageBox.Show( Zona.Centro.ToString());

int z2 = (int) Zona.Centro;


Acceso por valor

enum Zona
{
Norte = 10, Centro = 20, Sur= 30
}

2 tipos de accesos a las enumeraciones

MessageBox.Show(((int) Zona.Centro).ToString());

Asignacin forzada

A. P.

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.
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
{
// ...miembros

Una struct puede tener todos los miembros de una clase, salvo constructor sin parmetros
(que es aadido automaticamente), destructor, y miembros virtuales.

struct Point
{
public int X;
public int Y;
}

Definicin struct con constructor.

Sin constructor.

Esquema definicin de estructura

class Programa
{
static void Main()
{
Point eje= new Point();
eje.X = 10; eje.Y = 10;
}
}
Al ser instanciada con new Point ( ), se asignan valores iniciales por defecto.
Se puede instanciar, sin new, en cuyo caso no se asignan valores.

struct Point
{
public int X;
public int Y;
public Point (int x1, int y1)
{
X = x1;
Y = y1;
}

Constructor
con parmetros

}
class Programa
{
static void Main()
{
Point eje= new Point(10,10);
}
}
Instanciacin e inicializacin

A. P.

Visual C# 2010 v.1

80

Delegados

Indice

[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

Clases
Declarar tipo

Declarar Clase

Delegados
Declarar Delegado

Firma

Declarar un nuevo tipo delegado con firma y tipo de retorno.

delegate int Multiplicar (int x) ;


Declarar una variable delegado del nuevo tipo delegado.

Declarar
variable
del tipo

Instanciar

Declarar variable

Declarar variable

del tipo de la clase

del tipo delegado

Crear instancia

Crear instancia

de la clase y asignar su
referencia a la variable

del delegado, asignar su


referencia con el 1
mtodo a la variable.
Aadir mtodos : t +=Triplicar;
t=Quintuplicar;.
Quitar mtodos : t -= Duplicar; .
Se forma as la lista de invocacin
de los llamados multicast delegates.

MultiDelegate t ;
Crear objeto del tipo delegado, y asigna a variable delegado.
El nuevo objeto delegado incluye una referencia a un mtodo
con la misma firma definida en la declaracin.

t = new Multiplicar (Duplicar); t = Duplicar;


int Duplicar (int x) { return x * 2}; Es un posible mtodo de t.
Otros podran ser int Triplicar(int x){return x*3};,
int Quintuplicar (int x) {return x*4}; , etc.
Todos con misma firma y retorno declarados en delegado !.
t = Duplicar; es una forma vlida abreviada de hacer lo mismo.
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

A. P.

Usar el objeto

Invocar objeto delegado

Sus propiedades y mtodos.

Se invocan todos mtodos de la lista.

Visual C# 2010 v.1

int result = t (3) ;

int result = t. Invoke (3);

Tambin es vlido int result =t. Invoke (3);


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 );


Declaracin

[public] delegate int Multiplicar (int x);

int Triplicar (int x );

La declaracin define un tipo de datos basado


en una firma determinada.

int Quintuplicar (int x );

Mtodos con firma susceptibles


de llamada por objetos del
delegado MultiDelegate.
Los mtodos referenciados
pueden ser de cualquier clase o
estructuraque tengan mismo
tipo de retorno y misma firma.
Los mtodos invocados pueden
ser mtodos de instancia o
mtodos estticos [static].

Alternativa opcional creacin variable e instanciacin en 1 lnea

Multiplicar t;
Instanciacin

Multiplicar t = new Multiplicar (Triplicar);

t= new Multiplicar (Triplicar);


Creain de un objeto Delegado con mtodo deseado como parmetro.
Forma simplificada a partir de C#2.0 : t =Triplicar;

Invocacin

int result = t ( 3);


Invocacin del mtodo, con el argumento de firma del objeto.
t en realidad llama al mtodo Invoke de la clase creada por el runtime.
Tambin posible : int result = t.Invoke (3);

A. P.

Visual C# 2010 v.1

Creacin de un objeto Delegado con mtodo deseado como parmetro.


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,
cuyos parmetros y retorno de la declaracin.
Invoke() se usa para llamar sincronamente a
cada mtodo registrado en el delegado.
BeginInvoke() y EndInvoke() llaman al mtodo
actual asincronamente en un hilo separado de
ejecucin proporcionado por el delegado.
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
por su nombre en el delegado.
Es la forma normal.
int Triplicar (int x)
{
return x*3
}

delegate int Multiplicar (int x);


Multiplicar int t = new Multiplicar (Triplicar);

int Duplicar (int x)


{ return x*2 }

C# 2.0

Un mtodo annimo se declara en


lnea, al instanciar el delegado.
No existe como mtodo separado, al
que se pueda llamar por su nombre
desde otro sitio. Se define en el
delegado al declararlo.

delegate int Multiplicar (int x);


Multi tri = delegate (int x)
{
return x*3
}

Las expresiones Lambda son una


forma alternativa de asignar
mtodos a delegados de forma
an ms simplificada.
=> es el operador Lambda.

delegate int Multiplicar (int x);


Multiplicar tri => (int x)
{
return x*3
}

Introducido con C# 2.0

delegate int Multiplicar (int x);


Multiplicar tri => x
{
return x*3
}

int Triplicar (int x)


{ return x*3 }
If (a=true)
{ t = new Multiplicar (Triplicar); }
else
{ t = new Multiplicar (Duplicar) ; }
....
Console.WriteLine (t (x));

delegate int Multiplicar (int x);


Multiplicar tri => x
{
x*3
}

Aqui en la sentencia final, la variable delegado t se usa


como parmetro de la funcin WriteLine que ejecutar
a su vez la funcin marcada en la decisin del delegado.
A. P.

C# 3.0

Opciones
cuando
existe un
solo
parmetro

Introducido con C# 3.0


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

Declaracin evento
del tipo Delegado.

Delegado

Suscriptores registran
controladores de eventos
en el delegado.

Suscriptor[es]

Llamada a controladores registrados

Controlador evento 1
Controlador evento 2

A. P.

Visual C# 2010 v.1

Respuesta al evento

Respuesta al evento

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.

evento (firma);

Clase emisora
[Publisher o
Broadcaster]

Declaracin evento
del tipo Delegado.
event delegado evento;
Un evento es un miembro de
una clase [emisora].

ControlEvento1 (firma)

delegate void delegado (firma);


Lista de llamadas
[controladores registrados
con la misma firma y
retorno del delegado]

evento += new delegado(ControlEvento1);


evento += new delegado(ControlEvento2);

Suscriptores registran
controladores de eventos
en el delegado con
operadores += y .=.

Suscriptor2

ControlEvento2 (firma)
Llamada a controladores registrados en delegado
ControlEvento1 (firma)

Registro tambin posible:


evento += ControlEvento1;
evento += ControlEvento2;
A. P.

ControlEvento2 (firma)
Se llaman sucesivamente todos los controladores registrados,
con los mismos argumentos para todos ellos.
Visual C# 2010 v.1

Los controladores de evento


pueden ser de la misma clase del
emisor o de clases diferentes.
Pueder ser mtodos estticos
o de instancia.
Pueden ser mtodos annimos o
expresiones lambda.

85

Eventos : pasos necesarios


Cdigo necesario para la gestin de eventos

Clase Emisora

Declaracin
Delegado

Objeto que genera evento Informacin adicional

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.
El delegado define la firma de los eventos que lo usan y de los controladores que se registran en l.

Declaracin
Evento
Tipo Delegado

public [static]

event

Nombres de eventos separados por comas

EventHandler

Registro
Evento(s)

[tambin en runtime]

oe.Evento1 += new EventHandler(os.Control1);

oe es un
objeto de
la clase
emsora

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
cdigo que genera son vlidas.
el evento

oe.Evento1 += os.Control1;
Forma simplificada a partir de C# 2.0.
[static] es la clase la que registra el evento, no sus instancias.

evento1 (source, args) ;


Generacin del evento con nombre evento y parmetros.
Slo desde la propia clase que lo define.
A. P.

Clase Suscrita
Se pueden suscribir varios controladores a un mismo
evento, y todos sern llamandos al generarse el
evento. Estos pueden ser controladores que forman
parte de la clase que genera el evento, o
controladores definidos en otras clases (suscritas).

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.

+= Aadir controlador
-= Quitar controlador

La declaracin del Delegado y el registro de


controladores pueden ir fuera de la clase emisora.
Si el delegado se declara dentro de la clase, puede
llevar prefijos public, protecte, internal o private.

Visual C# 2010 v.1

os es un
objeto de
la clase
Suscrita

Declaracin
Controladores
Evento(s)

public void Control1 (object source, EventArgs args);


{
....
}

Declaracin de controlador de evento en clase suscrita,


con misma firma declarada en el delegado del evento,
y cuyo nombre suele ser el nombre del evento seguido
de EventHandler.
Puede ser un mtodo de instancia o de clase.
Debe registrarse para el evento al que responde.
Puede ser mtodos annimos o expresiones lambda.
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]

delegate void EventHandler (object sender, EventArgs e);


No necesita declararse. Incluido en System.

Recomendado [si se devuelven datos]

delegate void FinalEventHandler (object sender, FinalEventArgs e);


public class FinalEventArgs : EventArgs
{
private string dato; // campo privado
public string Dato
//propiedad
{
get {return dato; }
set { dato = value ; }
}
}

public class FinalEventArgs : EventArgs


{
public string dato;
}

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.
El 2 parmetro deriva de EventArgs y contiene los datos de evento.
Si el evento no genera datos de evento, el 2 parmetro es
simplemente el valor del campo EventArgs.Empty .

La clase de datos de eventos personalizada FinalEventArgs, deriva


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
finalizar con EventArgs.

Como campo [e.dato]

Como propiedad [e.Dato]

Recomendado : delegado genrico [si se devuelven datos]

delegate void EventHandler <TEventArgs> (object sender, TEventArgs e);


A. P.

Visual C# 2010 v.1

Si el evento genera datos, se puede usar la clase


delegado genrico EventHandler<TEventArgs>.

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
suscrita al evento.

[modificadoracceso] tiporetorno Evento1EventHandler (firma)

Registro

Registro
Evento(s)

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


+= Aadir controlador
-= Quitar controlador
[tambin en runtime]

Estas 2 formas de
registrar eventos
son vlidas.

oe es un objeto de la clase emsora


os es un objeto de la clase suscriptora

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
A. P.

clase.evento1 += os.Evento1EventHandler;
Visual C# 2010 v.1

Evento static
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)
....
....
public class EmisoraEjemplo
{
....
public event delegadovalido Evento1;
....
public void OnEvento1(firma)
{
If (Evento1 != null)
Evento1 (firma) ;
}
..
}
En la clase emisora se incluye un mtodo con el
nombre (recomendado) OnEvento1 que:
- 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.

A. P.

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.
Ejemplo con:
delegate void delegadovalido(object sender);
//delegado
public void Evento1EventHandler(object sender) {...} / /controlador
....
OnEvento1(azul);
//azul es el objeto emisor en este ejemplo
....
....
Evento1(sender);
//bajo sender se enva azul al controlador
....

delegate void delegadovalido (firma);

[modificadoracceso] void Evento1EventHandler (firma)


Visual C# 2010 v.1

89

Ejemplo simple de eventos : planteamiento


class Carrera
Partimos de la clase Coche a la
que queremos aadir un evento
que se producir cuando el
campo recorrido de sus objetos
(coches) alcancen un
determinado valor (meta).

Coche c1 = new Coche() ;


c1.color = verde;
c1.numero = 1;
c1.recorrido = 0 ;

class Coche

1
2

Coche c2 = new Coche() ;


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

public string color ;


public int numero ;
public int recorrido ;

Coche c3 = new Coche() ;


c3.color = azul;
c3.numero = 3;
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.

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


c2.Final += new System.EventHandler(Llegada);
c3.Final += new System.EventHandler(Llegada);
Si el evento se declara static, bastara con un slo controlador

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


public static event EventHandler Final ; // evento static

Registro de controlador(es)
(Llegada) con el delegado

Coche c1 = new Coche() ;


c1.color = verde;
c1.numero = 1;
c1.recorrido = 100 ;

class Coche
Coche c2 = new Coche() ;
c2.color = rojo;
c2.numero = 2;
c2.recorrido = 200 ;

Slo falta que


aparezca el
evento !
public string color ;
public int numero ;
public int recorrido ;

Algn cdigo se encarga de hacer


avanzar el recorrido de cada coche
[no contemplado aqu].

Coche c3 = new Coche() ;


c3.color = azul;
c3.numero = 3;
c3.recorrido = 300 ;

public event EventHandler Final;

public void Llegada (object sender, EventArgs e);


{

Declaracin del evento declarando


el delegado al que se acoje.

MessageBox.Show (Ganador: + sender.ToString()) ;

}
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);
c3.Final += new System.EventHandler(Llegada);

class Coche
4

public event EventHandler Final;

....
If (c1.recorrido >= meta)
{OnFinal (verde, EventArgs.Empty);}
If (c2.recorrido >= meta)
{OnFinal (rojo, EventArgs.Empty);}
If (c3.recorrido >= meta)
{OnFinal (azul, EventArgs.Empty);}
....

1
2

Aqui se generan los


datos del evento.

public void OnFinal (object sender, EventArgs e)


{
If (Final != null)
//se comprueba que hay algn controlador registrado
Final (sender, e) ;
//se lanza el evento, como si fuera un mtodo normal
}
A. P.

Aqui llega el evento !

public string color ;


public int numero ;
public int recorrido ;

Coche c1 = new Coche() ;


c1.color = verde;
c1.numero = 1;
c1.recorrido = 100 ;

Coche c2 = new Coche() ;


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

Coche c3 = new Coche() ;


c3.color = azul;
c3.numero = 3;
c3.recorrido = 300 ;

public void Llegada (object sender, EventArgs e);


{
MessageBox.Show("Ganador: " + sender.ToString()); // sender = azul en este caso
}
Aunque hay un slo controlador, a travs de sender se obtiene el coche ganador.
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.

Visual C# 2010 v.1

92

Indice

Cdigo simplificado del ejemplo Carrera


using System;
...
using System.IO;

Se han eliminado
todos los detalles
salvo los relativos al
evento Final.

Sentencias using

namespace WPFCarrera
{
public partial class Carrera : Window
{
static Coche c1 ;
static Coche c2;
static Coche c3;
static int Meta = 1400;

public class Coche


{
public string Name;
public int CarNum;
public string CarCol;
public int CarPos;
//este campo detectar la Meta
public static event EventHandler Final;

Declaracin Delegado

public Carrera ( )
{
InitializeComponent ( );

public Coche() { }

c1 = new Coche("Coche1", 1, "verde", 0);


c2 = new Coche("Coche2", 2, "rojo", 0);
c3 = new Coche("Coche3", 3, "azul", 0);
Coche.Final += new System.EventHandler(Llegadacompleta);
}
public void Llegadacompleta(object sender, EventArgs e)
{
MessageBox.Show("Ganador: " + sender.ToString());
}
public void Tick (object sender, EventArgs e)
//sin detalles
{
Acumular();
}
public void Acumular()
{
//no se detalla como se efecta la acumulacin en campo CarPos.

A. P.

//Declaracin Evento

public void OnFinal(object sender, EventArgs e)


{
if (Final != null)
//se comprueba haya algn controlador registrado
{
Final(sender, e);
//se lanza evento como un mtodo normal
}
}

public delegate void SystemEventHandler(object sender, EventArgs e);

Carrera.c1.OnFinal("verde", EventArgs.Empty);
Carrera.c2.OnFinal("rojo", EventArgs.Empty);
Carrera.c3.OnFinal("azul", EventArgs.Empty);
}

3
6

public Coche(string CarName1,int CarNum1, string CarCol1, int CarPos1)


{
Name = CarName1;
CarNum = CarNum1;
CarCol = CarCol1;
CarPos = CarPos1;
}

Asignacin controlador
al evento Final de Coche
Controlador que
responde al evento,
presentando ventana
con color del ganador.

}
}

Deteccin del evento, uno


por cada objeto. No se
indican los detalles de
alcanzar la Meta.
En la llamada que se hace
al mtodo OnFinal se
incluye el color del
ganador como argumento.
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

using System;
using System.Timers;

Timer

mtodos

Start()
Stop()
Timer()
constructores

Timer(ms)

Timer timer1 = new Timer();

Timer timer1 = new Timer(1000) ;

namespace ConsolaTimer
{
class Programa
{
static string VerTxto= Consola";
static void Main ( )
{
Timer timer1 = new Timer(1000);
timer1.Elapsed += new ElapsedEventHandler(Escribe);

propiedades

timer1.Start();

Interval
En milisegundos

Enabled

timer1.Interval = 1000;

Se crea objeto Timer


de nombre timer1, se
le asigna un intervalo
de 1000 ms.
El objeto timer1
genera el evento
Elapsed, y el delegado
ElapsedEventHandler,
llama al mtodo
Escribe al que apunta,
el cual presenta el
texto de la variable
VerTxto.

Console.ReadKey();

}
static void Escribe(object source, ElapsedEventArgs e)
{
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

Se crea objeto Timer


de nombre timer2, se
le asigna un intervalo
de 1000 ms.
El objeto timer2
genera el evento Tick,
y el delegado
EventHandler llama al
mtodo Tick al que
apunta, el cual genera
la ventana de texto.

using System;
using System.Windows;
using System.Windows.Threading;
namespace WpfApplicationTimer
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
DispatcherTimer timer2 = new DispatcherTimer();
timer2.Interval = TimeSpan.FromMilliseconds(1000);
timer2.Tick += new EventHandler(Tick);

timer2.Start();
}
static void Tick(object source, EventArgs e)
{ MessageBox.Show("DispatcherTimer"); }
}
}

clase

DispatcherTimer

Start()
mtodos

Ejemplo: aparecer por pantalla un texto a cada intervalo de tiempo.

System.Windows.Threading

Stop()
DispatcherTimer()
constructor

propiedades

WPF

Interval
IsEnabled

Tick

Evento

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

using System;
using System.Windows;

Timer

mtodos

Start()
Stop()
Timer()

Timer timer3 = new Timer();

propiedades

constructor

Evento

Interval
En milisegundos

Enabled
Tick

timer3.Interval = 1000;

namespace FormsTimer
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
Timer timer3 = new Timer();
timer3.Interval = 1000;
timer3.Tick += new EventHandler(Tick);
timer3.Start();
}
static void Tick(object source, EventArgs e)
{
MessageBox.Show(FormsTimer");
}
}
}

Se crea objeto Timer


de nombre timer3, se
le asigna un intervalo
de 1000 ms.
El objeto timer3
genera el evento Tick,
y el delegado
EventHandler llama al
mtodo Tick al que
apunta, el cual genera
la ventana de texto.

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


WriteLine incluye un salto de lnea al final
del texto y Write no.

La diferencia entre Read y ReadLine es que


ReadLine lee despus de detectar ENTER.

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


de nuevo se repite mientra continua pulsada

Clase KeyPressEventArgs

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
Control
Handled
KeyCode

La clase KeyPressEventArgs se asocia con KeyPress.


Representa al carcter pulsado.
Es parte del namespace System.Windows.Forms, y
hereda de la clase System.EventArgs.
Handled
Propiedades

public

Propiedades

KeyData

public
KeyValue
Modifiers

KeyChar
A. P.

Obtiene o establece si el
carcter ha sido tratado.
Si es True, el control no
recibir el carcter.
Obtiene el valor del carcter
presionado.

Shift
Visual C# 2010 v.1

Si se puls tecla Alt


Si se puls tecla Control
Obtiene o establece si el evento ha sido tratado.
Obtiene la tecla pulsada como un valor de la
enumeracin Keys.
Obtiene la combinacin de teclas pulsadas al mismo
tiempo la enumeracin Keys.
Obtiene el valor int del carcter correspondiente a la
combinacin de teclado.
Obtiene la combinacin de teclas modificadoras
pulsadas o liberadas usando la enumeracin Keys.
Obtiene si se puls la tecla Shift.
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.


La propiedad de slo lectura MouseWheelPresent en la clase SystemInformation
indica si el sistema operativo cree que hay una rueda de ratn presente.

Clase MouseEventArgs

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
Clicks
Propiedades

Delta
X
Y

A. P.

Obtiene la enumeracin MouseButtons


correspondiente al botn del ratn pulsado.
Obtiene el n de veces que se puls y liber el botn
del ratn. El DoubleClick es un evento propio del ratn.
Obtiene un entero con signo representado el n de
giros de la rueda del ratn en un slo movimiento.
Obtiene la coordenada x de la posicin del puntero.
Obtiene la coordenada y de la posicin del puntero
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

Mtodos

Show(Mensaje)
Show(Mensaje, Rtulo)
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

Files y Streams

Indice

[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


para la entrada de caracteres
mediante una codificacin
determinada.

StreamReader
FileStream

texto
StreamWriter

MemoryStream

bytes
StreamWriter est diseado
para obtener caracteres como
salida en una codificacin
determinada.

A. P.

int
double
string
...

BufferedStream

BinaryReader

Cada secuencia
tiene su almacn
de respaldo
asociado.

NetworkStream
BinaryWriter

BinaryReader lee datos primitivos como valores


binarios en una codificacin especfica.

Visual C# 2010 v.1

BinaryWriter escribe datos primitivos como


valores binarios en una codificacin especfica.

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

static

Directory

static

File

static

abstract

Path

FileSystemInfo

Clase base de FileInfo y DirectoryInfo.

FileInfo

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

DirectryInfo

mtodos de instancia para crear, mover y borrarr directorios y subdirectorios

abstract

Cada clase derivada de Stream proporciona una implementacin


especfica para un entorno particular.

Stream

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
StringReader

Lee caracteres de una secuencia de bytes en codificacin determinada.

Igual que StreamReader pero para buffer en lugar de fichero.

abstract

TextWriter

Para escribir una serie secuencial de caracteres.

StreamWriter
* static : no se necesitan objetos
** abstract : miembros que usarn sus clases derivadas
A. P.

StringWriter

Escribe caracteres de una secuencia de bytes en codificacin determinada.

Igual que StreamWriter pero para buffer en lugar de fichero.


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
Utility class*

File

Directory

Path

FileInfo

DirectoryInfo

Create()

CreateDirectory()

GetDirectoryName()

Attributes

Attributes

CreateText()

DeleteDirectory()

GetExtension()

CreationTime

CreationTime

Open()

GetDirectories()

GetFileName()

Exists

Exists

OpenRead()

GetFiles()

Extension

GetRandomFileName()

Extension

OpenText()

Exists()

FullName

FullName

GetTempPath()

LastAccessTime

OpenWrite()

Move()

LastAccessTime

GetTempFileName()

LastWriteTime

LastWriteTime

GetFileNameWithoutExtension()

Name

Name

Mtodos static

AppendText()

AppendText()
Delete()
Exists()
Copy()

Mtodos static

Mtodos para manipular


nombres de ficheros y vias a
dierctorios.

Move()
ReadAllText()

Similar funcionalidad entre File y FileInfo, y entre Directory y DirectoryInfo.

CopyTo()
Create()

Create()
CreateDirectory()

CreateText()

Delete()

Delete()

GetDirectories()

Directory

GetFiles()

DirectoryName

WriteAllText()

Length

MoveTo()

GetCreationTime()

MoveTo()

Parent

GetLastAccessTime()

Open()

Root

Mtodos static

A. P.

clase
abstracta

FileSystemInfo

Utility class*

Miembros

Miembros

Utility class*

OpenRead()

*Una clase utilitaria (utility class) es una clase que expone toda
su funcionalidad a nivel de clase, es decir con miembros static.
Son clases pensadas para uso general, sin recurrir a objetos.
Visual C# 2010 v.1

OpenText()
OpenWrite()
104

Lectura/escritura de texto desde clase File


System.IO
Mtodos estticos para crear, copiar, borrar, mover y abrir archivos
y contribuye a la creacin de objetos System.IO.FileStream.
Mtodos
estticos*
de la clase File

OpenText

File

Abre un archivo existente con


codificacin UTF-8 para lectura.

FileInfo

Clase [static] File

Exists

Retorna un
StreamReader

StreamReader

Espacio de nombres System.IO

CreateText

AppendText

Retorna un
StreamWriter

Crea fichero si no
existe, y retorna un
StreamWriter para
escribir al final fichero

Crea o abre un archivo para escribir


texto con codificacin UTF-8.

Las clases StreamReader y StreamWriter


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

Tambin posible
desde FileInfo
Mtodos
estticos*
de la clase File

StreamWriter

Mtodo

Descripcin

Mtodo

Descripcin

Peek

Lee siguiente carcter del texto sin cambiar el estado del reader, de
forma que otros mtodos puedan leer el carcter ms tarde

Flush

Escribe datos en buffer en la salida subyacente

Read

Lee datos desde la entrada. Versiones sobrecargadas de este mtodo


leen un nico carcter o un array de caracteres hasta cierta longitud.

Write

Escribe valor en la salida. Este mtodo tiene muchas sobrecargas para


escribir caracteres, array de caracteres, enteros, etc.

ReadBlock

Lee datos desde la entrada a un array de caracteres

WriteLine

Escribe datos en la salida seguidos por secuencia de nueva lnea

ReadLine

Lee una lnea de caracteres en la entrada y los devuelve en una cadena .

Close

Cierrar el writer y libera recursos en uso

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");


MessageBox.Show(str.ReadLine()).ToString();
str.Close();

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


stwa.WriteLine(Linea aadida");
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.

StreamReader
Peek ()

mtodos

Read ()

//2 sobrecargas

ReadBlock ()
ReadLine ()
ReadToEnd ()

Peek : devuelve el siguiente carcter disponible pero no lo consume.


Flush : borra todos los bufferes internos.

propiedad

Close ()
EndOfStream

Stream es la clase base de todas las secuencias.


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.
StreamReader lee lneas de informacin desde un archivo de
texto estndar.
StreamWriter est diseado para dar salida a caracteres
en una codificacin determinada.
Estas 2 clases se usan para leer/escribir textos en un fichero.
No soportan acceso aleatorio.

clase

Flush()
Write ()

//varias sobrecargas

WriteLine ()

//varias sobrecargas

Close ()

NewLine

//bool

StreamReader stin = new StreamReader(@E:\test.txt);


MessageBox.Show(stin.ReadLine().ToString());
stin.Close();

A. P.

StreamWriter

mtodos

clase

System.IO

propiedad

namespace

El carcter @ precediendo al nombre de un fichero


hace que se tome dicho nombre literalmente.
@"C:\Temp\MyDir\MyFile.doc
es equivalente a
"C:\\Temp\\MyDir\\MyFile.doc"
que usa \\ para insertar la barra invertida.

Append
StreamWriter stout = new StreamWriter(@E:\test.txt,true);
stout.WriteLine();
//linea en blanco
stout.WriteLine(Nueva linea aadida);
// linea aadida
stout.Close();

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


Visual C# 2010 v.1

106

Lectura/escritura de datos primitivos

Indice

System.IO

BinaryReader

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

Mtodos Read
sobrecargados

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


BinaryReader binReader = new BinaryReader(fs);
{
MessageBox.Show(binReader.ReadString());
fs.Close();
}
A. P.

BinaryWriter

Mtodos Write
sobrecargados

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


{
binWriter.Write(una cadena texto");
binWriter.Close();
}
Visual C# 2010 v.1

107

Indice

Bucles de decisin if y switch


switch ( variable) {case1 .................................}

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


Condition
= true ?

No
Case 1

else

Si

default

switch
(variable)

sentencias1
break;

sentencias2

sentencias1
}

{
Case 3

Case 2

}
{

{
sentencias2
break;

if/else opera slo sobre expresiones Boolean

sentenciasn
break;

sentencias3
break;
}

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

else if

Condition
= true ?

else

sentencias2

break;
case valor2 :
//sentencias2

sentencias3

Si

break;
default :

{
sentencias1

Tras cada bloque de sentencias


ejecutable, debe ir
obligatoriamente un break.

//sentenciasn

A. P.

La variable usada en switch


puede ser numrica o incluso
una cadena o enumeracin.

//sentencias1

{
}

switch (variable)
{
case valor1 :

break;
}
Visual C# 2010 v.1

default es una opcin fuera de


las conmutables.
108

Bucles while y do/while


El bucle while se usa para ejecutar un bloque de
sentencias hasta que se alcanza una condicin.
Puede no ejecutarse nunca, si no se d la condicin.

do/while se usa para realizar una accin un n


indeterminado de veces.
El bloque de cdigo se ejecuta al menos 1 vez.

do { ... } while (condicion) ;

while (condicion) { ... }

do

while
continue ;

Condicion
= true ?
continue ;

No

sentencias
}

Si

loop while

sentencias
}
break ;

Si

loop

break ;

Condicion
= true ?

No

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

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

A. P.

Visual C# 2010 v.1

109

Indice

Bucles for y foreach


Repeticin de un bucle un n definido de veces,
desde condicin inicial hasta final.

Recorre todos los elementos de un contenedor,


linealmente, sin preocuparse de su lmite superior.

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

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


foreach (int n in dec)

for (i=0; i<10;i++)

continue ;

sentencias

i++

Condicin
next n

break ;

No

true ?

10
20

No

Si

30
40

Recorre todos
los elementos
de la matriz

continue ;

{
sentencias

break ;

50

Si

for (i = 0; i < 10; i++)


{
MessageBox.Show(i.ToString());
}

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


foreach (int n in dec)
{
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
excepcin.

try
{
// cdigo que trata y lanza las excepciones

}
catch (<exceptionType> e)
{
//explicita excepciones a tratar

}
catch [opcional - alternativa]
{
//explicita excepciones alternativas
finally cdigo que se ejecuta siempre,
bien tras un bloque try sin excepcin, o tras
tratar una excepcin en bloque catch o bien
antes de que no excepcin no tratada
progrese hacia arriba en la pila de llamadas.

catch contiene el cdigo que se ejeucta


cuando se producen las excepciones.
Los bloques catch se pueden especializar
para tratar tipos concretos de excepciones,
por lo que puede haber varios bloques catch.
Es posible omitir totalmente este parmetro,
y tener un un bloque general catch para
todas las excepciones.

}
Finally [opcional]
{
//se ejecuta ocurran o no excepciones

}
Las excepciones ignoradas, por defecto,
producen el bloqueo del programa.

A. P.

Visual C# 2010 v.1

111

Directivas de preprocesamiento

Indice

[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

#else

Si el #if #elif anteriores son false, compila la seccin siguiente

#endif

Marca el final de un #if

#region name

Marca el inicio de una seccin de cdigo. Sin efectos de compilacin.

#endregion name

Marca el final de la seccin de cdigo antes abierta con #region name.

#warning Mensaje*

Visualiza Mensaje de advertencia en tiempo de compilacin

#error Mensaje*

Visualiza Mensaje de error en tiempo de compilacin

#line integer

Fuerza la siguiente lnea de cdigo a ser el n lnea dado por integer.

#line default

Restablece la numeracin y en su caso el nombre del fichero

#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.

#region Bloque1
#region y #endregion definen el inicio y
final de un bloque de cdigo que puede
ser expandido o contraido a voluntad,
para tener un vista rpida o detallada.
Es para facilitar la visibilidad del cdigo.
#endregion Bloque1

El bloque queda comprimido a una sola


lnea con el nombre del bloque. Al hacer
click sobre el signo +, se abre el bloque.

* 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*

Mtodos relevantes

// Obtener tipo con typeof.

GetFields()

GetField()

FieldInfo[ ]

GetProperties()

GetPropertie()

PropertyInfo[ ]

GetMethods()

GetMethod()

MethodInfo[ ]

GetEvents()

GetEvent()

EventInfo[ ]

GetConstructors()

GetConstructor()

ConstructorInfo[]

propiedades

Name
Namespace
Assembly

Type t = typeof(Coche);
No se necesita un objeto

Obtenido un Type t por alguno de los 3 mtodos:

FieldInfo[ ] fi = t.GetFields ( );
MessageBox.Show ( fi [0].ToString ( ) );
GetFields(), GetMethods(), GetProperties(),
GetEvents() y GetConstructors()
dan como respuesta una matriz
FieldInfo[] , MethodInfo[] , PropertyInfo[],
EventInfo[], y ConstructorInfo[] respectivamente.
Estas matrices son miembros de System.Reflection.

//Obtener tipo con GetType**() de System.Type.


Type t = Type.GetType(WPFCarrera.Coche);
Usar el string oficial completo del tipo buscado.
** El mtodo Type.GetType() tiene una sobrecarga
que admite 2 argumentos booleanos, el primero
para lanzar o no una excepcin si no se encuentra
el nombre del tipo, y el segundo para considerar o
no diferencias entre maysculas y minsculas .
** Para examinar un tipo de un ensamblado
externo, se debe dar nombre completo del tipo, y
separado por coma (,) el nombre del ensamblado.

* 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
Los atributos aplican a los targets siguientes:

Atributo*

Significado

CLSCompliant

Comprueba la conformidad con el CLS

Serializable

Declara que la entidad es serializable

NonSerialized

Decladra la entidad no serializable

Obsolete

La entidad no es utilizable

DLLImport

Declara que la entidad es cdigo no gestionado (unmanaged).

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 ha omitido el sufijo Attribute en los nombres de los atributos. El compilador lo acepta.

[Serializable()]
public class Coche()
{
...
}
A. P.

Visual C# 2010 v.1

Tipos (clases, enum, structs, delegates, interfaces)


Ensamblados
Mdulos
Mtodos
Campos
Propiedades
Eventos
Parmetros
return

Se pueden asociar explicitamente atributos a


determinadas entidades, colocando el target
seguido por dos puntos antes del atributo.
[method : ObsoleteAttribute ]

114

C# y Windows Forms - un ejemplo bsico

Indice

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;

Ventana del programa

Colocacin en ventana(s) de controles y edicin de sus caractersticas de tamao,


ubicacin, color, etc, en la Ventana de Propiedades de cada control.

namespace WindowsFormsApplication22
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void btnVer_Click(object sender, EventArgs e)
{
textBox1.Text = "Altamira";
}
private void btnSalir_Click(object sender, EventArgs e)
{
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

XAML <Label Name=e1" Width=100 Height="20"> Calle </Label>


En el marcado XAML, hay que dar nombre a los elementos que se tratan en cdigo.

Acceso a
travs de
Name

e1.Width = 100;
e1.Height = 20;
e1.Text = Calle;

Cdigo C#

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;

Con cdigo se programan mtodos en


general, en particular los controladores
de eventos, y se generan bucles y tratan
decisiones lgicas.
A. P.

namespace WpfApplicationTest
{
public partial class MainWindow : Window
{
public MainWindow()
{ InitializeComponent(); }
private void button1_Click(object sender, RoutedEventArgs e)
{ textBox1.Text = "Altamira"; }
private void button2_Click(object sender, RoutedEventArgs e)
{ Close(); }
}
}
Visual C# 2010 v.1

117

Indice

A. P.

Visual C# 2010 v.1

118

Vous aimerez peut-être aussi