Tema 0: Introducció - users.dsic.upv.esusers.dsic.upv.es/~jlinares/csharp/Curs_C_SHARP06.pdf ·...
Transcript of Tema 0: Introducció - users.dsic.upv.esusers.dsic.upv.es/~jlinares/csharp/Curs_C_SHARP06.pdf ·...
ProgramaciProgramacióó amb C# .NETamb C# .NETTema Tema 0:0: IntroducciIntroduccióó
ÍÍndexndex
Introducció
C#: Orígens i evolució
Objectius del mòdul
Continguts del curs
IntroducciIntroduccióóEl disseny i la programació d’aplicacions ha canviat molt des dels seus començaments.
Microsoft ens ofereix un nou entorn i una nova plataforma de programació:
.NET 2.0 Framework i Visual Studio 2005
Els programadors tenen ara al seu abast unes avançades eines per a construir la nova generació d’aplicacions d’escriptori i d’internet.
En este context, Microsoft presenta un llenguatge de programació nou: C#
C# és una eina més de treball però adaptada a les noves tecnologies i a les necessitats actuals del programadors.
Amb .NET s’obtenen aplicacions de major qualitat d’una forma senzilla i que requereixen menys temps de desenvolupament.
C#: OrC#: Oríígens i Evolucigens i EvolucióóFins ara C i C++ han sigut els llenguatges escollits pels programadors per a crear aplicacions que requereixen un nivell alt de control.
Malgrat la seua potència, C i C++ requereixen un gran esforç per part del programador si els comparem amb altres com Visual Basic.
Es necessitava d’un llenguatge senzill que permetera crear aplicacions d’una forma ràpida però que, a la volta, oferira al programador un gran control i s’integrara bé amb les noves tecnologies existents i futures.
Microsoft presenta C# a l’any 2000, fruit de l’esforç i treball de moltes persones, destaquen Anders Hejlsberg* i Scott Wiltamuth.
C# combina la potència i flexibilitat de C++ amb la simplicitat i les capacitats RAD de Visual Basic.
C# hereta el millor de C++, Java i Visual Basic, així és relativament fàcil adaptar-se a ell.
.NET està programat principalment amb C#.
C# es presenta com un llenguatge orientat a objectes i al treball amb components, modern, flexible, segur i productiu.
Objectius del mòdulObjectius del mòdulEste mòdul tractarà la programació d’aplicacions en l’entorn .NET
S’utilitzarà el nou llenguatge C# i Visual Studio 2005.
Al llarg del curs s’aprendàn, entre altres:
Les estructures del llenguatge,
L’entorn de treball Visual Studio i la plataforma .NET,
La programació orientada a objectes amb C#,
El treball amb bases de dades amb ADO.NET,
La creació d’aplicacions de consola i d’aplicacions Windows,
Creació d’aplicacions Web.
Continguts del cursContinguts del cursBloc 1: Introducció
INTRODUCCIÓPRIMER CONTACTE AMB L’ENTORN Visual Studio.NETLA PLATAFORMA MICROSOFT.NET
Bloc 2: El llenguatge C#EL LLENGUATGE DE PROGRAMACIÓ C# CREACIÓ D’APLICACIONS DE CONSOLAPROGRAMACIÓ OO EN C#
Bloc 3: Programaciód’Aplicacions Windows
INTRODUCCIÓ A WINDOWS FORMSCONTROLS D’US HABITUALDISSENY D’INTERFÍCIES D’USUARI
Bloc 4: Manipulació de Bases de Dades
ACCÉS A DADES AMB ADO.NETDISSENY D’INFORMES AMB CRYSTAL REPORTS.NET
Bloc 5: Creaciód’Aplicacions Web
INTRODUCCIÓ A ASP.NETWEB FORMSACCÉS A DADES AMB WEB FORMSCREACIÓ i ÚS D’UN SERVEI WEB
ProgramaciProgramacióó amb C# .NETamb C# .NET
Tema Tema 1:1: La plataforma .NET La plataforma .NET (.Net (.Net FrameworkFramework))
ÍÍndicendice
IntroducciónCaracterísticas de .NETComponentes .NETPlataforma .NETNovedades Framework 2.0EjemploEnlaces de interés
IntroducciIntroduccióónnMicrosoft.NET es el conjunto de nuevas tecnologías en las que Microsoft ha estado trabajando durante los últimos años.NET ofrece una plataforma sencilla y potente para distribuir el software en forma de servicios que puedan ser suministrados remotamente y que puedan comunicarse y combinarse unos con otros de manera totalmente independiente de la plataforma, lenguaje de programación y modelo de componentes con los que hayan sido desarrollados.
www.microsoft.com/net
www.microsoft.com/latam/net/
.NET es una nueva plataforma para el desarrollo y explotación de aplicaciones “gestionadas” (managed) modernas y orientadas a objetos.
Las aplicaciones .NET se pueden desarrollar en cualquier lenguaje de programación que se ajusta a .NET
.NET soporta una extensa colección de librerías de clases independientes del lenguaje de programación.
.NET soporta la creación de componentes.
.NET ofrece integración multi-lenguaje, reutilización de componentes, y herencia entre componentes desarrollados en diferentes lenguajes.
CaracterCaracteríísticas de .NETsticas de .NET
.NET ofrece un nueva manera de desarrollar aplicaciones de sobremesa usando las clases Windows Forms.NET ofrece una nueva manera de desarrollar aplicaciones basadas en navegador Web a través de ASP.NETLas clases ADO.NET proveen una arquitectura desconectada para acceso a datos a través de Internet.NET soporta la creación de Servicios Web XML independientes de la plataforma, a través de SOAP (Simple Object Access Protocol) y WSDL (Web ServicesDescription Language).NET ofrece una nueva arquitectura para el desarrollo y explotación de objetos remotos.NET convierte a varias tecnologías y técnicas Windows en obsoletas
Componentes de .NETComponentes de .NET
Microsoft.NET está compuesto de:Plataforma .NET.NET Framework SDKVisual Studio .NETServicios Web (Microsoft .NET myServices)Servidores para empresas (SQL Server.NET...)
Plataforma .NETPlataforma .NET
El concepto en el que se basa .NET no es nuevo.Java y su entorno de ejecución (JVM) ya utilizan el concepto de encapsulamiento del sistema operativo para permitir la interoperabilidad entre diferentes sistemas operativos.
Visual Studio.N
ETVisual S
tudio.NET
Base Class LibraryBase Class Library
Common Language Specification Common Language Specification -- CLSCLS
Common Language RuntimeCommon Language Runtime
ADO.NET, XML, Enterprise ServicesADO.NET, XML, Enterprise Services
VBVB C++C++ C#C#
ASP.NET: ASP.NET: ServiciosServicios WebWeby Web Formsy Web Forms
JScriptJScript ……
WindowsWindowsFormsForms
Vista general de la plataforma
Novedades Novedades FrameworkFramework 2.02.0Soporte para plataforma de 64-bitLa I/O ha sido mejorada para leer y escribir datos usando compresión GZIP
Nueva clase GZipStreamLa clase SerialPort permite acceso a puertos y comunicación con dispositivos serie.Soporte SMTP para envío y recepción de mensajes de e-mail
Clase SmtpClient tiene métodos para enviar mensajes (Send, SendAsync)Los Mensajes en sí se manejan como MailAddress, Message, MailAttachment
Soporte FTP añadido: System.Net.FtpMethodsPing está soportado:
System.Net.NetworkInformation.Ping
CommonCommon LanguageLanguage RuntimeRuntime (CLR)(CLR)
Un Runtime es un entorno en el que se ejecutan los programas.
El CLR se encarga de gestionar la ejecución de las aplicaciones .NET.
Al código escrito para ejecutarse en la plataforma .NET se le llama código gestionado.
Al código escrito para ejecutarse directamente se le llama código no gestionado o código nativo.
El CLR realiza la compilación Just in Time (JIT) que traduce el código gestionado en código nativo sobre la arquitectura de hardware que esté corriendo.
Modelo de Modelo de ejecuciejecucióónn
VBC# C++
Compilador Compilador Compilador Código no manejado
Códigomanejado
Códigofuente
Ejecutable (.EXE), Página Web (.ASPX), Servicio Local (.DLL), Servicio Web (.ASMX)
CommonCommon LanguageLanguage RuntimeRuntime
Compilador JITCompilador JIT
CCóódigodigo NativoNativo
ServiciosServicios del Sistema del Sistema OperativoOperativo
Características y servicios que ofrece:Ejecución multiplataformaIntegración de lenguajes Gestión de memoria (Recolector de basura)Tratamiento de excepcionesSoporte multi-hilo (multi-threading)Distribución transparenteInteroperabilidad con código antiguo
Clases de la plataforma .NET (FCL)Clases de la plataforma .NET (FCL)
La librería de clases (Framework ClassLibrary) es una librería formada por cientos de tipos que permiten acceder a los servicios ofrecidos por el CLR y a sus funcionalidades más frecuentemente usadas.
Además el programador puede crear nuevas clases que extiendan su funcionalidad y se integren perfectamente con el resto de las clases de la FCL.
Esta librería de clases está escrita en MSIL
Cualquier lenguaje cuyo compilador genere MSIL podrá usarla.
Con esta librería podemos crear todo tipo de aplicaciones: aplicaciones de consola, de ventanas, servicios Web, ASP.NET...
Dada la amplitud de la FCL, ha sido necesario organizar las clases en ella incluida en espacios de nombres(Namespace) que agrupen clases con funcionalidades similares.
El espacio de nombres System es el espacio raíz del que cuelgan todos los demás.
Espacios de nombres más usados:
System: Contiene tipos de datos muy usados, datos básicos, tablas, excepciones... Es el raíz.
System.Object: Soporta toda la jerarquía de las clases de .NET.
System.Collections:Colecciones de datos de uso común como pilas, colas, listas...
System.Data: Manipulación de bases de datos. Forma la denominada arquitectura ADO.NET.
System.IO: Manipulación de ficheros.
System.Reflection: Acceso a los metadatos que acompañan a los módulos de código.
System.Math: Funciones logarítmicas, trigonométricas...
System.XML: Acceso a datos en formato XML.
Sytem.Web: Aplicaciones Web.
ASP.NETASP.NET
ASP.NET es la versión para la plataforma .NET de la tecnología ASP (Active Server Pages).
Dentro de esta capa podemos distinguir tres partes muy diferenciadas:
Web FormsServer ControlsWeb Services
Windows Windows FormsFormsSon una forma avanzada e integrada de crear aplicaciones de escritorio Win32 estándar.
Descienden de las Windows FoundationClasses (WFC) de Microsoft.
Cualquier lenguaje de la plataforma .Net puede utilizar WinForms.
Forman parte de las clases de la plataforma .NET en el espacio de nombres:
System.Windows.Forms
.NET Framework SDK.NET Framework SDKMicrosoft distribuye este kit de desarrollo como parte del paquete .NET. Disponible en:
http://msdn.microsoft.com/netframework/technologyinfo/howtoget/default.aspx
Este kit contiene documentación sobre la plataforma, ejemplos y código fuente, y una serie de utilidades que sirven para desarrollo y prueba de aplicaciones .NET.
Visual Visual Studio.NETStudio.NETEs un entorno gráfico que permite a los desarrolladores crear, probar y depurar aplicaciones desarrolladas o no para la plataforma .NET.
Inicialmente se llamó Visual Studio 7.0 ya que es la evolución del Visual Studio 6.0.
La última versión es el Visual Studio 2005.
SharpDevelop es un IDE open source para .NET que representa una buena alternativa a Visual Studio.NET:
http://www.icsharpcode.net/opensource/sd/
Este entorno incorpora los siguientes lenguajes de programación:
Visual Basic.NET: Versión .NET de Visual Basic 6.0.Visual C++.net: Evolución de Visual C++.Visual J#.NET: Adaptación de Visual J++.Visual C#.NET: Un nuevo lenguaje de programación OO.
Empresas ajenas han creado compiladores de sus lenguajes para la plataforma .NET:
Eiffel, Perl, Python, Haskell, Pascal, Oberon...
.NET es independiente del lenguaje de programación, no estamos restringidos a desarrollar en Visual C++ y Basic:
Existen compiladores para C#, Visual Basic.NET, Jscript.NET, COBOL, Python, Perl, etc..NET soporta estos lenguajes no soportando realmente ninguno de ellos:. NET sólo entiende Microsoft Intermediate Language (MSIL)
Desarrollando para la plataforma Desarrollando para la plataforma .NET.NET
En .NET se traduce código fuente a IL (IntermediateLanguage) + Metadatos
IL es compilado antes de ser ejecutado y no estádiseñado para un lenguaje en particular como en JavaLas sentencias IL manipulan tipos comunes compartidos por todos los lenguajes .NET (Common Type System –CTS)El Common Language Runtime (CLR) es responsable de cargar y ejecutar una aplicación .NET
Usa compilación JIT (Just-In-Time) para traducir IL a código nativoIL es siempre compilado y nunca interpretado Cada método del código IL sólo es compilado una vez cuando es indicado.
Una plataforma independiente Una plataforma independiente del lenguajedel lenguaje
Hola Mundo en Hola Mundo en C#C# .NET.NET
// fichero: hola.cs
using System;
class Hola {
public static void Main() {
Console.WriteLine(“Hola Món”);
}
}
// fichero: hola.cs
using System;
class Hola {
public static void Main() {
Console.WriteLine(“Hola Món”);
}
}
Todo programa en C# contiene al menos una clase
Main es el punto de entrada del programa
Console.WriteLine(“...” ), visualiza un mensaje, invocando método WriteLine de la clase Console
El espacio de nombres Systempertenece a .NET FCL (Framework Class Library)
FCL contiene muchas clases útiles, que pueden usarse desde nuestras aplicaciones .NET
Enlaces de interEnlaces de interééss
GotDotNet: The Microsoft .NET Framework Community:http://www.gotdotnet.com/
.NET home page:http://www.microsoft.com/net/
MSDN .NET Framework site:http://msdn.microsoft.com/netframework/
Website con ejemplos y ayuda en programación C#:http://www.c-sharpcorner.com/http://www.csharphelp.com/http://www.csharp-station.com/http://www.codeproject.com
Implementación Open Source .NET (Proyecto mono):http://www.go-mono.com/
Fundamental: Class Library en la sección Reference de .NET Framework SDK Documentation
ProgramaciProgramacióó amb C# .NETamb C# .NET
Tema 2: El Tema 2: El Entorno de Visual Entorno de Visual Studio 2005Studio 2005
Introducción
El entorno de desarrollo de Visual Studio 2005 (IDE)
Barra de Menú y Barra de Herramientas
Ventanas de trabajo
Explorador de soluciones
El Cuadro de herramientas
Ventana de Propiedades
Ayuda de Visual Studio
Nuevas opciones
Programa simple: Mostrar un texto en un formulario
Recursos en la web
ÍÍndicendice
IntroducciIntroduccióónn a Visual Studio 2005a Visual Studio 2005
Entorno integrado de desarrollo (IDE)
Permite programar en los diferenteslenguajes .NET
Dispone de herramientas y utilidades paraeditar y manipular distintos tipos de ficheros.
Visual Studio 2005:Visual Studio 2005:““ProductividadProductividad PersonalizadaPersonalizada””
Novatos
Entusiastas
Estudiantes
Hobbyists
Profesionales
Consultores
Desarrolladores
Arquitectos
Testers
VB6 Devs
La página de Inicio
Barra de
herramientas
Proyectosrecientes
Ayuda
El IDE de Visual Studio 2005El IDE de Visual Studio 2005
Nuevo proyectoProyecto C# .NET
Conjunto de ficheros relacionados, imágenes y documentación, etc.
Solución C# .NET Conjunto de proyectos correspondientes a una o varias aplicaciones.
Aplicación WindowsCualquier aplicación que funciona en un SO Windows
Microsoft WordMicrosoft Internet Explorer…
Carpeta de los proyectos de Visual C#
Descripción del tipo de proyecto
Aplicación Windows seleccionada
El IDE después de un nuevo proyecto
Fichas
Barra de
Menú
Ficha
Activa
Formulario(aplicaciónwindows)
Exploradorde
SolucionesVentana de Propiedades
La La BarraBarra de de MenMenúú y la y la BarraBarra de de HerramientasHerramientasLa barra de menú
La barra de herramientasAbrir un fichero
Agregar nuevoelemento al proyecto
Guardar fichero
Guardar todo Propiedades
Caja de
Herramientas
Examinadorde Objetos
Explorador de
soluciones
Página de Inicio
Ventana de comandos
VentanasVentanas de de trabajotrabajoExplorador de soluciones
ActualizarMostrar todoslos archivos Ver código
Propiedades
Verdiseñador
Verdiagramade clase
El cuadro de herramientas
Ventana acoplada:
Ocultaciónautomàtica
La ventana de propiedades
Clasificación por
categorías
Ordenación
alfabética
Eventos
Componente seleccionado
Valor actualNombre de
La propiedad
Descripción de
La propiedad actual
AyudaAyuda de Visual Studio 2005de Visual Studio 2005
El IDE es más configurable.
Ayuda paraacoplar lasventanas(Docking)
Ayuda paraacoplar lasventanas(Docking)
NuevasNuevas opcionesopciones
IntelliSense: ayuda inteligente para la edición.
La Lista de Tareas i La Lista de Errores se presentan en dos ventanas diferentes.
Posibilidad de Editar y Continuar como en VB 6.
Publicación del proyecto (ClickOnce).
Y además:Diseñador de ClasesDiseñador de aplicacionesAsistente excepciones,…
El programa:Formulario que contendrá los controlesEtiqueta para mostrar el texto
Crear un nuevo proyecto:Tipo proyecto: Aplicación WindowsNombre: ProyectoSencillo
Poner un título al fomulario:La Propiedad Text determina el texto en la barra de títuloValor: Un programa sencillo
Guardar el proyectoEjecutar el proyecto:
Generar soluciónIniciar el programa
ProgramaPrograma simple: simple: MostrarMostrar un un textotexto en un en un formularioformulario
Aspecto del formulario resultante durante su ejecución
Recursos en la Recursos en la webweb
Visual Studio 2005 & .NET 2.0:http://lab.msdn.microsoft.com/vs2005/default.aspx
http://lab.msdn.microsoft.com/vs2005/downloads/
http://lab.msdn.microsoft.com/vs2005/resources/articles
ASP.NET 2.0:http://beta.asp.net
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnvs05/html/webdevinwhidbey.asp
WinForms 2.0:http://www.windowsforms.net/articles/windowsformsoverview.aspx?tabindex=5
ProgramaciProgramacióó amb C# .NETamb C# .NET
Tema Tema 3:3: El Lenguaje El Lenguaje C#C#
ÍÍndicendiceIntroducciónEstructura de los programasVariables y Tipos de Datos
Sistema común de tiposIdentificadoresVariables y ConstantesTipos definidos por el usuario: enumeraciones y estructurasArraysManipulación de cadenas
Operadores y expresionesControl del flujo
CondicionalesBuclesSaltos
Funciones y MétodosDepuración y Tratamiento de Errores
IntroducciIntroduccióónnC# es el último en una línea de evolución de los lenguajes derivados de C, que incluye C++ y Java.
Usado por Microsoft para desarrollar la mayoría del código de .NET.
Es el lenguaje ideal para el desarrollo en .NET
C# es orientado a objetos, moderno, simple y potente.
En C# todo es un objeto.
Características:Mejoras sobre C++ en las áreas de seguridad de datos, versionamiento, eventos y recolección de basura.
Acceso al SO, COM y APIs
Soporta el modo unsafe que permite el uso de punteros como en C.
Generación de documentación XML automàtica.
Creación de páginas ASP.NET y servicios Web.
En resumen: más simple que C++ pero poderoso y flexible como él.
Estructura de los Estructura de los programasprogramasUn programa en C# contiene:
Uno o más ficheros que contienen:Uno o más espacios de nombres (namespace) que contienen:
Tipos de datos: clases, estructuras, interfaces, enumeraciones y delegados
Si no se declara un namespace se asume el global por defecto
Un ejecutable ha de contener obligatoriamente una función Main(punto de entrada al programa)
static void Main()static int Main()static void Main(string[] args)static int Main(string[] args)
Para acceder a un tipo podemos usar un camino absoluto: System.Console.WriteLine(...);
o relativo:using System;...; Console.WriteLine(...);
EjemploEjemplo::namespace N1 {
class C1 {
// ...
}
struct S1 {
// ...
}
interface I1 {
// ...
}
delegate int D1();
enum E1 {
// ...
}
}
Comentar el código:
Comentarios de una línea:
// este comentari ocupa una línia
///<summary>
/// este és un comentari especial de documentació XML
/// </summary>
Comentarios de varias líneas:
/* este comentari ocupa
dues línies */
Definir bloques de código:#region Definició de Variables
int x, y;
string s = "Hola";
float f;
#endregion
Sistema común de tipos (CTS)Lo comparten todos los lenguajes de .NET
Admite tanto tipos de valor como tipos de referencia:
Todos los tipos de datos derivan de System.Objectsistema de tipos unificado. Cualquier tipo puede ser tratado como un objeto.
Variables y Variables y TiposTipos de de DatosDatos
Tipos de referenciaTipos de referencia
Tipos de datosTipos de datos
Tipos de valorTipos de valor- Intrínsecos,- Enumeraciones,- Estructuras
- Arrays- Clases- Interfaces- Punteros
objectCualquier objetoVariableCualquier objetoObject
stringEl permitido por la memoriaVariableCadenas de caracteresString
char[‘\u0000’, ‘\uFFFF’]16Caracteres UnicodeChar
booltrue, false32Valores lógicosBoolean
decimal[1,0×10-28 - 7,9×1028]128Reales de 28-29 dígitos de precisiónDecimal
double[5,0×10-324 - 1,7×10308]64Reales de 15-16 dígitos de precisiónDouble
float[1,5×10-45 - 3,4×1038]32Reales con 7 dígitos de precisiónSingle
ulong[0-18.446.744.073.709.551.615]64Enteros largos sin signoUInt64
long[-9.223.372.036.854.775.808,
9.223.372.036.854.775.807]64Enteros largos
Int64
uint[0, 4.294.967.295]32Enteros normales sin signoUInt32
int[-2.147.483.648, 2.147.483.647]32Enteros normalesInt32
ushort[0, 65.535]16Enteros cortos sin signoUInt16
short [-32.768, 32.767]16Enteros cortos con signoInt16
byte [ 0 , 255]8Bytes sin signoByte
sbyte[-128, 127]8Bytes con signoSByte
AliasRango de valoresBitsDescripciónTipo
TiposTipos de de datosdatos bbáásicossicos
IdentificadoresDan nombre a variables, constantes y métodos.Constan de caracteres alfanuméricos y _C# es Sensible a mayúsculas y minúsculas.Han de comenzar con letra o _No pueden ser una palabra reservada…
...si no se usa el carácter ‘@’ como prefijo :
Object @this; //@ previene el conflicto con "this"
Variables
Una variable representa la localización en memoria donde una instancia de un tipo es guardada.
Declaración:
<tipodedato> <identificador>;
Recordar la distinción entre tipos de valor y tipos de referencia
Tipos de valor son tipos simples como ‘int’, ‘long’ y ‘char’Los objetos, strings y arrays son ejemplos de tipos de referencia
Los tipos de valor se derivan de System.ValueType
Comparación entre variables de tipo valor y variables tipo referencia:
Variables de tipo valor:
Contienen sus datosdirectamente
Cada una tiene supropia copia de datos
Las operacionessobre una no afectan a otra
Variables de tipo valor:
Contienen sus datosdirectamente
Cada una tiene supropia copia de datos
Las operacionessobre una no afectan a otra
Variables de tipo referencia:
Almacenan referencias a sus datos (conocidos como objetos)
Dos variables de referencia puedenapuntar al mismo objeto
Las operaciones sobreuna pueden afectar a otra
Variables de tipo referencia:
Almacenan referencias a sus datos (conocidos como objetos)
Dos variables de referencia puedenapuntar al mismo objeto
Las operaciones sobreuna pueden afectar a otra
Inicialización de variables en la declaración:
bool bln = true;
byte byt1 = 22;
char ch1=‘x’, ch2=‘\u0061’; // Unicode para ‘a’
decimal dec1 = 1.23M;
double dbl1=1.23, dbl2=1.23D;
short sh = 22;
int i = 22;
long lng1=22, lng2=22L; // ‘L’ long
sbyte sb=22;
float f=1.23F;
ushort us1=22;
uint ui1=22, ui2=22U; // ‘U’ unsigned
ulong ul1=22, ul2=22U, ul3=22L, ul4=2UL;
Los valores de referencia son creados con la palabra reservada new:object o = new System.Object();
Una variable String se puede inicializar directamente:string s = "Hola"; // usan caracteres Unicode de 2 cars
C# soporta secuencias de escape como en C:string s1 = "Hola\n"; // salto de línea
string s2 = "Hola\tque\ttal"; // tabulador
Como las sentencias de escape comienzan con ‘\’, para escribir este carácter hay que doblarlo, o usar ‘@’:string s3 = "c:\\WINNT";
string s4 = @"C:\WINNT";
using System;namespace ConsoleAppVisibilitat{
class Simple{
public int Var1=10;private int Var2=20; //localpublic int Var3=30;
}class Class1 {
[STAThread]static void Main(string[] args){
Simple s = new Simple();
Console.WriteLine("Simple:");Console.WriteLine("Var1={0},
Var3={1}",s.Var1, s.Var3);
Console.ReadLine();}
}}
Ámbito: lugar dondese declara una variable. Determina su accesibilidad.
La visibilidad de una variable fuera de suámbito se puede modificar anteponiendo public o private en su declaración.
Ámbito: lugar dondese declara una variable. Determina su accesibilidad.
La visibilidad de una variable fuera de suámbito se puede modificar anteponiendo public o private en su declaración.
Àmbito y Visibilidad:
using System;namespace ConsoleAppVisibilitatSTAT {
class Simple {public static int Var3=30; //pública i
estàticastatic int Var4=40; //privada i estàticapublic void mostraVar4(){
Console.WriteLine("Var4={0}", ++Var4);}
}class Class1 {
[STAThread]static void Main(string[] args) {
Simple s = new Simple();Simple k = new Simple();
Console.WriteLine("Simple:");Console.WriteLine("Var3={0}",Simple.Var3++);Console.WriteLine("Var3={0}",Simple.Var3);s.mostraVar4();k.mostraVar4();Console.ReadLine();
}}
}
static: Variableestática, existe durante toda la ejecución del programa.
Sólo existe una sola copia de la misma sin necesidad de crear objeto alguno.
Hay que referirse a ella usando el nombre completo del tipo al que pertenece.
No afecta a su visibilidad
static: Variableestática, existe durante toda la ejecución del programa.
Sólo existe una sola copia de la misma sin necesidad de crear objeto alguno.
Hay que referirse a ella usando el nombre completo del tipo al que pertenece.
No afecta a su visibilidad
ConstantesEl modificador const permite definir variables constantes:
Class Class1 {private const int min = 1;private const int max = 100;public const int rango = max – min;…
static void Main(){
Console.WriteLine(Class1.max,Class1.min,Class1.rango);
// o también Console.WriteLine(max, min, rango);
}}
Una constante no cambia nunca su valor.
Son implícitamente static.
Conversión entre tipos de datos
int intValor = 123;
long longValor = intValor; // implícita de int a longintvalor = (int) longValor; // explícita de long a int con castint x = 123456;
long y = x; // implícitashort z = (short)x; // explícitadouble d = 1.2345678901234;
float f = (float)d; // explícitalong l = (long)d; // explícita//uso de Convert:int c=154;
MessageBox.Show(Convert.ToString(c));
Conversión implícitaOcurre de forma automática.Siempre tiene éxito.Nunca se pierde información
en la conversión.
Conversión implícitaOcurre de forma automática.Siempre tiene éxito.Nunca se pierde información
en la conversión.
Conversión explícitaRequiere la realización del cast o
el comando Convert.Toxxx(var)Puede no tener éxito.Puede perderse información en la
conversión.
Conversión explícitaRequiere la realización del cast o
el comando Convert.Toxxx(var)Puede no tener éxito.Puede perderse información en la
conversión.
TablaTabla de de conversiconversióónn implimplíícita seguracita segura
ushort, int, uint, long, ulong, float, double, decimal Char
doubleFloat
float, double, decimal Ulong
float, double, decimal Long
long, ulong, float, double, decimal Uint
long, float, double, decimal Int
int, uint, long, ulong, float, double, decimal Ushort
int, long, float, double, decimal Short
short, int, long, float, double, decimal Sbyte
short, ushort, int, uint, long, ulong, float, double, decimal Byte
Se convierte de forma segura a:Tipo
Tipos definidos por el usuario: Enumeraciones
Tienen por tipo base números enteros.Por defecto empieza la numeración por 0Definición de una enumeración:enum Color { Rojo=1, Verde=2, Azul=3 }
Uso de una enumeración:Color colorPaleta = Color.Rojo;
o colorPaleta = (Color)1; // Tipo int a tipo Color
Visualización de una variable de enumeración:Console.WriteLine(“{0}”, colorPaleta.ToString());
// Muestra Rojo
Usando enumeraciones el código queda más claro i fácil de mantener.
Tipos definidos por el usuario: Estructuras
Definición:struct Empleado {
public string nombre;public int edad;public int Sueldo = 1200;// error!, no permitido
}
Uso:Empleado empresaEmpleado, otroEmpleado; empresaEmpleado.Nombre = "Juan";empresaEmpleado.edad = 23;otroEmpleado = empresaEmpleado; //asignación directa
El operador new crea una variable tipo Empleado con los valoresasociados:
Empleado jefeDep = new Empleado(“Pepe”, 45);
Todos los miembros se inician por defecto a null
El método booleano Equals() permite comparar dos structs.otroEmpleado.Equals(empresaEmpleado)
Una estructura puede contar también con métodos.
Arrays
Los arrays son tipos referencia derivados de System.Array
Sus índices comienzan en 0
Ejemplo: string[] a; // array de cadenas
El tipo de datos array viene dado por string[]
el nombre del array es una referencia al array
Para crear espacio para los elementos usar:string[] a = new string[100];
Los arrays se pueden inicializar directamente:string[] animales = {"gato", "perro", "caballo"};
int[] a2 = {1, 2, 3};
Arrays multidimensionales:string[,] ar = {{"perro","conejo"}, {"gato","caballo"}};double[,] tempAnual = new double[12,31];
El rango de los elementos del array es dinámico:Si se crea un nuevo array sobre el mismo se libera la memoriaque ocupaba y se pierde toda la información que contenia.
Información sobre un array:
Dimensiones: Rank
Número de elementos: GetLength()
Índice superior e inferior: GetLowerBound(d); GetUpperBound(d)
(d=dimensión, desde 0 hasta Rank-1)
Saber si es un array: if (a is Array) ....
Recorrido de los elementos de un array sin conocer susíndices
foreach (string a in animales) Console.WriteLine(a);
Otras operaciones: Copy(); Sort(); ...
Manipulación de cadenasLos tipos char y string permiten manipular caracteres.
Una variable char puede contener cualquier carácter Unicode
Manipulacion de caracteres: IsDigit(); IsLetter(); IsPunctuation(); ToUpper(); ToLower(), ToString();...
Una variable tipo string es una referencia al lugar donde se guarda la cadena.
Cada vez que se modifica el valor de la cadena se asigna un nuevo bloque de memoria y se libera el anterior.
Concatenación: Nuevo operador + (no existe en C ,C++) o se puede usar también: Concat()string a, b;
a="Programación ";
b="con C#";
Console.WriteLine(“Usando +: {0}", a+b);
Console.WriteLine(" Usando concat: {0}", string.Concat(a, b));
Operadores y Operadores y expresionesexpresiones
Operadores aritméticos:+ Suma unaria: +a- Resta unaria: -a++ Incremento ++a o a++
-- Decremento: --a o a--+ Suma a+b- Resta: a-b* Multiplicación: a*b/ División: a/b% Resto: a%b
Operadores relacionales:== Igualdad: a==b!= Desigualdad: a!=b< Menor que: a<b<= Menor o igual: a<=b> Mayor que: a>b>= Mayor que o Igual a: a>=b! Negación: !a& And binario: a&b| Or binario: a|b^ Or exclusivo: a^b~ Negación binaria: ~a&& And lógico: a&&b|| Or lógico: a||b
Operadores de manipulación de bits:
int i1=32;
int i2=i1<<2; // i2==128
int i3=i1>>3; // i3==4
Otros operadoresmin=a<b ? a:b; // equivale a: if a<b min=a else min=b;
. accede a miembros, e.j. args.Length
() cast (conversión de tipos)
[] índice de arrays, punteros, propiedades y atributos
new crea nuevos objetos
typeof obtiene el tipo de un objeto
is compara el tipo de un objeto en runtime
sizeof obtiene el tamaño de un tipo en bytes
* obtiene la variable a la que apunta un puntero
-> p->m es lo mismo que (*).m
& devuelve dirección de un operando
Las expresiones en C# son similares a C y C++
Precedencia:
Asociatividad:Todos los operadores binarios, salvo los de asignación, son asociativos por la izquierda.
Los operadores de asignación y el operador condicional(?) son asociativos por la derecha.
+ Operadores Asociatividad Tipo () Izquierda a derecha Paréntesis * / % Izquierda a derecha Multiplicativos + - Izquierda a derecha Adición < <= > >= Izquierda a derecha Relacionales
== != Izquierda a derecha Igualdad
- = Derecha a izquierda Asignación
Control del Control del flujoflujo
Un bloque y su bloque padre o pueden tener una variable con el mismo nombre
{int i;...{
int i;...
}}
Bloques hermanos pueden tenervariables con el mismo nombre
{int i;...
}...
{int i;...
}
InstruccionesPueden ocupar más de una línea y deben terminarse con un ;int i, j;i=1;
Grupos de instrucciones se pueden agrupar en bloques con { y }
{j=2;i=i+j;
}
Condicionales
if (<condición>) <sentenciasCondTrue>
if (<condición>){
<sentenciasCondTrue>[else{
<sentenciasCondFalse>} ]
Ejemplo:
if (a>b) Mayor=a;
if (a>b){
Mayor=a;Menor=b;
}else{
Mayor=b;Menor=a;
}
Ejemplo: if en cascada
enum Palo { Treboles, Corazones, Diamantes, Picas}Palo cartas = Palo.Corazones; string color;
if (cartas == Palo.Treboles)color = “Negro”;
else if (cartas == Palo.Corazones)color = “Rojo";
else if (palo == Palo.Diamantes)color = "Rojo";
elsecolor = “Negro";
enum Palo { Treboles, Corazones, Diamantes, Picas}Palo cartas = Palo.Corazones; string color;
if (cartas == Palo.Treboles)color = “Negro”;
else if (cartas == Palo.Corazones)color = “Rojo";
else if (palo == Palo.Diamantes)color = "Rojo";
elsecolor = “Negro";
Condicionales múltiples
switch (<expressión>){
case Opc1 :[<sentencias-1>]break;
[case Opc2 :[<sentencias-2>]break;…
default:<sentencias-def>break;]
}
Ejemplo:
switch(B){
case 5:Console.WriteLine(“B es óptimo);A=10;break;
case 1:case 2:case 3: //1,2,3 sin break pq están vacíoscase 4:
Console.WriteLine(“B está pordebajo del valor óptimo);A=3;break;
default:Console.WriteLine(“B no es válido);break;
}
Ejemplo:
switch(B){
case 5:Console.WriteLine(“B es óptimo);A=10;break;
case 1:case 2:case 3: //1,2,3 sin break pq están vacíoscase 4:
Console.WriteLine(“B está pordebajo del valor óptimo);A=3;break;
default:Console.WriteLine(“B no es válido);break;
}
Bucles
for
for (int i=0; i < 5; i++) { // i declarada dentro del bucleConsole.WriteLine(i);
}
for (;;) {... // bucle infinito
}
for (int i=1, j=2; i<=5; i++, j+=2) { //múltiples expresionesSystem.Console.WriteLine("i=" + i + ", j=" + j);
}
whileEjecuta instrucciones en función de un valor booleano.Evalúa la expresión booleana al principio del bucle.
while (true) {...
}
while (true) {...
}
int i = 0;while (i < 10) {
Console.WriteLine(i);i++;
}
int i = 0;while (i < 10) {
Console.WriteLine(i);i++;
} 0 1 2 3 4 5 6 7 8 90 1 2 3 4 5 6 7 8 9
int i = 10;while (i > 5) {
...i--;
}
int i = 10;while (i > 5) {
...i--;
}
do ... whileEjecuta instrucciones en función de un valorbooleano.Evalúa la expresión booleana al final del bucle.
int i = 0;
do {
Console.WriteLine(i);
i++;
} while (i <= 10);
int i = 0;
do {
Console.WriteLine(i);
i++;
} while (i <= 10);0 1 2 3 4 5 6 7 8 9 100 1 2 3 4 5 6 7 8 9 10
int i = 10;do {
...i--;
}while (i > 5);
int i = 10;do {
...i--;
}while (i > 5);
do {...
} while (true);
do {...
} while (true);
foreachEste bucle es nuevo en C#.Itera sobre una colección de elementosNo permite cambiar el valor de los ítems
public static void Main(string[] args) {
foreach (string s in args) Console.WriteLine(s);
}
public static void Main(string[] args) {
foreach (string s in args) Console.WriteLine(s);
}
Instrucciones de salto
continue: Salta el resto de la iteración y comienza la siguiente:
for (int i=1; i<=5; i++) {if (i==3)
continue;Console.WriteLine(i);
}
break : Sale directamente de un bucle sin acabarlo:for (int i=1; i<=5; i++) {
if (i==3)break;
Console.WriteLine(i);}
return [<expresión>]: Sale del método actual
En C# todo son funciones, no existen procedimientos.
Todas las funciones siempre pertenecen a una clase, luego son todas las funciones son métodos.
Los métodos, por defecto, son privados (private)
Main es un método y para definir métodos propios se usa la misma sintaxis:
using System;class EjemploClase{
static void EjemploMetodo( ) {
Console.WriteLine("Este es un ejemplo de método");}static void Main( ) {
// ...}
}
Funciones y MFunciones y Méétodostodos
Una vez definido un método, se puede:
Llamar a un método desde dentro de la misma clase
Se usa el nombre del método seguido de una lista de parámetros entre paréntesis
Llamar a un método que está en una clase diferente
Hay que indicar al compilador cuál es la clase que contiene el método que se desea llamar
El método llamado se debe declarar como public
Usar llamadas anidadas
Unos métodos pueden hacer llamadas a otros, que a su vez pueden llamar a otros métodos, y así sucesivamente.
Variables localesSe definen dentro del método
Son privadas para el método
Se destruyen a la salida del método
Variables compartidasSe definen en la clase
Permiten compartir datos entre métodos
Conflictos de ámbitoEl compilador no avisa si hay conflictos entre nombres de las variables locales y las de clase.
Devolución de valoresEl método se debe declarar con un tipo que no sea void
Se añade una instrucción return con una expresiónFija el valor de retornoSe devuelve al llamador
Los métodos que no son void deben devolver siempre un valor
static int DosMasDos( ) {int a,b;a = 2;b = 2;return a + b;
}
static int DosMasDos( ) {int a,b;a = 2;b = 2;return a + b;
} int x;x = DosMasDos( );Console.WriteLine(x);
int x;x = DosMasDos( );Console.WriteLine(x);
ParámetrosEn C# todos los parámetros se pasan por valor si no se indica lo contrario.Declaración de parámetros
Se ponen entre paréntesis después del nombre del métodoSe define el tipo y el nombre de cada parámetro
Llamadas a métodos con parámetrosUn valor para cada parámetro
Paso de parámetros: por valor, por referencia, de salida y lista de parámetros de longitud variable.
static void MetodoConParametros(int n, string y) { ... }
MetodoConParametros(2, "Hola, mundo");
static void MetodoConParametros(int n, string y) { ... }
MetodoConParametros(2, "Hola, mundo");
Paso por valorSe copia el valor del parámetroSe puede cambiar el nombre de la variable dentro del métodoNo afecta al valor fuera del métodoEl parámetro debe ser de un tipo igual o compatible
static void SumaUno(int x) {
x++; // Incrementar x}static void Main( ) {
int k = 6;SumaUno(k);Console.WriteLine(k); // Muestra el valor 6, no 7
}
static void SumaUno(int x) {
x++; // Incrementar x}static void Main( ) {
int k = 6;SumaUno(k);Console.WriteLine(k); // Muestra el valor 6, no 7
}
Paso por referenciaSe pasa una referencia a una posición de memoria.Se usa la palabra clave ref en la declaración y las llamadas al método.Los tipos y valores de variables deben coincidir.Los cambios hechos en el método afectan al llamador.Hay que asignar un valor al parámetro antes de la llamada al método.
static int RaizCuarta(ref int x) {
x = (int)Math.Sqrt(x); return (int)Math.Sqrt(x);
}static void Main( ) {
int num = 625; //siempre inicializar antes de utilizarla!!Console.WriteLine(“Raiz cuarta: {0}, el númerooriginal es: {1}”, RaizCuarta(ref num), num);
}
static int RaizCuarta(ref int x) {
x = (int)Math.Sqrt(x); return (int)Math.Sqrt(x);
}static void Main( ) {
int num = 625; //siempre inicializar antes de utilizarla!!Console.WriteLine(“Raiz cuarta: {0}, el númerooriginal es: {1}”, RaizCuarta(ref num), num);
}
Parámetros de salidaNo sirven para pasar valores al método.Sólo devuelven resultados desde el método.Se usa la palabra clave out en la declaración y las llamadas al método.La variable no necesita estar inicializada.Al parámetro de salida hay que asignarle siempre un valor.
static void OutDemo(out int p) {
p = 255;// ...
}static void Main( ) {
int n; // sin inicializarOutDemo(out n);
}
static void OutDemo(out int p) {
p = 255;// ...
}static void Main( ) {
int n; // sin inicializarOutDemo(out n);
}
Lista de parámetros de longitud variableSe usa la palabra reservada params.Se declara como un array al final de la lista de parámetros.Siempre se pasan por valor.
Guía para el paso de parámetros:El paso por valor es el más habitual y suele ser el más eficaz.El valor de retorno del método es útil para un solo valor.ref y/o out son útiles para más de un valor de retorno.ref sólo se usa si los datos se pasan en ambos sentidos.
static long SumaLista(params long[ ] v) {long total, i;for (i = 0, total = 0; i < v.Length; i++)
total += v[i];return total;
}static void Main( ) {
long x = SumaLista(63,21,84);}
static long SumaLista(params long[ ] v) {long total, i;for (i = 0, total = 0; i < v.Length; i++)
total += v[i];return total;
}static void Main( ) {
long x = SumaLista(63,21,84);}
Devolución de arrays desde métodos:
class EjemploArr1 {
static void Main( ) {int[ ] array = CreateArray(42);...
}static int[ ] CreateArray(int tamano) {
int[ ] creada = new int[tamano];return creada;
}}
class EjemploArr1 {
static void Main( ) {int[ ] array = CreateArray(42);...
}static int[ ] CreateArray(int tamano) {
int[ ] creada = new int[tamano];return creada;
}}
Paso de arrays como parámetrosUn parámetro de array es una copia de la variable array.No es una copia de los elementos del array.Se modifican los valores originales del array.
class EjemploArr2 {static void Main( ) {
int[ ] arg = {10, 9, 8, 7};Method(arg);System.Console.WriteLine(arg[0]);
}
static void Metodo(int[ ] parametro) {parametro[0]++;
}}
class EjemploArr2 {static void Main( ) {
int[ ] arg = {10, 9, 8, 7};Method(arg);System.Console.WriteLine(arg[0]);
}
static void Metodo(int[ ] parametro) {parametro[0]++;
}} Este método modificará
el array originalcreado en Main
Este método modificaráel array originalcreado en Main
Métodos recursivosHacen llamadas a sí mismosÚtil para resolver ciertos problemas
static ulong Fibonacci(ulong n){
if (n <= 2)return 1;
elsereturn Fibonacci(n-1) + Fibonacci(n-2);
}
static ulong Fibonacci(ulong n){
if (n <= 2)return 1;
elsereturn Fibonacci(n-1) + Fibonacci(n-2);
}
Métodos sobrecargados (overloading)Comparten un nombre dentro de la clase.Se distinguen por el número y tipo de parámetros.Usarlos cuando:
hay métodos similares que requieren parámetros diferentessi se quiere añadir funcionalidad al código existente.
No abusar de ellos pues son difíciles de mantener y de depurar.
class OverloadingExample{
static int Suma(int a, int b) {
return a + b;}static int Suma(int a, int b, int c) {
return a + b + c;}static void Main( ) {
Console.WriteLine(Suma(1,2) + Suma(1,2,3));}
}
class OverloadingExample{
static int Suma(int a, int b) {
return a + b;}static int Suma(int a, int b, int c) {
return a + b + c;}static void Main( ) {
Console.WriteLine(Suma(1,2) + Suma(1,2,3));}
}
Los errores (sintàcticos y semánticos) pueden aparecer en el código de forma inesperada.
Visual Studio ofrece potentes y eficaces herramientas para la depuración de los errores.
El depurador de Visual Studio proporciona un menúDepurar que ofrece acceso a las herramientas del depurador.
Además, el lenguaje C# incorpora técnicas para controlar las posibles situaciones de error en tiempo de ejecución.
DepuraciDepuracióón y Tratamiento de Erroresn y Tratamiento de Errores
Cuando una aplicación se ejecuta en modo de depuración VS es capaz de conocer qué ocurre exactamente en cada línea de código.
Esa información de depuración está contenida en los ficheros .pdb
En modo depuración podremos:Consultar y modificar el valor de las variables,Detener un momento la ejecución Editar el código y continuar la ejecución,Parar la ejecución en un lugar concreto,Ejecutar el programa línea a línea,Realizar llamadas de prueba a métodos en la ventana Inmediato sin ejecutar la aplicación,Etc.
ExcepcionesLas excepciones son el mecanismo OO de C#para controlar las situaciones de error.
¿por qué usar excepciones?
El tratamiento tradicional de errores resulta muy complicado de gestionar:
int errorCodigo = 0;FileInfo source = new FileInfo("code.cs");if (errorCodigo == -1) goto Fallo;int longitud = (int)source.Length;if (errorCodigo == -2) goto Fallo;char[] contenido = new char[longitud];if (errorCodigo == -3) goto Fallo;// No hay problemas ...Fallo: ...
int errorCodigo = 0;FileInfo source = new FileInfo("code.cs");if (errorCodigo == -1) goto Fallo;int longitud = (int)source.Length;if (errorCodigo == -2) goto Fallo;char[] contenido = new char[longitud];if (errorCodigo == -3) goto Fallo;// No hay problemas ...Fallo: ...
Lógica del programaLógica del programa
Trat. De erroresTrat. De errores
Todas las excepciones derivan de System.Exception
Excepciones de .NET Base Class Library
Tratamiento de excepciones orientado a objetos :try
{... // bloque normal de código
} catch {
... // bloque que controla la excepción}[ finally {
... // bloque de finalización que siempre se ejecuta}]
Ejemplo:
try {Console.WriteLine("Escriba un número");int i = int.Parse(Console.ReadLine());
}catch (OverflowException capturada){Console.WriteLine(capturada);
}
Cuando ocurre un error se crea una excepción que contiene información para solucionar el problema.
Cada bloque catch captura una clase de excepción.
Un bloque try puede tener un bloque catch general que capture excepciones no tratadas (uno solo y el último de los bloques catch)
Un bloque try no puede capturar una excepción derivada de una clase capturada en un bloque catch anterior.
…try {Console.WriteLine(“Escriba el primer número");int i = int.Parse(Console.ReadLine());Console.WriteLine("Escriba el segundo número");int j = int.Parse(Console.ReadLine());int k = i / j;
}catch (OverflowException capturada) { Console.WriteLine(capturada); }
catch (DivideByZeroException capturada) {Console.WriteLine(capturada); }
catch {…} // también: catch (Exception x) { … }...
ProgramaciProgramacióónn con C# con C# NETNET
Tema 4: Introducción a la POO
Introducción
Programación Procedural vs Programación Orientada a Objetos
¿Qué es un objeto?
¿Qué es una clase?
Modelado de clases con UML
Encapsulación
Herencia
Polimorfismo
Referencias entre clases
Reutilización de clases
Resumen
ContenidosContenidos
¿Por qué la Programación Orientación a Objetos (POO)?¿Por qué la Programación Orientación a Objetos (POO)?
• Existe la esperanza de que esta técnica sea la clave para incrementar la productividad y mejorar la fiabilidad de los sistemas software ( solución a la crisis del software )
• Existe la esperanza de que la transición de los lenguajes existentes a los orientados a objetos sea fácil
• La forma de percibir y pensar sobre los problemas se acerca a los mecanismos cognitivos humanos y es muyparecida a la forma en que se abordan en otros dominios
IntroducciIntroduccióónn
Un poco de historia …Un poco de historia …
• La POO apareció por primera vez en 1960• SIMULA I (1962-65), SIMULA 67 (1967)• ADA, PROLOG (1980)
• Se ha hecho muy popular en los últimos 10 años
• En ocasiones, la tecnología avanza lentamente• Sistemas legados que funcionan bien (o no)• Intereses comerciales• Necesidades reales
IntroducciIntroduccióónn
Java y C# han ayudado mucho
Evolución de los lenguajes de programaciónEvolución de los lenguajes de programación
• Lenguajes máquinaLenguaje nativo de la máquina: muy eficiente
x Codificación de programas complejax Gran cantidad de errores en la codificaciónx Depuración muy complejax Productividad mínima
• Lenguajes de bajo nivel (ensambladores)Etiquetas inteligibles (nemónicos) por el ser humano
x Estrechamente ligados a la arquitectura de la máquinax Depuración complejax Productividad muy baja? Necesidad de un traductor (ensamblador): menos eficiente
IntroducciIntroduccióónn
Evolución de los lenguajes de programaciónEvolución de los lenguajes de programación
• Lenguajes de alto nivel (BASIC, etc)Una instrucción equivale a varias instrucciones en ensambladorLenguaje más afín al programadorDepuración más sencillaProductividad aceptablePORTABILIDAD
? Necesidad de un traductor: intérprete o compiladorx Saltos en el código (GOTO) dificultan la legibilidad y depuraciónx Las estructuras de datos tienen visibilidad globalx En proyectos complejos el mantenimiento es complejo
IntroducciIntroduccióónn
Evolución de los lenguajes de programaciónEvolución de los lenguajes de programación
• Lenguajes estructurados (C, PASCAL, etc)Lenguajes procedurales: funciones como cajas negrasEstructuras de datos locales/globalesProhibidos los saltos entre instrucciones (bucles, funciones)Productividad aceptableDiseño modular: mantenimiento más sencillo
x Estructuras de datos y procedimientos que las tratan se diseñan por separadox “Gap” semántico entre el espacio del problema y el espaciode la solución
IntroducciIntroduccióónn
Evolución de los lenguajes de programaciónEvolución de los lenguajes de programación
• Lenguajes Orientados a Objetos (Java, C++, etc)Extensión de los lenguajes estructuradosEstructuras de datos y funciones son una unidad: objetoSe adapta mejor a la estructura del mundo realDiseño orientado a componentesREUTILIZACIÓN
IntroducciIntroduccióónn
ProgramaciProgramacióón n ProceduralProcedural vsvs POOPOO
Programación ProceduralProgramación Procedural
• Unidad básica: el procedimiento
entradas salidas
• Programa con procedimientos
datodato
datodato
función función
funciónfunción
ProgramaciProgramacióón n ProceduralProcedural vsvs POOPOO
Programación Orientada a ObjetosProgramación Orientada a Objetos
• Unidad básica: el objeto
• Programa con objetos
datodato
dato
función
función
función
¿TAD?
datodato
dato
función
función
función
datodato
dato
función
función
función
datodato
dato
función
función
función
ProgramaciProgramacióón n ProceduralProcedural vsvs POOPOO
Ejemplo. Programación ProceduralEjemplo. Programación Procedural
#define MAX_ITEM 100
typedef struct {int list[MAX_ITEM];int size;
} t_list;
t_list *create();void destroy(t_list *lst);int addItem(t_list *lst, int item);void removeItem(t_list *lst, int item);int *getLast(t_list *lst);int *getFirst(t_list *lst);int getSize(t_list *lst);
t_list.h
#include “t_list.h”
t_list *create() {………………
}void destroy(t_list *lst) {
…………}int addItem(t_list *lst, int item) {
…………} …………
t_list.c
#include “t_list.h”
void main() {
t_list *list = create();addItem(list, 0);……………destroy(list);
}
main.c
ProgramaciProgramacióón n ProceduralProcedural vsvs POOPOO
Ejemplo. Programación Orientada a ObjetosEjemplo. Programación Orientada a Objetos
public class List {
private int[] list;private int size;
List() {……}int addItem(int item) {………}int removeItem(int item) {……}int getFirst() {……}int getLast() {……}int getSize() {………}
}
List.cs
Datos
Funciones
public class Main {
public static void Main( …… ) {
List list = new List();list.addItem(0);……………
}}
Main.cs
Principios del Paradigma Orientado a ObjetosPrincipios del Paradigma Orientado a Objetos
• Todo son objetos
• Un programa es una colección de objetos.
• Los objetos interactúan realizando peticiones de servicios a otros objetos mediante mensajes.
• El cómputo avanza mediante la interacción de los objetos
• Todo objeto es un ejemplar de un clase. Una clase agrupa
objetos “similares”.
ProgramaciProgramacióón n ProceduralProcedural vsvs POOPOO
• En el mundo real, todo son objetos: un perro, una casa,
un coche, etc.
• Un objeto del mundo real tiene dos características:
• Estado (nombre, color, tamaño, etc)
• Comportamiento (ladrar, correr, dormir, etc)
¿¿QuQuéé es un objeto?es un objeto?
En el modelo Orientado a Objetos todo objeto tiene:Identidad: Los objetos pueden distinguirse unos de otros.
Comportamiento: Los objetos pueden realizar ciertastareas. El comportamiento se modela por medio de métodos.
Estado: Los objetos almacenan información. El estado se modela por medio de atributos.
¿¿QuQuéé es un objeto?es un objeto?
atributo
atributo
atributo
método
método
método
El cliente “ve” sólo la interfaz
Cta_banco:extraerdepositar:
Array:agregarbuscar:
Coche:repostaralquilar:
Los objetos ocultan detalles de Los objetos ocultan detalles de implementaciimplementacióón...n...
• Una aplicación en ejecución es una comunidad de objetos que se comunican
entre sí.
• Los objetos interaccionan con otros objetos enviando mensajes
Comunicación entre objetosComunicación entre objetos
¿¿QuQuéé es un objeto?es un objeto?
mensaje
• Mensaje = destinatario + acción + argumentos
cambiarColor(rojo)
• El algoritmo o conjunto de operaciones que ejecuta un objeto como
respuesta a un mensaje se llama método
Mensaje versus Llamada a ProcedimientoMensaje versus Llamada a Procedimiento
Los mensajes se diferencian de las llamadas a procedimientoen varios aspectos:
• El mensaje posee un receptor designado; el receptor es algúnobjeto al cual se envía un mensaje
• La interpretación del mensaje (el método usado para responder al mensaje) depende del receptor y puede variar con diferentes receptores (concepto de polimorfismo)
• El modelo de paso de mensajes incluye tato comunicación síncrona como asíncrona
• El receptor no tiene por qué estar en el mismo proceso o incluso la misma máquina del emisor
¿¿QuQuéé es un objeto?es un objeto?
Todos los objetos de un mismo tipo comparten la misma clase
Todo objeto es instancia de alguna clase
La clase describe las características de los objetos de la mismaclase
Qué atributos tienen
Qué métodos tienen
La clase constituye la plantilla de un mismo tipo de objetosConstituye la base para poder crear un objeto
Cuando se crea un objeto de una clase se dice que se instancia un objeto de dicha clase
La clase es un concepto estático (en tiempo de diseño) mientrasque el objeto es un concepto dinámico (en tiempo de ejecución)
¿¿QuQuéé es una clase?es una clase?
CLASE: PERSONA-------------------------Nombre,Direccion, Edad-------------------------ObtenerEdad
Ejemplo de Ejemplo de instanciaciinstanciacióónn::
PersonaJosé Perez
c/ Reus 35, 27
ObtenerEdad()
...PersonaJuan Díaz
c/ Colón 7, 35
ObtenerEdad()...
¿¿QuQuéé es una clase?es una clase?
public class List {
private int[] list;private int size;
List() {……}int addItem(int item) {………}int removeItem(int item) {……}int getFirst() {……}int getLast() {……}int getSize() {………}
}
List.cspublic class Main {
public static void Main( …… ) {
List list = new List();
list.addItem(0);……………
}}
Main.cs
CLASE OBJETO
INSTANCIACIÓN
Ocultación de la informaciónOcultación de la información
• Capacidad de ocultar ciertos atributos o comportamientos y mostrar otros
• Los objetos de un sistema de información vistos como clientesde los servicios que les proveen ciertos objetos, sólo necesitan conocer el conjunto de mensajes que dichos objetos aceptan (la interfaz).
• El cliente que envía la petición no necesita conocer cómose atiende dicha petición (las acciones que se llevan a cabo)
EncapsulaciEncapsulacióónn
• En Programación Orientada a Objetos se considera buena práctica:
• Ocultar todos los atributos• Publicar métodos de acceso a los atributos (get/set)• Publicar únicamente los métodos necesarios
EncapsulaciEncapsulacióónn
atributo
atributo
atributo
método
método
método
CLIENTE
interfaz
¿Cómo controlar la visibilidad de atributos y métodos?Los lenguages de programación suelen proporcionar ciertas palabrasclave:
public: acceso público sin restricciones
private: acceso restringido únicamente desde el interior del objeto
protected: acceso restringido desde el interior del objeto o cualquiera de lassubclases en una jerarquía de herencia
Control de la Visibilidad de AccesoControl de la Visibilidad de Acceso
EncapsulaciEncapsulacióónn
public class Mesa {
private int x = 0;private int y = 0;protected int width = 100;protected int height = 100;private int color = 100;
public int Height { get{...} set{..}}public int Width() {get{...} set{..}}public int Color() {get{...} set{..}}
public void move(int x, int y) { ………. }
}
Control de la Visibilidad de AccesoControl de la Visibilidad de Acceso
EncapsulaciEncapsulacióónn
Un banco dispone de un conjunto de cuentas bancarias. Cada cuenta bancaria tiene un titular, que indica quién es el propietario de la misma, y un saldo que indica el importe disponible en pesetas. Sobre cada cuenta bancaria se pueden realizar dos operaciones básicas: ingresar o sacar de la cuenta una cierta cantidad de dinero (abonos y cargos).
EncapsulaciEncapsulacióónn
• Siguiendo el paradigma OO:-- Clases:
- Banco- Cuenta Bancaria
-- Objetos: - Un objeto que representa al banco- Un objeto por cada cuenta bancaria que exista
EjemploEjemplo
Un objeto encapsula los atributos (estructura) y los métodos(comportamiento). Esta encapsulación hace que el objeto tenga unos límites
claramente definidos (sólo es visible su INTERFAZ, el interior del objeto no lo es).
Abono( )
Cargo ( )
saldo
Abono( )
Cargo( )
saldo
CuentaBancaria CuentaBancaria
EncapsulaciEncapsulacióónn
Combinando Datos y Métodos
Los métodos son públicos por lo general. Constituyen la interfazdel objeto y son accesibles a otros objetos que pueden invocarlos.
Los datos son privados por lo general. Sólo son accesibles desde
el interior del propio objeto.
Abono( )
Cargo( )
saldo
CuentaBancaria
Abono( )
Cargo( )
saldo
Objeto CuentaBancaria
EncapsulaciEncapsulacióónn
Control de la visibilidad
Proporciona CONTROLLa utilización del objeto es solamente
a través de sus métodos públicos
Permite CAMBIOSLa utilización del objeto no se ve
afectada si se producen cambios
en el tipo de datos de la parte
privada.
Abono ( )
Cargo ( )
euros 1202
centimos 16
Abono ( )
Cargo ( )
saldo 200.000
¿ Por qué la Encapsulación?¿ Por qué la Encapsulación?Objeto CuentaBancaria
Objeto CuentaBancaria
EncapsulaciEncapsulacióónn
¿Qué es?¿Qué es?
• Poderoso mecanismo de reutilización de código (mucho más potente que los procedimientos) por el cual una clase puede heredar los atributos y métodos de otra clase. Mecanismo por el que es posible definir clases a partir de otras clases
• Conceptualmente, se dice que el conocimiento de una clase más general es aplicable también a la clase más específica. Se habla por tanto también de generalización/especialización
• La técnica reside en factorizar los aspectos comunes en una clase base y heredar de dicha clase
HerenciaHerencia
Jerarquías de HerenciaJerarquías de Herencia
• Las clases se pueden organizar en una estructura de árbol, llamada jerarquía de herencia
• La información (datos y comportamiento) asociados con un nivel de una jerarquía de clases es aplicable automáticamente a los niveles inferiores de la jerarquía• La clase base se denomina superclase o clase padre• La clase que hereda se denomina subclase, clase hija
HerenciaHerencia
Superclase
Subclase
UML
La comunidad universitaria de la UPV puede organizarse en dos grandes bloques: personal de la UPV y alumnado de la UPV.
El personal puede dividirse en Profesores (Personal Docente e Investigador PDI) o Personal de Administración y Servicios (PAS).
El PDI puede ser Profesor Asociado, Profesor Colaborador, Titular de Escuela Universitaria (TEU), Titular de Universidad (TU), Catedrático de Escuela Universitaria (CEU) o Catedrático de Universidad (CU)
El alumnado puede ser alumnado universitario o alumnado de doctorado.
EjemploEjemplo
HerenciaHerencia
EjemploEjemplo
Miembro UPV
Alumno UPV Personal UPV
Alumno universitario
Doctorando PDI PAS
Asociado Colaborador TEU TU CU
HerenciaHerencia
CEU
EjemploEjemplo
HerenciaHerenciapublic class MiembroUPV {private String nif;private String nombre;private String apellidos;
public String getNif() { ….. }public void setNif(String nif) { …. }……………..
}
public class AlumnoUPV : MiembroUPV {private String expediente;……………..
}
public class PersonalUPV : MiembroUPV {private int nómina;……………..
}
public class UniversitarioUPV: AlumnoUPV {
private String titulación;……………..
}
public class DoctorandoUPV: AlumnoUPV {
private String programa;……………..
}
public class PDI : PersonalUPV {
private String[] asignaturas;……………..
}
public class PAS : PersonalUPV {
private String[] tareas;……………..
}
public class Asociado : PDI {
private String empresa;……………..
}
public class Colaborador : PDI {……………..
}
public class TEU : PDI {……………..
}
public class TU : PDI {……………..
}
public class CEU : PDI {……………..
}
public class CU : PDI {……………..
}
¿Qué es?¿Qué es?
• Polimorfismo: muchas formas.
• Fuertemente ligado con el concepto de herencia.
• Todo objeto que pertenece a una subclase pertenece también a la superclase (ej: un profesor de la UPV es también personal de la UPV y miembro de la UPV)
• Una subclase puede sobreescribir el comportamiento de alguna clase padre en su jerarquía de herencia
• Para un mismo mensaje cada clase se comporta de una manera diferente (la implementación del método es diferente)
PolimorfismoPolimorfismo
EjemploEjemplo
PolimorfismoPolimorfismo
Circulo- radio : double = 0
+ getArea() : double+ getRadio() : double+ setRadio(in radio : double)+ dibujar()
Forma# area : double = 0
+ getArea() : double+ dibujar()
Rectangulo- longitud : double = 0- anchura : double = 0
+ getArea() : double+ getLongitud() : double+ setLongitud(in longitud : double)+ getAnchura() : double+ setAnchura(in anchura : double)+ dibujar()
Circulo circ = new Circulo();circ.setRadio(100);circ.getArea();circ.dibujar();
Rectangulo rect = new Rectangulo();rect.setLongitud(100);rect.setAnchura(50);rect.getArea();dibujar();
Forma forma = new Circulo();forma.getArea();forma.dibujar();
forma = new Rectangulo();forma.getArea();forma.dibujar();
El énfasis de la OO en la construcción de componentes independientespermite un proceso de desarrollo incremental, en el cual unidades de software individuales (clases) se diseñan, programan y prueban antes decombinarse en un sistema grande
Al reducir la interdependencia entre los componentessoftware, la orientación a objetos permite el
desarrollo de sistemas de software reutilizable
ReutilizaciReutilizacióón de clasesn de clases
Ventajas de la Reutilización
• Un componente que se reutiliza no tiene que ser reescrito
• El coste incremental de reutilizar un componente esmenor que el coste de volver a desarrollarlo
• Un conjunto estándar de componentes es más fácil demantener
• Un componente reutilizado habrá sido probado y utilizadominuciosamente, y seguramente estará libre de errores otendrá muchos menos que uno desarrollado por nosotros
ReutilizaciReutilizacióón de clasesn de clases
Mecanismos para Reutilizar
Existen dos mecanismos esenciales para la reutilización:
• Composición - La relación tiene-un o parte-de
• Herencia - La relación es-un
ReutilizaciReutilizacióón de clasesn de clases
Composición Herencia
Usando la relación tiene-un, uncomponente es simplemente partedel estado de otro componente ode otra manera, un componenteestá compuesto-de.
• Un coche tiene-un motor• Una casa tiene-una puerta• Una receta tiene-una lista deingredientes
En la herencia un componentees-una variación de otro, y heredatodas las características delprimero sin necesidad de volvera codificarlo.
Objeto Material
Animal
Ornitorrinco
Planta
Flor
Perro Humano
Mamífero
Comerciante Artista Dentista
Florista Ceramista
Relámpago Flora Sandra PepeAntonio flores de la abuela
ReutilizaciReutilizacióón de clasesn de clases
Además de un acercamiento al lenguaje natural, la POO aporta dos grandes ventajas en el ámbito de la programación:
- Facilita la reutilización de código
- Mejora la modularidad y el control de errores, lo que se nota, sobre todo, en aplicaciones grandes.
ResumenResumen
La POO se basa en tres conceptos:
• Encapsulamiento. Unir bajo una misma entidad lógica datos y código que lo manipula, aislándolos del resto. En POO esto se consigue con las clases.• Polimorfismo. La POO aporta la posibilidad de polimorfismo cuando un método produce efectos diferentes en función de la clase a la que se aplique. Es importante no confundir el polimorfismo con la sobrecarga de funciones o la sobrecarga de operadores.
ResumenResumen
• Herencia. La herencia aprovecha las clases ya definidas para definir otras más específicas, que heredan los miembros de las clases más generales.
A la clase más general se la denomina clase base o superclase, y a la más específica clase hija o subclase.
La jerarquía resultante de relaciones de herencia suele tener forma de árbol, si bien no siempre es así
ResumenResumen
ProgramaciProgramacióónn con C#con C#
Tema 5: Tema 5: OO con OO con C#C#
C#C#
•• El lenguaje C# y la orientaciEl lenguaje C# y la orientacióón a n a objetosobjetos
“Hola, mundo” de nuevoDefinición de clases simplesInstancias de nuevos objetosUso del operador this
C#C#
““Hola, mundoHola, mundo”” de nuevode nuevo
using System;
class Hello{
public static int Main( ){
Console.WriteLine(“Hello, World”);return 0;
}}
using System;
class Hello{
public static int Main( ){
Console.WriteLine(“Hello, World”);return 0;
}}
C#C#
DefiniciDefinicióón de clases simplesn de clases simplesDatos y métodos juntos dentro de una claseLos métodos son públicos, los datos son privados
class CuentaBancaria{
public void Retirar(decimal cantidad){ ... }public void Ingresar(decimal cantidad){ ... }private decimal balance;private string name;
}
class CuentaBancaria{
public void Retirar(decimal cantidad){ ... }public void Ingresar(decimal cantidad){ ... }private decimal balance;private string name;
}
Métodos públicosdescriben un
comportamientoaccesible
Métodos públicosdescriben un
comportamientoaccesible
Campos privadosdescriben un
estadoinaccesible
Campos privadosdescriben un
estadoinaccesible
C#C#
Instancias de nuevos objetosInstancias de nuevos objetosAl declarar una variable de clase no se crea un objeto
Para crear un objeto se usa el operador new
class Program{
static void Main( ){
Reloj ahora;ahora.hora = 11; Cuenta Bancaria suya = new CuentaBancaria( );suya.Ingresar(999999M);
}}
class Program{
static void Main( ){
Reloj ahora;ahora.hora = 11; Cuenta Bancaria suya = new CuentaBancaria( );suya.Ingresar(999999M);
}}
horaminuto
ahora
suya ......
nuevoobjetoCuentaBancaria
C#C#
Uso de la palabra reservada Uso de la palabra reservada thisthisLa palabra reservada this apunta al objeto usado para la llamada al método
Es útil en caso de conflicto entre identificadores de distintos ámbitos
class CuentaBancaria{
...public void PoneNombre(string nombre){
this.nombre = nombre;}private string nombre;
}
class CuentaBancaria{
...public void PoneNombre(string nombre){
this.nombre = nombre;}private string nombre;
}
Si esta instrucción fueranombre = nombre;¿qué ocurriría?
C#C#
•• DefiniciDefinicióón de sistemas orientados n de sistemas orientados a objetosa objetos
HerenciaJerarquías de clasesHerencia sencilla y múltiplePolimorfismoClases base abstractasInterfaces
C#C#
HerenciaHerencia
La herencia indica una relación “es un tipo de"La herencia es una relación entre clasesLas nuevas clases añaden especialización a las existentes
MúsicoMúsico
ViolinistaViolinista
Clase base
Clase derivada
Generalización
Especialización ¿Es éste un buenejemplo de herencia ?
C#C#
JerarquJerarquíías de clasesas de clases
Las clases con relaciones de herencia forman jerarquías de clases
MúsicoMúsico
??????
Músico decuerda
Músico decuerda
ViolínViolín??????
Instrumentomusical
Instrumentomusical
toca
toca
tocaViolinistaViolinista
Instrumento decuerda
Instrumento decuerda
C#C#
Herencia sencilla y mHerencia sencilla y múúltipleltipleHerencia sencilla: derivadas de una clase baseHerencia múltiple: derivadas de dos o más clases base
Instrumento decuerda
Instrumento decuerda
ViolínViolín
Instrumentomusical
Instrumentomusical
Instrumento decuerda
Instrumento decuerda
Con teclasCon teclas
Violín tiene una sola clase base directa
Instrumento de cuerda tiene dos clases base directas
C#C#
PolimorfismoPolimorfismoEl nombre del método reside en la clase baseLos distintos cuerpos del método residen en las clases derivadas
Músico de cuerdaMúsico de cuerda
AfinaTuInstrumento( )AfinaTuInstrumento( )
GuitarristaGuitarrista
AfinaTuInstrumento( )AfinaTuInstrumento( )
ViolinistaViolinista
AfinaTuInstrumento( )AfinaTuInstrumento( )
Un método sincuerpo se llama
operación
Un método sincuerpo se llama
operación
C#C#
Clases base abstractasClases base abstractasAlgunas clases existen sólo para ser clases base
No tiene sentido crear instancias de estas clases
Estas clases son abstractas
Músico de cuerda{ abstract }
Músico de cuerda{ abstract }
Guitarrista« concrete »Guitarrista
« concrete »Violinista
« concrete »Violinista
« concrete »
Se pueden crear instanciasde clases concretas
Se pueden crear instanciasde clases concretas
No se pueden crear instanciasde clases abstractas
No se pueden crear instanciasde clases abstractas
C#C#
InterfacesInterfacesLas interfaces contienen sólo operaciones, no implementación
Músico de cuerda{ abstract }
Músico de cuerda{ abstract }
Violinista« concrete »Violinista
« concrete »
Músico« interface »
Músico« interface »
Nada más que operaciones.No se pueden crear instancias
de una interfaz.
Nada más que operaciones.No se pueden crear instancias
de una interfaz.
Puede contener implementación.No se pueden crear instancias de
una interfaz.
Puede contener implementación.No se pueden crear instancias de
una interfaz.
Implementa las operaciones heredadas.Se pueden crear instancias de una clase
concreta.
Implementa las operaciones heredadas.Se pueden crear instancias de una clase
concreta.
C#C#
Uso deUso de variables de variables de tipo referenciatipo referencia
C#C#
••Notas generalesNotas generales
Uso de variables de tipo referenciaUso de tipos referencia comunesLa jerarquía de objetosEspacios de nombres en .NET Framework
C#C#
•• Uso de variables de tipo Uso de variables de tipo referenciareferencia
Comparación de tipos valor y tipos referenciaDeclaración y liberación de variables referenciaReferencias no válidasComparación de valores y comparación de referenciasReferencias múltiples a un mismo objetoUso de referencias como parámetros de métodos
C#C#
ComparaciComparacióón de tipos valor y tipos referencian de tipos valor y tipos referencia
Tipos valorLa variable contiene el valor directamenteEjemplos: char, int
4242
int mol;mol = 42;
int mol;mol = 42; ••
string mol;mol = “Hola";
string mol;mol = “Hola";
HolaHola
Tipos referencia
La variable contiene una referencia al dato
El dato se almacena en unárea de memoria aparte
C#C#
DeclaraciDeclaracióón y liberacin y liberacióón de variables referencian de variables referencia
Declaración de variables referencia
coordenada c1; c1 = new coordinate(); c1.x = 6.12; c1.y = 4.2;
coordenada c1; c1 = new coordinate(); c1.x = 6.12; c1.y = 4.2;
•• 6.126.12 4.24.2
c1 = null;c1 = null;
•• 6.126.12 4.24.2
Liberación de variables referencia
C#C#
Referencias no vReferencias no váálidaslidas
Si hay referencias no válidasNo es posible acceder a miembros o variables
Referencias no válidas en tiempo de compilaciónEl compilador detecta el uso de referencias no inicializadas
Referencias no válidas en tiempo de ejecuciónEl sistema generará un error de excepción
C#C#
ComparaciComparacióón de valores y comparacin de valores y comparacióón de n de referenciasreferencias
Comparación de tipos valor== and != comparan valores
Comparación de tipos referencia== and != comparan las referencias, no los valores
•• 1.01.0 2.02.0
•• 1.01.0 2.02.0
Diferente
C#C#
Referencias mReferencias múúltiples a un mismo objetoltiples a un mismo objeto
Dos referencias pueden apuntar a un mismo objetoDos formas de acceder a un mismo objeto para lectura/escritura
coordinate c1= new coordinate ( );coordinate c2;c1.x = 2.3; c1.y = 7.6;c2 = c1;Console.WriteLine(c1.x + " , " + c1.y);Console.WriteLine(c2.x + " , " + c2.y);
coordinate c1= new coordinate ( );coordinate c2;c1.x = 2.3; c1.y = 7.6;c2 = c1;Console.WriteLine(c1.x + " , " + c1.y);Console.WriteLine(c2.x + " , " + c2.y);
••2.32.3 7.67.6
••
c1
c2
C#C#
Uso de referencias como parUso de referencias como paráámetros de mmetros de méétodostodos
Las referencias se pueden usar como parámetrosSi se pasan por valor, es posible cambiar el dato referenciado
static void PassCoordinateByValue(coordinate c){c.x++; c.y++;
}
static void PassCoordinateByValue(coordinate c){c.x++; c.y++;
}
loc.x = 2; loc.y = 3;PassCoordinateByValue(loc);Console.WriteLine(loc.x + " , " + loc.y);
loc.x = 2; loc.y = 3;PassCoordinateByValue(loc);Console.WriteLine(loc.x + " , " + loc.y);
2 32 3 3 43 4
••
••
C#C#
•• Uso de tipos referencia comunesUso de tipos referencia comunesClase ExceptionClase StringMétodos, operadores y propiedades comunes de StringComparaciones de cadenas de caracteresOperadores de comparación en String
C#C#
Clase Clase ExceptionException
Exception es una claseLos objetos Exception se usan para lanzar excepciones
Para crear un objeto Exception se usa newPara lanzar el objeto se usa throw
Los tipos Exception son subclases de Exception
C#C#
Clase Clase StringString
Cadenas de caracteres UnicodeAbreviatura de System.StringInmutable
string s = "Hola";
s[0] = 'c'; // Error al compilar
string s = "Hola";
s[0] = 'c'; // Error al compilar
C#C#
MMéétodos, operadores y propiedades comunes todos, operadores y propiedades comunes de de StringString
CorchetesMétodo InsertPropiedad LengthMétodo CopyMétodo ConcatMétodo TrimMétodos ToUpper y ToLower
C#C#
Comparaciones de cadenas de Comparaciones de cadenas de caracterescaracteres
Método EqualsComparación de valores
Método CompareMás comparacionesOpción para no distinguir mayúsculas y minúsculasOrdenación alfabética
Opciones locales de Compare
C#C#
Operadores de comparaciOperadores de comparacióón en n en StringString
Los operadores == y != están sobrecargados para cadenasSon equivalentes a String.Equals y !String.Equals
string a = "Test";string b = "Test";if (a == b) ... // Devuelve true
string a = "Test";string b = "Test";if (a == b) ... // Devuelve true
C#C#
•• La jerarquLa jerarquíía de objetosa de objetos
El tipo objectMétodos comunesReflexión
C#C#
El tipo El tipo objectobject
Sinónimo de System.ObjectClase base para todas las demás clases
ExceptionException
SystemExceptionSystemException
MyClassMyClass
ObjectObject
StringString
C#C#
MMéétodos comunestodos comunes
Métodos comunes para todos los tipos referencia
Método ToStringMétodo EqualsMétodo GetTypeMétodo Finalize
C#C#
ReflexiReflexióónn
Es posible obtener información sobre el tipo de un objetoEspacio de nombres System.ReflectionEl operador typeof devuelve el tipo de un objeto
Sólo para clases en tiempo de compilaciónMétodo GetType en System.Object
Información sobre clases en tiempo de ejecución
C#C#
•• Conversiones de datosConversiones de datosConversión de tipos valorConversiones padre/hijaEl operador isEl operador asConversiones y el tipo objectConversiones e interfacesBoxing y unboxing
C#C#
ConversiConversióón de tipos valorn de tipos valor
Conversiones implícitasConversiones explícitas
Operador de cast
ExcepcionesClase System.Convert
Control interno de conversiones
C#C#
Conversiones padre/hijaConversiones padre/hija
Conversión a referencia de clase padreImplícita o explícitaSiempre tiene éxitoSiempre se puede asignar a un objeto
Conversión a referencia de clase hijaEs necesario cast explícitoComprueba que la referencia es del tipo correctoSi no lo es, causa una excepciónInvalidCastException
C#C#
El operador El operador isis
Devuelve true si es posible realizar una conversión
Pajaro b;if (a is Pajaro)
b = (Pajaro) a; // No hay problemaelse
Console.WriteLine("No es Pájaro");
Pajaro b;if (a is Pajaro)
b = (Pajaro) a; // No hay problemaelse
Console.WriteLine("No es Pájaro");
C#C#
El operador asEl operador asHace conversiones entre tipos referencia, como castEn caso de error
Devuelve nullNo causa una excepción
Pajaro b = a as Pajaro; // Convertir
if (b == null)Console.WriteLine("No es Pájaro”);
Pajaro b = a as Pajaro; // Convertir
if (b == null)Console.WriteLine("No es Pájaro”);
C#C#
Conversiones y el tipo Conversiones y el tipo objectobjectEl tipo object es la base para todas las clasesSe puede asignar a object cualquier referenciaSe puede asignar cualquier variable object a cualquier referencia
Con conversión de tipo y comprobacionesEl tipo object y el operador is
object buey;buey = a; buey = (object) a;buey = a as object;
object buey;buey = a; buey = (object) a;buey = a as object;
b = (Pajaro) buey;b = buey as Pajaro;
b = (Pajaro) buey;b = buey as Pajaro;
C#C#
Conversiones e interfacesConversiones e interfaces
Una interfaz sólo se puede usar para acceder a sus propios miembrosNo es posible acceder a otros miembros y variables de la clase a través de la interfaz
C#C#
BoxingBoxing y y unboxingunboxingSistema de tipos unificadoBoxingUnboxingLlamadas a métodos de object en tipos valor
int p = 123;object box;box = p;
int p = 123;object box;box = p;
•• 123123
123123 p = (int)box;p = (int)box;
C#C#
CreaciCreacióón yn ydestruccidestruccióón de n de
objetosobjetos
C#C#
DescripciDescripcióón generaln general
Uso de constructoresObjetos y memoria
C#C#
•• Uso de constructoresUso de constructores
Creación de objetosUso del constructor por defectoSustitución del constructor por defectoSobrecarga de constructores
C#C#
CreaciCreacióón de objetosn de objetosPaso 1: Asignación de memoria
Se usa new para asignar memoria desde el montón Paso 2: Inicialización del objeto usando un constructor
Se usa el nombre de la clase seguido por paréntesis
Fecha cuando = new Date( );Fecha cuando = new Date( );
C#C#
Uso del constructor por defectoUso del constructor por defectoCaracterísticas de un constructor por defecto
Acceso públicoMismo nombre que la claseNo tiene tipo de retorno (ni siquiera void)No recibe ningún argumentoInicializa todos los campos a cero, false o null
Sintaxis del constructor
class Date { public Date( ) { ... } }class Date { public Date( ) { ... } }
C#C#
SustituciSustitucióón del constructor por n del constructor por defectodefecto
El constructor por defecto puede no ser adecuado
En ese caso no hay que usarlo, sino escribir otro
Class Date{
public Date( ){
ssaa = 1970;mm = 1;dd = 1;
}private int ccyy, mm, dd;
}
Class Date{
public Date( ){
ssaa = 1970;mm = 1;dd = 1;
}private int ccyy, mm, dd;
}
C#C#
Sobrecarga de constructoresSobrecarga de constructoresLos constructores son métodos y pueden estar sobrecargados
Mismo ámbito, mismo nombre, distintos parámetrosPermite inicializar objetos de distintas maneras
AVISOSi se escribe un constructor para una clase, el compilador no creará un constructor por defecto
Class Date{
public Date( ) { ... }public Date(int anno, int mes, int dia) { ... }...
}
Class Date{
public Date( ) { ... }public Date(int anno, int mes, int dia) { ... }...
}
C#C#
•• Objetos y memoriaObjetos y memoria
Tiempo de vida de un objetoObjetos y ámbitoRecolección de basura
C#C#
Tiempo de vida de un objetoTiempo de vida de un objetoCreación de objetos
Se usa new para asignar memoriaSe usa un constructor para inicializar un objeto en esa memoria
Uso de objetosLlamadas a métodos
Destrucción de objetosSe vuelve a convertir el objeto en memoriaSe libera la memoria
C#C#
Objetos y Objetos y áámbitombitoEl tiempo de vida de un valor a local está vinculado al ámbito en el que está declarado
Tiempo de vida corto (en general)Creación y destrucción deterministas
El tiempo de vida de un objeto dinámico no estávinculado a su ámbito
Tiempo de vida más largoDestrucción no determinista
C#C#
RecolecciRecoleccióón de basuran de basuraNo es posible destruir objetos de forma explícita
C# no incluye un inverso de new (como delete)Ello se debe a que una función de eliminación explícita es una importante fuente de errores en otros lenguajes
Los objetos se destruyen por recolección de basura
Busca objetos inalcanzables y los destruyeLos convierte de nuevo en memoria binaria no utilizadaNormalmente lo hace cuando empieza a faltar memoria
C#C#
Herencia enHerencia en C#C#
C#C#
Notas generalesNotas generales
Derivación de clasesImplementación de métodosUso de clases selladasUso de interfacesUso de clases abstractas
C#C#
•• DerivaciDerivacióón de clasesn de clases
Extensión de clases baseAcceso a miembros de la clase baseLlamadas a constructores de la clase base
C#C#
ExtensiExtensióón de clases basen de clases baseSintaxis para derivar una clase desde una clase base
Una clase derivada hereda la mayor parte de los elementos de su clase base Una clase derivada no puede ser más accesible que su clase base
class Token{
...}class ComentToken: Token{
...}
class Token{
...}class ComentToken: Token{
...}
ComentToken« concrete »
ComentToken« concrete »
Token« concrete »
Token« concrete »Clase derivadaClase derivadaClase derivada Clase baseClase baseClase base
2 puntos2 puntos2 puntos
C#C#
Acceso a miembros de la clase Acceso a miembros de la clase basebase
Los miembros heredados con protección están implícitamente protegidos en la clase derivadaLos miembros de una clase derivada sólo pueden acceder a sus miembros heredados con protecciónEn una struct no se usa el modificador de acceso protected
class Token{ ... class Outside
protected string name; {} void Fails(Token t)class ComentToken: Token {{ ... ...
public string Name( ) t.name{ ...
return name; } } }
}
class Token{ ... class Outside
protected string name; {} void Fails(Token t)class ComentToken: Token {{ ... ...
public string Name( ) t.name{ ...
return name; } } }
}
C#C#
Llamadas a constructores de la clase baseLlamadas a constructores de la clase baseLas declaraciones de constructores deben usar la palabra base
Una clase derivada no puede acceder a un constructor privado de la clase baseSe usa la palabra base para habilitar el ámbito del identificador
class Token{
protected Token(string name) { ... }...
}class ComentToken: Token{
public ComentToken(string name) : base(name) { } ...
}
class Token{
protected Token(string name) { ... }...
}class ComentToken: Token{
public ComentToken(string name) : base(name) { } ...
}
C#C#
•• ImplementaciImplementacióón de mn de méétodostodos
Definición de métodos virtualesUso de métodos virtualesSustitución de métodos (override)Uso de métodos overrideUso de new para ocultar métodosUso de la palabra reservada new
C#C#
DefiniciDefinicióón de mn de méétodos virtualestodos virtualesSintaxis: Se declara como virtual
Los métodos virtuales son polimórficos
class Token{
...public int LineNumber( ) { ... }public virtual string Name( ) { ... }
}
class Token{
...public int LineNumber( ) { ... }public virtual string Name( ) { ... }
}
C#C#
Uso de mUso de méétodos virtualestodos virtuales
Para usar métodos virtuales:No se puede declarar métodos virtuales como estáticosNo se puede declarar métodos virtuales como privados
C#C#
SustituciSustitucióón de mn de méétodos (todos (overrideoverride))Sintaxis: Se usa la palabra reservada override
class Token{ ...
public virtual string Name( ) { ... } }class ComentToken: Token{ ...
public override string Name( ) { ... }}
class Token{ ...
public virtual string Name( ) { ... } }class ComentToken: Token{ ...
public override string Name( ) { ... }}
C#C#
Uso de mUso de méétodos todos overrideoverrideSólo se sustituyen métodos virtuales heredados idénticos
Un método override debe coincidir con su método virtual asociado
Se puede sustituir un método override
No se puede declarar explícitamente un override como virtual
No se puede declarar un método override como static o private
class Token{ ...
public int LineNumber( ) { ... }public virtual string Name( ) { ... }
}class ComentToken: Token{ ...
public override int LineNumber( ) { ... }public override string Name( ) { ... }
}
class Token{ ...
public int LineNumber( ) { ... }public virtual string Name( ) { ... }
}class ComentToken: Token{ ...
public override int LineNumber( ) { ... }public override string Name( ) { ... }
}
C#C#
Uso de Uso de newnew para ocultar mpara ocultar méétodostodosSintaxis: Para ocultar un método se usa la palabra reservada new
class Token{ ...
public int LineNumber( ) { ... }}class ComentToken: Token{ ...
new public int LineNumber( ) { ... }
}
class Token{ ...
public int LineNumber( ) { ... }}class ComentToken: Token{ ...
new public int LineNumber( ) { ... }
}
C#C#
Uso de la palabra reservada Uso de la palabra reservada newnewOcultar tanto métodos virtuales como no virtuales
Resolver conflictos de nombre en el códigoOcultar métodos que tengan signaturas idénticas
class Token{ ...
public int LineNumber( ) { ... }public virtual string Name( ) { ... }
}class ComentToken: Token{ ...
new public int LineNumber( ) { ... }public override string Name( ) { ... }
}
class Token{ ...
public int LineNumber( ) { ... }public virtual string Name( ) { ... }
}class ComentToken: Token{ ...
new public int LineNumber( ) { ... }public override string Name( ) { ... }
}
C#C#
Uso de clases selladasUso de clases selladasNinguna clase puede derivar de una clase selladaLas clases selladas sirven para optimizar operaciones en tiempo de ejecuciónMuchas clases de .NET Framework son selladas: String, StringBuilder, etc.Sintaxis: Se usa la palabra reservada sealed
namespace System{
public sealed class String{
...}
}namespace Mine{
class FancyString: String { ... }}
namespace System{
public sealed class String{
...}
}namespace Mine{
class FancyString: String { ... }}
C#C#
•• Uso de interfacesUso de interfaces
Declaración de interfacesImplementación de varias interfacesImplementación de métodos de interfaz
C#C#
DeclaraciDeclaracióón de interfacesn de interfaces
Sintaxis: Para declarar métodos se usa la palabra reservada interface
interface IToken{
int LineNumber( );string Name( );
}
interface IToken{
int LineNumber( );string Name( );
}
IToken« interface »
IToken« interface »
LineNumber( )Name( )LineNumber( )Name( )
Métodos sin cuerpoMMéétodos sin cuerpotodos sin cuerpo
Los nombres de interfacesempiezan con “I”mayúsculaLos nombres de interfacesLos nombres de interfaces
empiezan con empiezan con ““II””maymayúúsculascula
Sin espec. de accesoSin Sin especespec. de acceso. de acceso
C#C#
ImplementaciImplementacióón de varias interfacesn de varias interfacesUna clase puede implementar cero o más interfaces
Una interfaz puede extender cero o más interfacesUna clase puede ser más accesible que sus interfaces baseUna interfaz no puede ser más accesible que su interfaz baseUna clase implementa todos los métodos de interfaz heredados
interface IToken{
string Name( );}interface IVisitable{
void Accept(IVisitante v);}class Token: IToken, IVisitable{ ...}
interface IToken{
string Name( );}interface IVisitable{
void Accept(IVisitante v);}class Token: IToken, IVisitable{ ...}
IToken« interface »
IToken« interface »
IVisitable« interface »IVisitable
« interface »
Token« concrete »
Token« concrete »
CVC1
Diapositiva 68
CVC1 Todas las declaraciones de métodos deben nombrar los parámetrosCurro Vázquez; 20/04/2003
C#C#
ImplementaciImplementacióón de mn de méétodos de todos de interfazinterfaz
El método que implementa debe ser igual que el método de interfazEl método que implementa puede ser virtual o no virtual
class Token: IToken, IVisitable{
public virtual string Name( ) { ... } public void Accept(IVisitante v) { ... }
}
class Token: IToken, IVisitable{
public virtual string Name( ) { ... } public void Accept(IVisitante v) { ... }
}
Mismo accesoMismo retornoMismo nombreMismos parámetros
Mismo accesoMismo accesoMismo retornoMismo retornoMismo nombreMismo nombreMismos parMismos paráámetrosmetros
C#C#
•• Uso de clases abstractasUso de clases abstractasDeclaración de clases abstractasUso de clases abstractas en una jerarquía de clasesComparación de clases abstractas e interfacesImplementación de métodos abstractosUso de métodos abstractos
C#C#
DeclaraciDeclaracióón de clases abstractasn de clases abstractasSe usa la palabra reservada abstract
abstract class Token{
...}class Test{
static void Main( ){
new Token( );}
}
abstract class Token{
...}class Test{
static void Main( ){
new Token( );}
}
Token{ abstract }
Token{ abstract }
No se pueden crear instanciasde una clase abstracta
No se pueden crear instanciasNo se pueden crear instanciasde una clase abstractade una clase abstracta
C#C#
Uso de clases abstractas en una jerarquUso de clases abstractas en una jerarquíía de a de clasesclases
interface IToken{
string Name( );}
abstract class Token: IToken{
string IToken.Name( ) { ...}...
}
class ComentToken: Token{ ...}class KeywordToken: Token{ ...}
interface IToken{
string Name( );}
abstract class Token: IToken{
string IToken.Name( ) { ...}...
}
class ComentToken: Token{ ...}class KeywordToken: Token{ ...}
Ejemplo 1
Token{ abstract }
Token{ abstract }
IToken« interface »
IToken« interface »
ComentToken
« concrete »
ComentToken
« concrete »
KeywordToken
« concrete »
KeywordToken
« concrete »
C#C#
Uso de clases abstractas en una jerarquUso de clases abstractas en una jerarquíía de a de clases clases ((cont.cont.))
interface IToken{
string Name( );}
abstract class Token{
public virtual string Name( ) { ...}...
}
class ComentToken: Token, IToken{ ...}class KeywordToken: Token, IToken{ ...}
interface IToken{
string Name( );}
abstract class Token{
public virtual string Name( ) { ...}...
}
class ComentToken: Token, IToken{ ...}class KeywordToken: Token, IToken{ ...}
Ejemplo 2
Token{ abstract }
Token{ abstract }
IToken« interface »
IToken« interface »
ComentToken
« concrete »
ComentToken
« concrete »
KeywordToken
« concrete »
KeywordToken
« concrete »
C#C#
ComparaciComparacióón de clases abstractas e n de clases abstractas e interfacesinterfaces
ParecidosNo se pueden crear instancias de ninguna de ellasNo se puede sellar ninguna de ellas
DiferenciasLas interfaces no pueden contener implementacionesLas interfaces no pueden declarar miembros no públicosLas interfaces no pueden extender nada que no sea una interfaz
C#C#
ImplementaciImplementacióón de mn de méétodos todos abstractosabstractos
Sintaxis: Se usa la palabra reservada abstract
Sólo clases abstractas pueden declarar métodos abstractosLos métodos abstractos no pueden tener cuerpo
abstract class Token{
public virtual string Name( ) { ... }public abstract int Longitud( );
}class ComentToken: Token{
public override string Name( ) { ... }public override int Longitud( ) { ... }
}
abstract class Token{
public virtual string Name( ) { ... }public abstract int Longitud( );
}class ComentToken: Token{
public override string Name( ) { ... }public override int Longitud( ) { ... }
}
C#C#
Uso de mUso de méétodos abstractostodos abstractosLos métodos abstractos son virtualesLos métodos override pueden sustituir a métodos abstractos en otras clases derivadasLos métodos abstractos pueden sustituir a métodos de la clase base declarados como virtualesLos métodos abstractos pueden sustituir a métodos de la clase base declarados como override