Fundamentos básicos del lenguaje C# Daniel A. Seara Director Regional MSDN Buenos Aires - ARGENTINA...

Post on 03-Feb-2015

5 views 0 download

Transcript of Fundamentos básicos del lenguaje C# Daniel A. Seara Director Regional MSDN Buenos Aires - ARGENTINA...

Fundamentos Fundamentos básicos del básicos del lenguajelenguaje C# C#

Daniel A. SearaDaniel A. Seara

Director Regional MSDNDirector Regional MSDN

Buenos Aires - ARGENTINABuenos Aires - ARGENTINA

NDSoftNDSoft

Parte 1Introducción a C#

Sistemas Orientados a Componentes

• ComModelo de componentes exitosoPlataforma comercial de componentes

viablePermite la integración y el “re uso” de

componentes en una organización

Sistemas Orientados a Componentes

• Sin embargo:COM está mostrando signos de envejecimiento

DCOM no funciona como se espera en InternetMayor uso de componentes = mayor “infierno de DLLs”Aún con herramientas maduras las implementaciones no

son fácilesCOM no es totalmente “agnóstico” del lenguaje

Hace algunas asunciones respecto del formato binarioSoporta el menor común denominador

Concepto de Componentes en .NET

• Se tomo lo mejor de COM+ Interfaces como contratos abstractos Los componentes implementan y exponen

interfaces Exploración dinámica de las capacidades de los

componentes Comportamiento según atributos (transacciones,

“Pooling”, ...)

• Y le agrega Verdadera orientación a objetos Modelo de eventos nativos Re uso de componentes entre lenguajes Extensible a todo nivel

Porque C# ?• Primer lenguaje orientado a

componentesBasado en la experiencia de COM+Soporte nativo para

NamespacesVersionamientoDesarrollo basado en atributos

• El poder de C con la facilidad de VB• Curva de aprendizaje mínima• Mucho más limpio que C++• Más estructurado que VB

Sección 2: Elementos de C#

• Forma y estructura• Entendiendo los tipos del sistema• Entendiendo el lenguaje C#

Forma y Estructura • No hay archivos de encabezamiento (.H)

No es necesario “declarar” las clases y los tipos

• La declaración y el código están en un solo lugarHace que el código sea más consistente y

mantenibleFacilita la colaboración a nivel equipo de

desarrolloDeclaraciones accesibles: Metadata

• Compilación condicional pero sin macros

Tipos definidos por el Sistema

• Construido sobre el Common Type System• Conceptos básicos:

Todo es un objeto

Todo tiene herencia implícita de System.Object

Distinción entre valores y referencias

Por valor: tipos simples, enumeradores, estructuras

Por referencia: interfaces, clases, vectores

Tipos Simples• Enteros

byte, sbyte (8bit), short, ushort (16bit) int, uint (32bit), long, ulong (64bit)

• IEEE Floating Point double (precisión de 15-16 dígitos) float (precisión de 7 dígitos)

• Numéricos exactos Decimal (28 dígitos significativos)

• Cadenas de caracteres char string (referencia)

• Boolean bool (no es intercambiable con int)

Enums• Colección de elementos nombrados• Fuertemente tipeados• Mejor usar "color.Azul" que "3"

Mas legibilidad del código Tan liviano cómo un int

• Ejemplo:

enum Color { Rojo, Verde, Azul, Amarillo};

Vectores• Inician en cero, vinculados por tipo• Basadas en la clase System.Array de .NET• Declaración con tipo y forma, pero sin límite

int[] SingleDim; int[,] TwoDim; int [][] Jagged;

• Creación utilizando new con límites o inicializadores SingleDim = new int[20]; TwoDim = new int[,]{{1,2,3},{4,5,6}}; Jagged = new int[1][]; Jagged[0] = new int[]{1,2,3}

Interfaces• Declaración del contrato semántico entre partes

Permite la orientación a componentes

• Define la estructura y la semántica para propósitos específicos

• Definición de métodos y propiedades abstractos• Soporta herencia (múltiple)• Ejemplo:

interface IPersonaEdad{ int AnioDeNacimiento {get; set;} int Edad(); }

public class Persona : IPersonaEdad{ private int iAnio;

public Persona() { }

public int AnioDeNacimiento

{ get { return iAnio;}; set { iAnio = value;}; }

public int Edad() { return Today()- AnioDeNacimiento }; }

