Académique Documents
Professionnel Documents
Culture Documents
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.
Lenguaje C # 2010
Indice
[C # 4.0]
A. P.
Plataforma .NET
Lenguajes de
Visual Studio
Especificacin
comn lenguaje
C++
C#
J#
Biblioteca de clases
organizada en
Espacios Nombres
.NET Framework
Servicios necesarios
para ejecutar una
unidad de cdigo
Funciones del SO
[Windows]
A. P.
Definicin de tipos,
bloques de programa,
y sus metadatos.
Visual
Basic
Cdigo fuente
C++
Cdigo fuente
C#
Compilador
VB2010
Compilador
C++
Compilador
C#
Indice
Indice
Compilador VB
Compilador C++
Compilador C#
Just-in-Time [JIT]
por CPU
Just-in-Time [JIT]
por CPU
Just-in-Time [JIT]
por CPU
Indice
Ensamblados
Cdigo fuente
C#
Compilador
C#
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.
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.
Ensamblados
Indice
(continuacin)
Directorio
de la aplicacin
Private
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 ].
GAC
Global Assembly Cache
C:\Windows\assembly\
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 ]
Jitter
Instrucciones
especficas de
Plataforma
Ejecucin
miembro
A. P.
Indice
Web Forms
[ASP.Net]
Crear
interfaz
usuario
Escribir
Debug
cdigo
and Deploy
Uso de Visual
Studio 2010
Acceso
a datos
Depurar e
implantar
- ADO.Net
- LINQ
A. P.
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.
11
Indice
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.
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.
12
Compilacin:
Pestaa Program.cs
Espacios de nombres que el sistema
importa automticamente al inicio.
A. P.
Compilacin:
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.
14
Compilacin:
Pestaa MainWindow.xaml.cs
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.
15
Compilacin:
Indice
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
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
Ms flexible,
pero ms lento
16
Programas en C#
Indice
[ Consola ]
a travs de namespaces
Namespace Uno
[espacio de nombres]
agrupa al conjunto de
tipos (clases, etc) del
programa.
Declaraciones
de Tipos
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,
}
class Otra
{
//cuerpo de la clase Otra con sus miembros.
}
A. P.
17
Estructura de programas en C#
Namespaces:
libreras de clases
System
System.Windows
(continuacin)
System.IO
......
using System;
using ....
Namespace Uno
{
public class Programa
{
static void Main( )
{
Coche c1 = new Coche();
c1.Metodo1 ( );
//...........
}
}
A. P.
class Coche
Definicin de clases
// 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:
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.
Devuelve valor int que indica el xito o fallo del programa, siendo el 0 el que suele indicar xito.
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.
19
Pila de llamadas
1 pila = 1 hilo
Pila de llamadas
Metodo2 ( )
Llamada al mtodo2()
que pasa arriba de la pila.
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.
20
Indice
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.
21
Indice
C# tiene un sistema unificado de tipos, en que todos los tipos una funcionalidad comn.
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
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
bool
string
object
struct
enum
array
delegate
interface
class
Visual C# 2010 v.1
Tipos referencia
char
Tipos personalizables
A. P.
byte
Tipos de valor
Tipos predefinidos en C#
Tipos de datos
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)
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
System.Object
Boolean
Tipos de valor
Long
DateTime
TimeSpan
Delegate
Enumeraciones
Estructuras
A. P.
25
Palabras reservadas en C#
Palabras reservadas por C# y no utilizables en variables*, etc.
26
Smbolos en C#
C# hace un uso especial de ciertos simbolos y notaciones.
Simbolo
Significado
- Tras una clase u objeto, denota que sigue mtodo o propiedad, en la llamada Sintaxis de Punto.
( )
[ ]
{ }
\
\"
\'
\\
\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.
#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.
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
Espacios de nombres,
tipos y miembros
PrimeraClase, MiPos
Camel
miCuenta, miVar
Maysculas
Todo en maysculas
Solo abreviaturas
XML, IO
28
Tipos de valor
A. P.
Tipos de referencia
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 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
Tipos de valor
Tipo referencia
Objeto**
referenciado
por
r
Memoria de pila
funciona segn
principio LIFO
[last in, first out]
A. P.
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]
tipodato s1 ;
Variable Local
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
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.
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
Referencia
a un objeto
Tipos de referencia
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
32
Variables de valor
Memoria
pila [stack]
v1 = 22
Valor
v2 = 22
Referencia
r1
Referencia
r2
Memoria
montn [heap]
pepe
juan
Tipos de referencia
Tipos valor
v2
A. P.
Valor
Variables de referencia
r2
r1
v1
Visual C# 2010 v.1
33
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()
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()
IsLetter()
Una barra invertida \ precediendo a un carcter indica que este carcter no tienen el significado habitual [secuencia de escape].
Mtodos estticos
IsLetterOrDigit()
IsSeparator()
IsSymbol()
IsLower()
IsUpper()
ToLower()
ToUpper()
MessageBox.Show(char.ToUpper((char)(101)).ToString());
* Ambas son vlida \x0065\ y \u0065
ToString()
A. P.
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 +.
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.
Significado
\\
\a
Inserta alarma
\b
Inserta retroceso
\f
\n
\r
\t
\v
\xhhhh
\xhhh
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
TIPOS
ENTEROS
byte
sbyte
short
ushort
int
uint
Long
ulong
Implcita
float
double
explcita
explcita
explcita
implcita
explcita
decimal
36
Clase Convert
La clase Convert contiene mtodos para diferentes conversiones entre tipos.
namespace
System
Clase
static
Convert
ToInt32()
int x = Convert.ToInt32(textBox1.Text.ToString());
ToDecimal()
ToDouble()
ToByte()
ToChar()
ToDateTime()
ToString()
as
is
A. P.
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
DateTime
TimeSpan
Add ()
Add ( )
Compare ()
Substract( )
DateTime ()
Compare()
Date
TimeSpan ()
Ejemplos
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
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
char[n] vocales ;
Una vez creado, los elementos reciben el valor por defecto del
tipo a que pertenecen (para int 0, etc).
Namespace
System
Clase
abstracta
Array
Length
int p1 = vocales.Length; // 5
Rank
int p2 = vocales.Rank; // 1
Array de 3 dimensiones
Propiedades
Clear()
Algunos mtodos
IndexOf()
LastIndexOf()
a e i o u
Reverse()
Sort()
GetValue()
GetUpperBound()
A. P.
int p3 = Array.IndexOf(vocales,a); // 0
// e
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
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
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.
a=i1
i=i-1
a=i
i=i-1
Visual C# 2010 v.1
40
Indice
Clases
de . NET Framework
o de terceros
Clases definidas
en el programa
Instanciacin
Clase
Visual C# 2010 v.1
System.Windows.Forms
System.IO
System.Drawing
System.Net
System.Environment
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.
42
Objetos
Objetos
Un universo
de objetos
Encapsulacin
Polimorfismo
Instanciacin
Sin detalles
Detalles
ocultos
Interface(s)
[implementacin]
Clase (base)
Instanciacin
Nuevo atributo
Detalles
ocultos
: [Herencia]
Clase derivada
43
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
Abstraccin
Abstraer sus caractersticas y
acciones relevantes al fin deseado
A. P.
Mtodos
Su comportamiento
}
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].
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)
}
Definicin de una clase mostrando sus elementos y todos los posibles miembros que puede contener.
A. P.
45
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
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
Significado
abstract
async
const
extern
event
Declara evento
new
override
Tipos
partial
Miembros
readonly
sealed
Clase no heredable
static
unsafe
Contexto no seguro
virtual
volatile
Tipos
47
Modificadores de clases
Modificadores de clase
public class A1
private class A2
internal class A3
protected class A4
Clase derivada
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.
No-abstracta
abstracta
INSTANCIAS
Mtodo uno
Mtodo dos
Mtodo abstracto
: 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.
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
Environment
Min()
GetCommandLineArgs()
Round()
GetEnvironmentVariable()
GetLogicalDrives()
CommandLine
Tan()
CurrentDirectory
IEEERemainder()
Pow()
Log()
Log10()
extracto
SetEnvironmentVariable()
Cos()
Propiedades static
Mtodos static
Sin()
Mtodos static
Math
Max()
A. P.
MachineName
UserDomainName
UserName
WorkingSet
extracto
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
Constantes
Mtodos
Eventos
Constructores
Operadores
Destructores
Indexadores
51
[access modifiers]
El modificadoracceso especifica qu otras partes del cdigo tienen acceso a un miembro dado.
El modificadoracceso se coloca inmediatamente antes del miembro.
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
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
A.nombremiembro
clase C A.nombremiembro
Objetos de clase A
Campos
Operadores
Mtodos
Propiedades
Indexers
Constructores
Eventos
Destructores
static
o1
o1.nombremiembro
o2
o2.nombremiembro
non-static
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.
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]
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
Declaracin
NombreCampo = expresion ;
Inicializacin
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.
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]
tipodato
NombrePropiedad
class TestPropiedad
{
// 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; }
}
}
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.
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
Modificadores de acceso
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.
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]
void si no se
devuelve
ningn valor
{
// cuerpo del mtodo
void
int
Extension methods son una forma de aadir un nuevo mtodo de instancia a una clase existente fuera de su declaracin..
A. P.
57
[modificador acceso]
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.
58
Otras clases
static
Campos
static
Mtodos
static
Constantes*
static
Constructores
static
Eventos
clase B
A.nombremiembro
clase C A.nombremiembro
Objetos de clase A
Campos
Operadores
Mtodos
Propiedades
Indexers
Constructores
Eventos
Destructores
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
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
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
Ni instanciacin ni
herencia.
Son clases con utilidades
de carcter genrico.
Slo miembros static.
Ejemplo es la clase
System.Math
Instanciacin
A. P.
new
60
Overloading
Sobrecarga
Sobreescritura
Overriding
class ClaseBase
{
public int Calcular(int x, int y)
{...}
}
class ClaseBase
{
virtual public int Calcular()
{...}
}
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.
c1
Inicializado
segn firma1
c2
Inicializado
segn firma2
cx
Inicializado
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.
62
Indexers
A. P.
63
Coche car;
car = new Coche( );
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.
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.
64
Inicializacin Objetos
c1.color = verde;
c1.num = 1;
c2.color = rojo;
c2.num = 2;
Inicializacin
Instanciacin
2
c3.color = azul;
c3.num = 3;
3
Clase C#
Instanciacin con palabra clave new
A. P.
Indice
Instanciacin e
Inicializacin Objetos
Clase
Instanciacin + Inicializacin
Constructor Coche
con parmetros
}
3
Clase C#
A. P.
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
Sobreescribible
....................{...}
Se implementa
en derivada
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
clase derivada
Object
: herencia
clase base
class Object
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
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
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.
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
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.
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
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.
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
{
int Cal ( int x, int y, int z);
}
[modificador acceso] class Prueba : ITest
{
int Cal ( int x, int y, int z) {..implementacin..}
}
La documentacin .NET especifica al detalle las condiciones requeridas a un mtodo para implementar un Interface.
A. P.
71
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
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
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)
A. P.
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
Interface
Distinta implementacin !
Clase implementadora
{
public int Doble (int x) ;
Clase
Clase
return x * 2 ;
return x + 2 ;
}
}
}
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.
74
Herencia y Polimorfismo
public class Duplo
{
virtual public int Doble (int x)
{
return x * 2 ;
}
}
Implementacin modificada !
Clase base
Implementacin modificada !
Clase derivada
{
return x 2 ;
Clase
{
return x + 2 ;
Clase
}
}
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.
75
Interface IA
clase Implementadora : IA
{
Metodo1
Metodo1 { ....}
.........
}
Propiedades
objeto i1
i1.Mtodo1 ();
Eventos
Indexers
IA n1 = (IA) i1
n1.Metodo1();
A. P.
76
Clase Abstracta1
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.
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.
{
bool MoveNext ();
object Current { get;}
void Reset ();
}
IEnumerator GetEnumerator();
System.Collections
Interface
Interface
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.
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).
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
enum Zona
{
Norte = 10, Centro = 20, Sur= 30
}
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;
}
Sin constructor.
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.
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
variable
del tipo
Instanciar
Declarar variable
Declarar variable
Crear instancia
Crear instancia
de la clase y asignar su
referencia a la variable
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.
Usar la
variable
A. P.
Usar el objeto
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.
Multiplicar t;
Instanciacin
Invocacin
A. P.
Indice
C# 2.0
C# 3.0
Opciones
cuando
existe un
solo
parmetro
83
Indice
Se genera el evento
Emisor
Declaracin evento
del tipo Delegado.
Delegado
Suscriptores registran
controladores de eventos
en el delegado.
Suscriptor[es]
Controlador evento 1
Controlador evento 2
A. P.
Respuesta al evento
Respuesta al evento
84
(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)
Suscriptores registran
controladores de eventos
en el delegado con
operadores += y .=.
Suscriptor2
ControlEvento2 (firma)
Llamada a controladores registrados en delegado
ControlEvento1 (firma)
ControlEvento2 (firma)
Se llaman sucesivamente todos los controladores registrados,
con los mismos argumentos para todos ellos.
Visual C# 2010 v.1
85
Clase Emisora
Declaracin
Delegado
Declaracin
Evento
Tipo Delegado
public [static]
event
EventHandler
Registro
Evento(s)
[tambin en runtime]
oe es un
objeto de
la clase
emsora
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.
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
os es un
objeto de
la clase
Suscrita
Declaracin
Controladores
Evento(s)
Los eventos pueden usar cualquier delegado vlido, incluso sin firma.
87
Controladores de eventos
[EventHandlers]
Registro
Registro
Evento(s)
Estas 2 formas de
registrar eventos
son vlidas.
oe.evento1 += os.Evento1EventHandler;
Forma simplificada de registro a partir de C# 2.0. [method group conversion]
Si el evento es static,
la clase registra el evento
A. P.
clase.evento1 += os.Evento1EventHandler;
Visual C# 2010 v.1
Evento static
88
[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
....
89
class Coche
1
2
A. P.
90
Registro de controlador(es)
(Llegada) con el delegado
class Coche
Coche c2 = new Coche() ;
c2.color = rojo;
c2.numero = 2;
c2.recorrido = 200 ;
}
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.
91
class Coche
4
....
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
92
Indice
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;
Declaracin Delegado
public Carrera ( )
{
InitializeComponent ( );
public Coche() { }
A. P.
//Declaracin Evento
Carrera.c1.OnFinal("verde", EventArgs.Empty);
Carrera.c2.OnFinal("rojo", EventArgs.Empty);
Carrera.c3.OnFinal("azul", EventArgs.Empty);
}
3
6
Asignacin controlador
al evento Final de Coche
Controlador que
responde al evento,
presentando ventana
con color del ganador.
}
}
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
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
LostFocus
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
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
private void bSalir_Click(object sender, RoutedEventArgs e) { ...................} // controlador agregado automaticamente por el IDE al hacer click en botn bSalir.
A. P.
94
Indice
Timers - I
La clase Timer genera eventos - Elapsed - a intervalos regulares de tiempo en aplicaciones de CONSOLA.
Namespace
Consola
System.Timers
using System;
using System.Timers;
Timer
mtodos
Start()
Stop()
Timer()
constructores
Timer(ms)
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;
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.
95
Timers - II
La clase DispatcherTimer genera eventos - Tick - a intervalos regulares de tiempo en aplicaciones WPF.
Namespace
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
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.
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()
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");
}
}
}
Hay otras clases Timer en .NET: en System.Threading [WPF], en System. TimerS [CONSOLA].
A. P.
97
Indice
Espacio de nombres
System
System
Clase Console
Clase Console
Console
Console
Console.Read( );
Console.Write( );
Console.ReadLine( );
Console.WriteLine( );
Console.ReadKey( );
A. P.
98
Evento
Descripcin
Argumento Event
KeyDown
Clase KeyEventArgs
KeyPress
Clase KeyPressEventArgs
KeyUp
Clase KeyEventArgs
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
Evento
Descripcin
Argumento Event
MouseDown
Cuando se pulsa un botn del ratn mientras el puntero est sobre el control
Clase MouseEventArgs
MouseEnter
Clase MouseEventArgs
MouseHover
Clase MouseEventArgs
MouseLeave
Clase MouseEventArgs
MouseMove
Clase MouseEventArgs
MouseUp
Cuando se libera un botn del ratn mientras el puntero est sobre el control
Clase MouseEventArgs
MouseWheel
Clase MouseEventArgs
Delta
X
Y
A. P.
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
Ejemplo
101
Files y Streams
Indice
[archivos y secuencias]
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
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
102
System.IO
System.IO
BinaryReader
Lee tipos de datos primitivos como valores binarios en una codificacin especfica
BinaryWriter
static
Directory
static
File
static
abstract
Path
FileSystemInfo
FileInfo
DirectryInfo
abstract
Stream
FileStream
MemoryStream
NetworkStream
BufferedStream
abstract
TextReader
StreamReader
StringReader
abstract
TextWriter
StreamWriter
* static : no se necesitan objetos
** abstract : miembros que usarn sus clases derivadas
A. P.
StringWriter
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
Move()
ReadAllText()
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
OpenText
File
FileInfo
Exists
Retorna un
StreamReader
StreamReader
CreateText
AppendText
Retorna un
StreamWriter
Crea fichero si no
existe, y retorna un
StreamWriter para
escribir al final fichero
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
Read
Write
ReadBlock
WriteLine
ReadLine
Close
ReadToEnd
Close
* Mtodos estticos : se llaman sin necesidad de instanciar la clase. Por ejemplo File.OpenText directamente.
A. P.
105
Para trabajar con ficheros, generalmente hay que hacer uso de streams.
StreamReader
Peek ()
mtodos
Read ()
//2 sobrecargas
ReadBlock ()
ReadLine ()
ReadToEnd ()
propiedad
Close ()
EndOfStream
clase
Flush()
Write ()
//varias sobrecargas
WriteLine ()
//varias sobrecargas
Close ()
NewLine
//bool
A. P.
StreamWriter
mtodos
clase
System.IO
propiedad
namespace
Append
StreamWriter stout = new StreamWriter(@E:\test.txt,true);
stout.WriteLine();
//linea en blanco
stout.WriteLine(Nueva linea aadida);
// linea aadida
stout.Close();
106
Indice
System.IO
BinaryReader
Lectua/escritura de tipos de datos primitivos como valores binarios en una codificacin especfica
Mtodos Read
sobrecargados
BinaryWriter
Mtodos Write
sobrecargados
107
Indice
No
Case 1
else
Si
default
switch
(variable)
sentencias1
break;
sentencias2
sentencias1
}
{
Case 3
Case 2
}
{
{
sentencias2
break;
sentenciasn
break;
sentencias3
break;
}
else if
Condition
= true ?
else
sentencias2
break;
case valor2 :
//sentencias2
sentencias3
Si
break;
default :
{
sentencias1
//sentenciasn
A. P.
//sentencias1
{
}
switch (variable)
{
case valor1 :
break;
}
Visual C# 2010 v.1
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.
109
Indice
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
110
Indice
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.
}
Finally [opcional]
{
//se ejecuta ocurran o no excepciones
}
Las excepciones ignoradas, por defecto,
producen el bloqueo del programa.
A. P.
111
Directivas de preprocesamiento
Indice
[preprocessor directives]
Directiva
Significado
#define identifier
#undef identifier
#if expression
#elif expression
#else
#endif
#region name
#endregion name
#warning Mensaje*
#error Mensaje*
#line integer
#line default
#line hidden
#line filename
#pragma warning
#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
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
using System.Reflection;
Clase abstracta
System.Type*
Mtodos relevantes
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
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.
* 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.
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
Serializable
NonSerialized
Obsolete
La entidad no es utilizable
DLLImport
WebMethod
AttributeUsage
[Serializable()]
public class Coche()
{
...
}
A. P.
114
Indice
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();
}
}
}
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
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.
116
Indice
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.
118