Professional Documents
Culture Documents
El lenguaje de programacin C#
Integracin de Sistemas
Diseo e implementacin con .NET
Introduccin
Primer lenguaje orientado a componentes en la familia C/C++ Qu es un componente?
No slo clases y mtodos, tambin propiedades y eventos Mdulo independiente (desarrollo y reutilizacin) Granularidad mayor que los objetos
Puede incluir mltiples clases
Independiente del lenguaje Normalmente, el desarrollador y el usuario de un componente son totalmente independientes
Introduccin
En lenguajes "puristas" como Smalltalk o Lisp:
Todo es un objeto Problema: eficiencia reducida
Introduccin
En C# todo es un objeto
Todo hereda de System.Object
Es posible declarar un tipo primitivo (long) y trabajar con l de forma eficiente. Adems, es posible asignarlo a un objeto y entonces ser tratado como tal
Incluye mecanismos transparentes de boxing y unboxing Los tipos primitivos slo se tratan como objetos cuando la situacin lo requiere, mientras tanto pueden aplicrseles optimizaciones especficas
El hecho de que todos los tipos del lenguaje deriven de una clase comn, facilita enormemente el diseo de colecciones genricas, que pueden almacenar objetos de cualquier tipo
Hola Mundo
using System; /* Class HelloWorld Description: simple C# example */ class HelloWorld { // entry point public static void Main() { Console.WriteLine("Hello World"); } }
Compilador C#
Ubicacin Compilador C#
C:\windows\Microsoft.NET\Framework\vn.n.nnn\csc.exe
Sintaxis
csc [opciones] fich1.cs [, fich2.cs]
Opciones
/out:ficheroSalida /t:winexe /t:library /r:librera.dll
Por defecto se referencia a mscorlib.dll.
/main:clase
Estructura
Namespaces
Tipos, Namespaces
Declaracin de tipos
Clases, estructuras, interfaces, enumeraciones y delegados
Miembros
Constantes, atributos, mtodos, propiedades, ndices, eventos, operadores, constructores, destructores
Namespaces
Declaracin:
namespace <NombreEspacio> { <Definicin clases> }
Namespaces
using using using using using System; System.Collections.Generic; System.Text; System.Collections; System.IO; using SC = System.Collections; using SIO = System.IO;
static void Main(string[] args) { string username; string filename SC.ArrayList namesCollection;
A qu namespace pertenece?
Referencia
Variables contienen referencias a objetos Valor nulo permitido
i s
Referencia
Raz String Clases Interfaces Arrays Delegados object string class Foo : Bar, IFoo {...} interface IFoo : IBar {...} string[] a = new string[10]; delegate void Empty();
Explcitas
Requieren un cast Pueden originar errores Precisin puede perderse
// implicit // explicit
// explicit // explicit
Boxing
Slo aplicable a tipos valor
Unboxing
Chequea tipo dato Copia valor
int i = 123; object o = i; // boxing int j = (int) o; // unboxing
On the heap
Stream
Hashtable
int
double
MemoryStream
FileStream
Tipos predefinidos
C#
Reference Signed Unsigned Character Floating-point Logical object, string sbyte, short, int, long byte, ushort, uint, ulong char float, double, decimal bool
Tipos predefinidos
Tipo SByte Byte Int16 UInt16 Int32 UInt32 Int64 UInt64 Single Double Decimal Boolean Char String Object Descripcin
Bytes con signo Bytes sin signo Enteros cortos con signo Enteros cortos sin signo Enteros normales Enteros normales sin signo Enteros largos Enteros largos sin signo Reales con 7 dgitos Reales de 15-16 dgitos Reales de 28-29 dgitos significativos Valores lgicos Caracteres Unicode Cadenas de caracteres Cualquier objeto
Bits
8 8 16 16 32 32 64 [-128127] [0255]
Rango
[018.446.744.073.709.551.615] [1,510-453,41038] [5,010-324 1,710308] [1,010-28 7,91028] true, false [\u0000, \uFFFF] Valor mximo determinado por memoria Cualquier objeto
Tipos predefinidos
Problema:
public static void Foo(int x){...} public static void Foo(long x){...} Llamada Foo(100)?
Sufijos
L (long, ulong), U (int, uint), UL (ulong) F (float), D (double), M (decimal)
Ejemplo
Foo(100L) llama al segundo mtodo
10
Reserva de Espacio
int[] coord = new int[9];
Inicializacin
int[] coord = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; int[] coord = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
Acceso y Asignacin
coord[0] = 100;
Escalonados (Jagged)
Un array de arrays
int[][] matJ = new int[2][];
11
Clases
Herencia Modificadores de acceso
private internal protected protected internal public
Operadores
12
Clases. Herencia
Slo se admite herencia simple Se admite implementacin de mltiples interfaces
public class ClaseBase { } public interface IInterfaz { } public class ClaseDerivada : ClaseBase, IInterfaz { }
Para evitar que una clase se pueda extender se indica con: sealed Los mtodos, por defecto, no pueden redefinirse (son sealed). Para poder redefinir un mtodo
Definirlo como virtual En la redefinicin del mtodo indicar override
Clases. Constructores
Llamadas entre constructores: this
class SuperClass { private string argument1; public SuperClass() : this("<Default arg1>") { } public SuperClass(string arg1) { this.argument1 = arg1; Console.WriteLine("Arguments: " + argument1); } }
13
Clases. Constructores
Llamadas a la clase base: base
class ChildClass : SuperClass { private string argument2; public ChildClass() : this("<Default arg2>") { } public ChildClass(string arg2) { this.argument2 = arg2; Console.WriteLine("Arguments: " + argument2); } public ChildClass(string arg1, string arg2) : base(arg1) { this.argument2 = arg2; Console.WriteLine("Arguments: " + argument2); } }
Clases. Constructores
Ejemplo
static void Main() { SuperClass sc = new SuperClass(); /* Shows: * Arguments: <Default arg1> */ ChildClass cc = new ChildClass(); /* Shows: * Arguments: <Default arg1> * Arguments: <Default arg2> */ ChildClass cc2 = new ChildClass("1", "2"); /* Shows: * Arguments: 1 * Arguments: 2 */ Console.Read(); }
14
15
Clases. Destructores
Llamado automticamente por Garbage Collector
public class LogManager { ~LogManager() { logFile.WriteLine(System.Date.Now + "Instance Disposed"); logFile.Close();; } }
La clase System.Object
Todos los tipos heredan de System.Object
public virtual bool Equals(object o) public virtual int GetHashCode() public virtual string ToString() protected object MemberWiseClone() public System.Type GetType() protected virtual void Finalize() public static bool Equals(object o1, object o2) protected static bool ReferenceEquals(object o1, object o2)
16
protected:
Miembros accesibles desde la clase que los contiene o desde clases derivadas de sta
internal:
Miembros accesibles desde el mismo assembly
protected internal:
Miembros accesibles desde el mismo assembly o clases derivadas de la clase que lo contiene (protected + internal)
public:
No hay restricciones de acceso
Clases. Constantes
Constantes Se evalan en tiempo de compilacin Son implcitamente estticas (error si se usa static explcitamente)
Ejemplo
public class MyClass { public public public // The public ... } const string VERSION = "1.0.0"; const string URI = "http://" + "www.google.es"; const double PI = 3.14159265358979; expression being assigned to SIN must be constant const double SIN = Math.Sin(PI); //ERROR
17
public class MyClass { public static readonly double d1 = Math.Sin(Math.PI); public readonly string s1; public MyClass(string s) { s1 = s; } }
Clases. Propiedades
Propiedades
Encapsulacin con mtodos getXXX / setXXX
18
atributos privados
propiedades
public String EncryptedPassword { get { return encryptedPassword; } set { encryptedPassword = value; } } <<...>> }
19
Clases Abstractas
Una clase abstracta no puede ser instanciada Est pensada para ser usada como clase base Puede contener mtodos abstractos y no abstractos Similar a una interfaz No puede ser sealed
Clases Abstractas
public abstract class Product { public abstract String getReference(); }
public class Book : Product { public override String getReference() { return ISBN; } }
20
Clases Sealed
Es una clase que no se puede extender Las clases sealed no pueden ser abstractas Todas las estructuras son sealed Por qu "cerrar" una clase?
Para prevenir que sea extendida de forma no intencionada Optimizacin de cdigo
Las llamadas a mtodos virtual pueden resolverse en tiempo de compilacin
Clases. Mtodos
Redefinicin de mtodos: virtual & override
public class Product { public virtual String getReference() { return barCode; } } public class Book: Product { public override String getReference() { return ISBN; } }
21
Clases. Mtodos
Paso de parmetros
Tipos primitivos se pasan por valor
Para pasar por referencia: ref
public class Util { public void Swap(ref int x, ref int y) { int temp; temp = x; x = y; y = temp; } }
Clases. Mtodos
Paso de parmetros
Nmero variable de parmetros: params
public class Util { public static void printf(string fmt, params object[] args) {} } object[] args = {Texto, 100} Util.printf(%s %d, args);
22
Indexers
Un indexer permite a una instancia comportarse como un array virtual Permite sobrecarga (e.g. indexado por int y por string) Puede ser de slo lectura, slo escritura o lectura/escritura
public class ListBox : Control { private string[] items; public string this[int index] { get { return items[index]; } set { items[index] = value; Repaint(); } } } <<...>> ListBox listBox = new ListBox(); listBox[0] = "hello"; Console.WriteLine(listBox[0]);
Estructuras (struct)
Similares a las clases pero
Requisitos de almacenamiento menores Paso por valor, no referencia No pueden extender ningn tipo (heredan directamente de System.ValueType) Ningn tipo puede heredar de ellas
23
Estructuras (struct)
public struct Point { private int x, y; public Point(int x, int y) { this.x = x; this.y = y; } public int X { get { return x; } set { x = value; } } public int Y { get { return y; } set { y = value; } } } <<...>> Point p = new Point(2,5); p.X += 100; int px = p.X; // px = 102
sp
10 20
cp 10 20
CPoint
24
Funciones
mtodos, propiedades, indexers, operadores, constructores
Definiciones de tipos
clases, estructuras, enumeraciones, interfaces, delegados
Estructura
25
Enumeraciones
Estructuras con explicitacin de elementos
Evitan uso excesivo de constantes (nmeros mgicos) Facilitan legibilidad del cdigo
Enumeraciones: ejemplo
Declaracin
public enum MessageType : int { INFO = 1, WARNING = 2, ERROR = 3 }
Uso
MessageType messageType = MessageType.WARNING;
26
Enumeraciones
Dado que los valores de una enumeracin son enteros, ser posible tratarlos como operandos:
==, !=, <, >, <=, >=, +, -, ^, &, |, ~, ++, --
Ejemplo:
if (message > MessageType.INFO) { }
Interfaces
Similar a la definicin de un contrato
Pueden incluir mtodos, propiedades, indexers, eventos No pueden incluir operadores, constructores o destructores. Cualquier implementacin de la interfaz debe dar soporte a todas las partes del contrato Miembros de una interfaz son por defecto public y abstract
Proporcionan polimorfismo
Diferentes clases y estructuras pueden implementar la misma interfaz
No contienen implementacin
27
Interfaces
Declaracin
public interface IUserProfileDAO { // Interface methods void Create() { } void Delete() { }
Implementacin
public class UserProfileDAO : IUserProfileDAO { }
interface IControl { void Paint(); } interface IListBox: IControl { void SetItems(string[] items); } interface IComboBox: ITextBox, IListBox { }
28
Delegados
Tipo referencia
Delegados
/* Declare */ delegate double Del(double x);
29
Operadores
Aritmticos
+, -, *, /, % checked vs. unchecked
Asignacin
+=, -=, *=, /=, %=, ++, --
Comparacin
==, !=, <, >, <=, >=
Lgicos
&, &&, |, ||, ~, !, ^
Operadores. Sobrecarga
public class Complex { private float img; private float real; public Complex (float real, float img) { } public float Img { ..} override public string ToString() { if ( img >= 0 ) return real + "+" + img +"i"; else return real + " " + img + "i"; } public static Complex operator + (Complex a, Complex b) { return new Complex(a.real + b.real, a.img + b.img); } } <<...>> Complex a; Complex b; Complex c = a + b;
30
Salida
Console.Write(); Console.WriteLine();
Sintaxis: <object>.ToString(format)
31
Nmero
C D F P H Moneda Decimal Punto Fijo Porcentaje Hexadecimal
Fecha
S D t T F Short Date Long Date Short time Long Time Full Date
Sentencias
Condicionales
if switch
Control de Excepciones
try ...catch...finally throw
Iterativas
while do for foreach
Otras
checked, unchecked lock using
32
Sentencias condicionales. if
Sintaxis General
if (condition) <statementsIF> else <statementsELSE>
33
34
Ejemplo
String[] daysOfWeek = { "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday" };
// Muestra por pantalla los das de la semana foreach (string s in daysOfWeek) { Console.WriteLine(s); }
35
36
37
Sentencias. lock
Permite definir regiones crticas dentro de aplicaciones multithreading
Previene la corrupcin de datos
38
Sentencias. lock
public class CheckingAccount { decimal balance; public void Deposit(decimal amount) { lock (this) { balance += amount; } } public void Withdraw(decimal amount) { lock (this) { balance -= amount; } } }
Sentencias. using
C# incluye gestin automtica de memoria (Garbage Collector)
Elimina la mayora de problemas de gestin de memoria
39
Sentencias. using
Objetos que deben limpiarse una vez usados, deberan implementar la interfaz System.IDisposable
nico mtodo: Dispose()
Sentencia using permite crear una instancia, emplearla y asegurar que tras ello el mtodo Dispose() se llama
Similar a bloque finally en la gestin de excepciones
Sentencias. using
public class MyResource : IDisposable { public void MyResource() { // Acquire valuble resource } public void Dispose() { // Release valuble resource } public void DoSomething() { ... } } <<...>> using (MyResource r = new MyResource()) { r.DoSomething(); } // r.Dispose() is called
40
Colecciones
interface IEnumerable { IEnumerator GetEnumerator(); }
Colecciones: System.Collection
Clases
ArrayList Hashtable DictionaryBase SortedList Queue Stack
Interfaces
ICollection IComparer IDictionary IEnumerable IEnumerator IList
41
Colecciones: ArrayList
[Serializable] public class ArrayList : IList, ICollection, IEnumerable, ICloneable
Propiedades
Capacity Count Item[index] -- Indexer
Colecciones: ArrayList
Mtodos
Add(object) AddRange(Collection) Clear() Contains(object) IndexOf(object) Remove(object) RemoveAt(int) Sort() Reverse() GetEnumerator()
42
Colecciones: ArrayList
Ejemplo
ArrayList a = new ArrayList(); SampleFileManager.ReadSamples(a); IEnumerator enumerador = a.GetEnumerator();
Colecciones: Hashtable
Representa una coleccin de pares de clave y valor organizados en funcin del cdigo hash de la clave
[Serializable] public class Hashtable : IDictionary, ICollection, IEnumerable, ISerializable, IDeserializationCallback, ICloneable
Propiedades
Count IsFixedSize IsReadOnly Keys Values
43
Colecciones: Hashtable
Mtodos
Contains() ContainsKey(object) ContainsValue(object) GetHash(object) ...
Colecciones: Hashtable
Ejemplo
public class Languages { private static readonly Hashtable LANGUAGES; private static readonly ArrayList LANGUAGES_en = new ArrayList(); static Languages() { LANGUAGES_en.Add(new ListItem("English", "en")); LANGUAGES_en.Add(new ListItem("Spanish", "es")); LANGUAGES = new Hashtable(); LANGUAGES.Add("en", LANGUAGES_en); LANGUAGES.Add("es", LANGUAGES_es); } }
44
Generics
Caracterstica de Common Language Runtime, que permite que las clases, estructuras, interfaces y mtodos tengan parmetros de tipo genrico para los tipos de datos que almacenan y manipulan
Los tipos genricos son una forma de tipos parametrizados
Generics
Ejemplo sin utilizar Generics
public class List { private object[] elements; private int count; public void Add(object element) { if (count == elements.Length) Resize(count * 2); elements[count++] = element; } public object this[int index] { get { return elements[index]; } set { elements[index] = value; } } public int Count { get { return count; } } }
45
Generics
Uso de la lista implementada sin Generics
List intList = new List(); intList.Add(1); intList.Add(2); intList.Add("Three"); int i = (int)intList[0]; // Argument is boxed // Argument is boxed // Should be an error // Cast required
Generics
Implementacin de la clase Lista utilizando Generics
public class List<ItemType> { private ItemType[] elements; private int count; public void Add(ItemType element) { if (count == elements.Length) Resize(count * 2); elements[count++] = element; } public ItemType this[int index] { get { return elements[index]; } set { elements[index] = value; } } public int Count { get { return count; } } }
46
Generics
Uso de la lista implementada utilizando Generics
List<int> intList = new List<int>(); intList.Add(1); intList.Add(2); intList.Add("Three"); int i = intList[0]; // No boxing // No boxing // Compile-time error // No cast required
Generics
Por qu utilizar Generics?
Comprobacin de tipos en tiempo de compilacin Rendimiento (no boxing, no downcasts) Reduce la complejidad del cdigo
47
Generics
Los tipos genricos pueden aplicarse a
Clases, estructuras, interfaces, delegados
class Dictionary<KeyType, ValueType> {...} struct Pair<FirstType, SecondType> {...} interface IComparer<T> {...} delegate ResType Func<ArgType, ResType>(ArgType arg); << ... >> Dictionary<string, Customer> customerLookupTable; Dictionary<string, List<Order>> orderLookupTable; Dictionary<int, string> numberSpellings;
Generics
Los tipos genricos pueden aplicarse a
y mtodos
class Array { public static T[] Create<T>(int size) { return new T[size]; } public static void Sort<T>(T[] array) { ... } } << ... >> string[] names = Array.Create<string>(3); names[0] = "Jones"; names[1] = "Anderson"; names[2] = "Williams"; Array.Sort(names);
48
Generics
Restricciones
Una clase base, varias interfaces, new() Se indica con la clausula where
interface IComparable { int CompareTo(object obj); } class Dictionary<K, V> { public void Add(K key, V value) { << ... >> switch (((IComparable)key).CompareTo(x)) { << ... >> } } }
Generics
Restricciones
Una clase base, varias interfaces, new() Se indica con la clausula where
interface IComparable { int CompareTo(object obj); } class Dictionary<K, V> where K: IComparable { public void Add(K key, V value) { << ... >> switch (key.CompareTo(x)) { << ... >> } } }
49
Generics
Restricciones
Una clase base, varias interfaces, new() Se indica con la clausula where
interface IComparable<T> { int CompareTo(T obj); } class Dictionary<K, V> : IDictionary<K, V> where K: IComparable<K>, V: IKeyProvider<K>, V: IPersistable, V: new() { << ... >> }
Eventos
Gestin de eventos es un estilo de programacin dnde un objeto notifica a otro que algo de inters ha ocurrido
Es un modelo de programacin edicin-suscripcin
Los eventos permiten vincular un cdigo a la funcionalidad de un componente creado de forma independiente Los eventos son un tipo de mecanismo de callback
50
Eventos
Los eventos son idneos para las interfaces de usuario
El usuario hace algo (hace click en un botn, mueve el ratn, cambia un valor, etc.) y el programa reacciona en consecuencia
Eventos
C# tiene soporte nativo para eventos Est basado en delegados Un evento es en esencia un campo que contiene un delegado Sin embargo, un usuario de una clase nicamente puede registrar delegados
Slo puede ejecutar += y -= No pueden invocar al delegado del evento
51
52