public class Persona : IPersonaEdad{ private int iAnio;

public Persona() { }

public int AnioDeNacimiento

{ get { return iAnio;}; set { iAnio = value;}; }

public int Edad() { return Today()- AnioDeNacimiento }; }

Clases• Implementación de

código y datos• Implementa interfaces• Herencia simple• Las clases contienen:

Campos: variables miembro Propiedades: valores

accedidos a través de get/set

Métodos: funcionalidad Especiales: eventos,

Indexadores, Delegates

Estructuras• Un grupo de código y datos

Similar a las clases pero:No permite herenciaSiempre son pasadas por valor

Clases vs. EstructurasEstructuras Contenedor de datos liviano, por valorClases objetos, tipo referenciados

• Desarrolladores C++! struct no es un class donde todo es público

• Ejemplo: struct Point{ double X; double Y; void MoveBy(double dX, double dY) { X+=dX; Y+=dY; }}

Propiedades• Mezcla entre campos y métodos• Uso de propiedades para:

Implementación de miembros sólo lectura (omitiendo set)

Validación en asignaciónValores calculados o compuestosExposición de valores en las interfaces

• Ejemplo: string Name { get { return name; } set { name = value; } }

Indexadores• Forma consistente de construir

contenedores• Basados en las propiedades• Permite el acceso indexado a objetos

contenidos• El índice puede ser de cualquier tipo• Ejemplo:object this[string index]

{ get { return Dict.Item(index); } set { Dict.Add(index,value); } }

Delegates y Eventos• Delegate

Similar a los punteros a funciones de C, C++ Fuertemente tipeados delegate void Clicked(Element e, Point p);

• Eventos Modelo de eventos intrínseco al lenguaje (por fin) Declaración y llamada en la clase fuente del

eventoButton.OnClick += MyClickHandler;event Click OnClick;...

OnClick(this,PointerLocation);

Atributos• Similar a los atributos existentes de IDL• Acceso declarativo a funcionalidad• Extensible: atributos “Custom”

[Transaction(TransactionOption.Required)]class MyBusinessComponent { ... }

[PersonFirstName] String Vorname;[PersonFirstName] String PrimarioNome;

Instrucciones

• Muy “C”: control de flujo if (<bool expr>) { ... } else { ... }; switch(<var>) { case <const>: ...; }; while (<bool expr>) { ... }; for (<init>;<bool test>;<modify>) { ... }; Do { ... } while (<bool expr>);

• No muy “C”: lock(<object>){ ... };

Secciones críticas checked {...}; unchecked { ...};

Protección de sobrecarga de enteros

Foreach• Iteración de colecciones y vectores• Pueden ser utilizados en clases propias• Acceso sólo lectura• Ejemplo:

Point[] Points = GetPoints();foreach( Point p in Points ){ MyPen.MoveTo(Point.x,Point.y);}

Sobrecarga de Operadores• Casi todos los operadores pueden ser

sobrecargados• No hay sobrecarga para

AsignacionesOperadores especiales

(sizeof, new, is, typeof)• Ejemplo:

Total operator +(int Amount, Total t){ t.total += a;}

Acceso a los miembros

• Adopción del modelo C++public todos pueden accederprotected sólo miembros de la herenciaprivate sólo miembros de la clase

• Expande el modelo C++:sealed no puede ser utilizado como clase

baseinternal acceso público solamente en el

assembly

Punteros, necesito punteros• C# soporta

Tipo string intrínseco Modelo rico de colecciones Parámetros por referencia

void increment(ref int value, int by)

Parámetros de salidabool add(int a, int b, out int c)

• Eliminación de la mayoría de las causas• Pero, aún disponible: unsafe

unsafe void crypt(byte[] arr) { byte * b = arr; ... }

Manejo de Excepciones• Muy similar a C++, SEH• Se debe leer así:

try ejecutando este código ... ... Si se genera un error, catch lo que puedo llegar a

manejar ... ...finally permítame hacer alguna limpieza manual

• Ejemplo:try { //... código}catch(SomeException e){ //... Control de error}finally{ //...salida “correcta”}

Namespaces

• Forma de agrupar LÓGICAMENTE clasesUn namespace puede contener a clases y

a otros namespaceSimilar al concepto de COMPONENTE COMPero desacoplado de la definición física

• Se declaran con namespace• Referenciados con using

Comentarios XML• Forma consistente de crear

documentación en el código• ///: Todo lo comentado así va a

parar a la metadata• Ejemplo:///<summary>/// Esta función permite calular el monto /// final incluyendo todos los impuestos /// </summary>public decimal GetTotalValue(){}

Sección 3: Las Herramientas

• Framework SDK – herramientas básicasC# CompilerVisual DebuggerNMake

• VisualStudio.NET agregaAmbiente visual Asistentes y plantillasAyuda “Inteligente”

Framework SDK• Contiene al compilador C# (y VB, C++,

JScript)Se ejecuta desde la línea de comando

• Visual Debugger – GuiDebugAcceso completo al runtime y los

metadatos• Herramientas

NMake, Security, Configuration, IL Disassembler, ...

• Gratis para todos

Ejemplos

• “Hola mundo”

namespace Consola{ using System;public class Class1 { public Class1() {}

public static int Main(string[] args) {

Console.WriteLine("Hola, mundo");Console.Read();

return 0; } }}

namespace Consola{ using System;public class Class1 { public Class1() {}

public static int Main(string[] args) {

Console.WriteLine("Hola, mundo");Console.Read();

return 0; } }}

Ejemplos – Comentarios XML

using System;

/// <summary> /// Muestra en pantalla la frase "hola, mundo" /// </summary>

Parte 2Desarrollo de Componentes• Contenido

Introducción a componentes .NETInteroperabilidad con COM+

1. Introducción a Componentes .NET

• Grupo de clases que están típicamente bajo un Namespace común

• Las clases que sean públicas se expondrán hacia fuera del componente

• Todo elemento “público” de cada clase se ve fuera de ella

• No se registra el componente en ningún lado

Ejemplo de Componente .NET en C#

Ejemplo de Componente .NET en C#

namespace Componente1{ using System;

/// <summary> /// MiCOmponente. /// </summary> public class MiComp1 { public MiComp1() { } public System.String MiFunc() /// <summary> /// Devuelve la hora actual. /// </summary> { return(System.DateTime.Now.ToString()); } }}

namespace Componente1{ using System;

/// <summary> /// MiCOmponente. /// </summary> public class MiComp1 { public MiComp1() { } public System.String MiFunc() /// <summary> /// Devuelve la hora actual. /// </summary> { return(System.DateTime.Now.ToString()); } }}

Componentes .NET

• Jerarquía de herencia• Definición de Namespaces• Implementación física• Implementación de interfaces

Jerarquía de Herencia

• Independiente de los Namespaces• Independiente de la

implementación física

Definición de NameSpaces

• Sirve para ordenar las clases (repaso)

• Es una agrupación lógica

Ejemplo de Definición de Namespaces

• MSDNLatam• MSDNLatam.Nucleo• MSDNLatam.Nucleo.Datos• MSDNLatam.Nucleo.Datos.SQL• MSDNLatam.Nucleo.Datos.ADO• MSDNLatam.Aplicacion• MSDNLatam.Aplicacion.Interfaz• MSDNLatam.Aplicacion.Reglas• MSDNLatam.Aplicacion.Datos

Implementación Física

• DLLs• Una DLL puede implementar uno

o más Namespaces• Varias DLLs pueden implementar

un Namespace• Nada que ver con COM• Las DLLs no se bloquean• Puedo tener varias versiones en

una máquina

Implementación Física - Assembly

• Unidad de instalación y versionamiento

• Colección de archivos físicos• Tiene un número de versión con

formato XX.YY.Xx.yy• XX e YY tienen que ser

exactamente los mismos que tenga registrados los clientes

Servicio de Componentes - (Framework .NET)

Provee: Transacciones (DTC, TIP, XA, COMTI) Auto Completion Activación “Just in time” Pooling de objetos Colas Eventos Seguridad basada en roles

Servicio de Componentes

• Basados en COM+• Componentes .NET se “hostean”

dentro de aplicaciones COM+• Tienen la capacidad de auto

registrarse en COM y dentro de una aplicación

¿Cómo seguimos?

• Encontrará varios “ejercicios” de código junto a esta presentación

• Cuando los haya realizado, podrá acceder a la siguiente presentación de C#

• No olvide, los grupos de noticias están allí... Para que compartamos información

Finalmente...

• Muchas gracias

Daniel A. SearaDirector Regional MSDN Buenos Aires - ARGENTINA