Sie sind auf Seite 1von 43

Módulo I

Introducción a .Net
1- Introducción a Microsoft .Net
¿Qué es .NET ?
Microsoft .Net es un conjunto de Tecnologías de software para conectar información, personas,
sistemas y dispositivos. Permite un alto nivel de integración del software mediante el uso de
Servicios Web.
Esta Tecnología se apoya en el .net Framework y en el ambiente de desarrollo multi-lenguaje
Visual Studio.net

¿Qué es .Net Framework?

.NET Framework es un componente integral de Windows que admite la creación y la ejecución de


la siguiente generación de aplicaciones y servicios Web.
.NET Framework proporciona un entorno de ejecución administrado, un desarrollo e
implementación simplificada y la integración con una gran variedad de lenguajes de programación.
El diseño de .NET Framework está enfocado a cumplir los objetivos siguientes:
 Proporcionar un entorno coherente de programación orientada a objetos, en el que el
código de los objetos se pueda almacenar y ejecutar de forma local, ejecutar de forma local
pero distribuida en Internet o ejecutar de forma remota.
 Proporcionar un entorno de ejecución de código que reduzca lo máximo posible la
implementación de software y los conflictos de versiones.
 Ofrecer un entorno de ejecución de código que fomente la ejecución segura del mismo,
incluso del creado por terceras personas desconocidas o que no son de plena confianza.
 Proporcionar un entorno de ejecución de código que elimine los problemas de rendimiento
de los entornos en los que se utilizan secuencias de comandos o intérpretes de comandos.
 Ofrecer al programador una experiencia coherente entre tipos de aplicaciones muy
diferentes, como las basadas en Windows o en el Web.
 Basar toda la comunicación en estándares del sector para asegurar que el código de .NET
Framework se puede integrar con otros tipos de código.

Los componentes clave de .NET Framework son


 Common Language Runtime (CLR)
 La biblioteca de clases .NET Framework, que incluye ADO.NET, ASP.NET, formularios
Windows Forms y Windows Presentation Foundation (WPF).

Common Language Runtime (CLR)

Common Language Runtime administra la memoria, ejecución de subprocesos, ejecución de


código, comprobación de la seguridad del código, compilación y demás servicios del sistema. Estas
características son intrínsecas del código administrado que se ejecuta en Common Language
Runtime.
Con respecto a la seguridad, los componentes administrados reciben grados de confianza
diferentes, en función de una serie de factores entre los que se incluye su origen (como Internet,
red empresarial o equipo local). Esto significa que un componente administrado puede ser capaz o
no de realizar operaciones de acceso a archivos, operaciones de acceso al Registro y otras
funciones delicadas, incluso si se está utilizando en la misma aplicación activa.
El motor en tiempo de ejecución impone seguridad en el acceso al código. Por ejemplo, los
usuarios pueden confiar en que un archivo ejecutable incrustado en una página Web puede
reproducir una animación en la pantalla o entonar una canción, pero no puede tener acceso a sus
datos personales, sistema de archivos o red.
Además, el motor en tiempo de ejecución impone la solidez del código mediante la implementación
de una infraestructura estricta de comprobación de tipos y código denominado CTS (Common Type
System, Sistema de tipos común). CTS garantiza que todo el código administrado es auto
descriptivo. Los diferentes compiladores de lenguajes de Microsoft y de terceros generan código
administrado que se ajusta a CTS. Esto significa que el código administrado puede usar otros tipos
e instancias administrados, al tiempo que se aplica inflexiblemente la fidelidad y seguridad de los
tipos.
Además, el entorno administrado del motor en tiempo de ejecución elimina muchos problemas de
software comunes. Por ejemplo, el motor en tiempo de ejecución controla automáticamente la
disposición de los objetos, administra las referencias a éstos y los libera cuando ya no se utilizan.
Esta administración automática de la memoria soluciona los dos errores más comunes de las
aplicaciones: la pérdida de memoria y las referencias no válidas a la memoria.
Además, el motor en tiempo de ejecución aumenta la productividad del programador. Por ejemplo,
los desarrolladores pueden crear aplicaciones en el lenguaje que prefieran y seguir sacando todo
el provecho del motor en tiempo de ejecución, la biblioteca de clases y los componentes escritos
en otros lenguajes por otros colegas. El proveedor de un compilador puede elegir destinarlo al
motor en tiempo de ejecución. Los compiladores de lenguajes que se destinan a .NET Framework
hacen que las características de .NET Framework estén disponibles para el código existente
escrito en dicho lenguaje, lo que facilita enormemente el proceso de migración de las aplicaciones
existentes.
Aunque el motor en tiempo de ejecución está diseñado para el software del futuro, también es
compatible con el software actual y el software antiguo. La interoperabilidad entre el código
administrado y no administrado permite que los desarrolladores continúen utilizando los
componentes COM y las DLL que necesiten.
El motor en tiempo de ejecución está diseñado para mejorar el rendimiento. Aunque Common
Language Runtime proporciona muchos servicios estándar de motor en tiempo de ejecución, el
código administrado nunca se interpreta. Una característica denominada compilación JIT (Just-In-
Time) permite ejecutar todo el código administrado en el lenguaje de máquina nativo del sistema
en el que se ejecuta. Mientras tanto, el administrador de memoria evita que la memoria se pueda
fragmentar y aumenta la zona de referencia de la memoria para mejorar aún más el rendimiento.
Por último, el motor en tiempo de ejecución se puede alojar en aplicaciones de servidor de gran
rendimiento, como Microsoft® SQL Server™ e Internet Information Services (IIS). Esta
infraestructura permite utilizar código administrado para escribir lógica empresarial, al tiempo que
se disfruta del superior rendimiento de los mejores servidores empresariales del sector que pueda
alojar el motor en tiempo de ejecución.

Biblioteca de Clases
La biblioteca de clases de .NET Framework es una colección de tipos reutilizables que se integran
estrechamente con Common Language Runtime. La biblioteca de clases está orientada a objetos,
lo que proporciona tipos de los que su propio código administrado puede derivar funciones. Esto
ocasiona que los tipos de .NET Framework sean sencillos de utilizar y reduce el tiempo asociado
con el aprendizaje de las nuevas características de .NET Framework. Además, los componentes
de terceros se pueden integrar sin dificultades con las clases de .NET Framework.
Como en cualquier biblioteca de clases orientada a objetos, los tipos de .NET Framework permiten
realizar diversas tareas de programación comunes, como son la administración de cadenas,
recolección de datos, conectividad de bases de datos y acceso a archivos. Además de estas tareas
habituales, la biblioteca de clases incluye tipos adecuados para diversos escenarios de desarrollo
especializados.

Microsoft Intermediate Language (MSIL)


Cuando se compila a código administrado, el compilador convierte el código fuente en Lenguaje
intermedio de Microsoft (MSIL), que es un conjunto de instrucciones independiente de la CPU que
se pueden convertir de forma eficaz en código nativo. MSIL incluye instrucciones para cargar,
almacenar, inicializar y llamar a métodos en los objetos, así como instrucciones para operaciones
lógicas y aritméticas, flujo de control, acceso directo a la memoria, control de excepciones y otras
operaciones. Antes de poder ejecutar código, se debe convertir MSIL al código específico de la
CPU, normalmente mediante un compilador Just-In-Time (JIT). Common Language Runtime
proporciona uno o varios compiladores JIT para cada arquitectura de equipo compatible, por lo que
se puede compilar y ejecutar el mismo conjunto de MSIL en cualquier arquitectura compatible.
Cuando el compilador produce MSIL, también genera metadatos. Los metadatos describen los
tipos que aparecen en el código, incluidas las definiciones de los tipos, las firmas de los miembros
de tipos, los miembros a los que se hace referencia en el código y otros datos que el motor en
tiempo de ejecución utiliza en tiempo de ejecución. El lenguaje intermedio de Microsoft (MSIL) y los
metadatos se incluyen en un archivo ejecutable portable (PE), que se basa y extiende el PE de
Microsoft publicado y el formato Common Object File Format (COFF) utilizado tradicionalmente
para contenido ejecutable. Este formato de archivo, que contiene código MSIL o código nativo así
como metadatos, permite al sistema operativo reconocer imágenes de Common Language
Runtime. La presencia de metadatos junto con el Lenguaje intermedio de Microsoft (MSIL) permite
crear códigos auto descriptivos, con lo cual las bibliotecas de tipos y el Lenguaje de definición de
interfaces (IDL) son innecesarios. El motor en tiempo de ejecución localiza y extrae los metadatos
del archivo cuando son necesarios durante la ejecución.
Los archivos ejecutables están conformados por
• MSIL
• Datos Adicionales (Metadata)
El MSIL es independiente del lenguaje en el que se desarrolla
Compilación JIT (Just in Time)

La compilación JIT convierte MSIL en código nativo a petición en el tiempo de ejecución de la


aplicación, cuando el contenido de un ensamblado se carga y ejecuta. Common Language
Runtime proporciona un compilador JIT para cada arquitectura de CPU compatible, por lo que los
programadores pueden crear un conjunto de ensamblados MSIL que se puede compilar con un
compilador JIT y se puede ejecutar en equipos distintos con diferentes arquitecturas. No obstante,
el código administrado sólo se ejecutará en un determinado sistema operativo si llama a las API
nativas específicas de la plataforma o a una biblioteca de clases específica de la plataforma.
La compilación JIT tiene en cuenta el hecho de que durante la ejecución nunca se llamará a parte
del código. En vez de utilizar tiempo y memoria para convertir todo el MSIL de un archivo
ejecutable portable (PE) a código nativo, convierte el MSIL necesario durante la ejecución y
almacena el código nativo resultante en memoria para que sea accesible en las llamadas
posteriores que se produzcan en el contexto de ese proceso. El cargador crea y asocia un código
auxiliar a cada método de un tipo cuando este tipo se carga y se inicializa. Cuando se llama a un
método por primera vez, el código auxiliar pasa el control al compilador JIT, el cual convierte el
MSIL del método en código nativo y modifica el código auxiliar para señalar directamente al código
nativo generado. Por tanto, las siguientes llamadas al método compilado mediante un compilador
JIT pasan directamente al código nativo.

Ensablados
Los ensamblados son las unidades de creación de las aplicaciones .NET Framework; constituyen
la unidad fundamental de implementación, control de versiones, reutilización, ámbitos de activación
y permisos de seguridad. Un ensamblado es una colección de tipos y recursos creados para
funcionar en conjunto y formar una unidad lógica de funcionalidad. Los ensamblados proporcionan
a Common Language Runtime la información necesaria para conocer las implementaciones de
tipos. Para el motor en tiempo de ejecución, un tipo no existe si no es en el contexto de un
ensamblado.
Espacios de Nombres (Namespace)
Los espacios de nombres organizan jerárquicamente los objetos definidos en un ensamblado. Un
ensamblado puede contener varios espacios de nombres; éstos, a su vez, pueden contener otros
espacios de nombres. Los espacios de nombres evitan las ambigüedades y simplifican las
referencias cuando se utilizan grupos grandes de objetos, como bibliotecas de clases.
Dentro de un espacio de nombres pueden definirse elementos como los módulos, interfaces,
clases, delegados, enumeraciones, estructuras y otros espacios de nombres. Los elementos como
propiedades, procedimientos, variables y eventos no se pueden definir en el nivel de espacio de
nombres sino que deben declararse dentro de los contenedores como módulos, estructuras o
clases.

namespace AplicacionPrueba {
public partial class Form1: Form
{
public Form1()
{
InitializeComponent();
}
}
}

Los nombres completos son referencias de objetos que llevan como prefijo el nombre del espacio
de nombres en el que está definido el objeto. Los nombres completos evitan los conflictos de
nombres porque permiten al compilador determinar qué objeto se utiliza. No obstante, los nombres
pueden llegar a ser largos y complicados. Para solucionar este problema, puede utilizar la
instrucción using para definir un alias, es decir, un nombre abreviado que sustituya al nombre
completo.

namespace EspacioEjemplo
{
namespace EspacioEjemplo2
{
public partial class ClaseEjemplo
{
}
}
}

El nombre completo de la clase del ejemplo anterior sería:


EspacioEjemplo.EspacioEjemplo2.ClaseEjemplo

Definiendo:
using EspacioEjemplo.EspacioEjemplo2;

Podemos entonces utilizar a la clase ClaseEjemplo sin la necesidad de escribir el nombre


completo.

Algunos espacios de nombre del framework son:


 System: Contiene clases fundamentales y clases base que definen tipos de datos de
referencia y de valor de uso frecuente, eventos y controladores de eventos, interfaces,
atributos y excepciones de procesamiento
 System.Collections: Contiene interfaces y clases que definen varias colecciones de
objetos, como listas, colas, matrices de bits, tablas hash y diccionarios.
 System.Configuration: Contiene los tipos que proporcionan el modelo de programación
para controlar los datos de configuración.
 System.Data: Proporciona acceso a las clases que representan la arquitectura de
ADO.NET. ADO.NET le permite generar componentes que administran eficazmente los
datos de varios orígenes de datos
 System.Drawing: Proporciona acceso a funcionalidad de gráficos básica de GDI+.
 System.Globalization: Contiene clases que definen información relativa a la referencia
cultural, incluido el idioma, el país o región, los calendarios utilizados, los modelos de
formato para las fechas, la moneda y los números y el criterio de ordenación de las
cadenas
 System.IO: Contiene tipos que permiten leer y escribir en los archivos y secuencias de
datos, así como tipos que proporcionan compatibilidad básica con los archivos y directorios
 System.Net: Poporciona una interfaz de programación sencilla para muchos de los
protocolos que se utilizan actualmente en las redes.
 System.Secutity: Proporciona la estructura subyacente del sistema de seguridad de
Common Language Runtime, incluidas las clases base de los permisos.
 System.Text: Contiene clases que representan codificaciones de caracteres Unicode y
UTF-8
 System.Web: Contienen tipos que habilitan la comunicación entre el explorador y el
servidor en aplicaciones Web.
 System.Windows: Proporciona varias importantes clases de elementos base de
Aplicaciones Windows y Windows Presentation Foundation (WPF),
 System.XML: Proporciona compatibilidad basada en estándares para procesar XML
2- Microsoft Visual Studio.NET
Introducción
Visual Studio es un conjunto completo de herramientas de desarrollo para la generación de
aplicaciones web ASP.NET, Servicios Web, aplicaciones de escritorio y aplicaciones móviles.
Visual Basic, Visual C# y Visual C++ utilizan todos el mismo entorno de desarrollo integrado (IDE),
que habilita el uso compartido de herramientas y hace más sencilla la creación de soluciones en
varios lenguajes. Asimismo, dichos lenguajes utilizan las funciones de .NET Framework, las cuales
ofrecen acceso a tecnologías clave para simplificar el desarrollo de aplicaciones web ASP y
Servicios Web XML.
Características
 Un solo IDE (Integrated Development Environment)
 Soporte para varios lenguajes .NET (VB.NET, C#, etc.)
 Desarrollo de múltiples tipos de proyectos
 Explorador Web integrado (basado en IE)
 Interface personalizable
 Posee varias utilidades adicionales: Acceso a datos SQL Server, Depurador, Intellisense,
Emuladores para móviles, etc.

Proyectos y Soluciones
Visual Studio dispone de dos contenedores que le ayudan a administrar eficazmente los elementos
necesarios para el desarrollo, como referencias, conexiones de datos, carpetas y archivos. Estos
contenedores se denominan soluciones y proyectos. Asimismo, Visual Studio proporciona carpetas
de soluciones para organizar proyectos relacionados en grupos y, a continuación, llevar a cabo
acciones en esos grupos de proyectos
Los proyectos son contenedores que se ubican en una solución para administrar, compilar y
almacenar ítems. El contenido de los ítems depende del proyecto que se está desarrollando y del
lenguaje. Pueden ser archivos de código, imágenes, gráficos, etc.

Soluciones
Una solución permite a los desarrolladores concentrarse en la tarea de desarrollo y distribución de
los proyectos, en lugar de resolver detalles de administración de los archivos de proyecto y los
componentes.
Una solución de Visual Studio permite:
 Trabajar con varios proyectos en la misma instancia de Visual Studio
 Trabajar con ítems utilizando configuraciones y opciones que se aplican a un conjunto de
proyectos
 Utilizar el Explorador de Soluciones para diseñar y compilar la solución
Visual Studio genera automáticamente una solución cuando se crea un nuevo proyecto. Es posible
agregar nuevos proyectos a una solución a medida que se necesitan.
Para administrar los proyectos y archivos de una solución, el Explorador de Soluciones provee una
vista gráfica de toda la solución. También permite agregar carpetas de ítems que no pertenecen al
proyecto.
La definición de la solución se crea en dos archivos:
 Una definición de solución .sln
 Opciones de usuario de la solución .suo
Una solución puede contener varios proyectos que pueden ser abiertos, cerrados y salvados al
mismo tiempo. Cada proyecto en una solución puede contener varios archivos o ítems. Los tipos
de los ítems contenidos en un proyecto dependen del lenguaje de desarrollo utilizado.
La relación lógica entre una solución y sus componentes no reflejan, necesariamente, la forma en
la que la solución y sus componentes son almacenados en el disco. Si se crea una aplicación que
consta de varios proyectos, es recomendable crear una carpeta de solución donde se almacenen
todos los proyectos.
Plantillas de Proyectos
Visual Studio permite acceder a un número predefinido de plantillas. Al agregar diferentes módulos,
estos agregan plantillas. Las plantillas de proyectos permiten a los desarrolladores concentrarse en
la funcionalidad específica que se desea implementar y es desde el proyecto donde se administra
las diversas tareas referidas a la compilación, guardado y apertura.
Al instalar Visual Studio también se instalan una serie de plantillas de proyectos y elementos
predefinidas. Por ejemplo, las plantillas de la Biblioteca de clases y aplicaciones para Windows de
Visual Basic y Visual C# disponibles en el cuadro de diálogo Nuevo Proyecto son todas ejemplos
de plantillas de proyectos. Las plantillas de elementos instaladas están disponibles en el cuadro de
diálogo Agregar Nuevo Elemento e incluyen los elementos como archivos XML, páginas HTML y
Hojas de estilo.
Estas plantillas proporcionan un punto inicial a los usuarios para empezar a crear nuevos proyectos
o ampliar los proyectos actuales. Las plantillas de proyecto proporcionan los archivos básicos
necesarios para un tipo de proyecto determinado, para incluir referencias a ensamblado estándar y
establecer propiedades de proyecto y opciones de compilador predeterminadas.
Las plantillas de elementos pueden abarcar desde un único archivo vacío con la extensión de
archivo correcta hasta un elemento de varios archivos que contenga elementos como archivos de
código fuente con código auxiliar, archivos de información de diseñador y recursos incrustados.
Además de las plantillas instaladas disponibles en los cuadros de diálogo Nuevo proyecto y
Agregar nuevo elemento, puede crear sus propias plantillas o descargar y usar plantillas creadas
por la comunidad.
Para acceder a la plantilla de proyectos desde el menú: Archivos -> Nuevo Proyecto
Una vez seleccionado el tipo de proyecto, se deben completar campos que determinan ubicación e
identificación del proyecto y de la solución que lo contiene.
 Nombre: Determina el nombre del proyecto.
 Ubicación: Permite seleccionar la ubicación física de la Solución y Proyecto
 Solución: Da la opción de crear una nueva solución contenedora del proyecto o incluirlo en
una solución preexistente
 Nombre de la Solución: Nombre de la solución que se creará junto al proyecto. Por defecto
es el mismo nombre que el proyecto.

Tipos de Proyectos
A continuación se mencionan algunos tipos de proyectos disponibles:
 Aplicaciones de Windows (Windows Forms)
 Aplicaciones de Windows Presentation Foundation (WPF)
 Aplicaciones de consola.
 Aplicaciones de ASP.NET
 Servicios Web.
 Servicios de Windows
 Aplicaciones orientadas a servicios utilizando Windows Communication Foundation (WCF).
 Aplicaciones habilitadas para el flujo de trabajo utilizando Windows Workflow Foundation
(WF).
Presentación del Entorno de Desarrollo (IDE)
El entorno de desarrollo integrado (IDE) es un conjunto de herramientas de desarrollo expuestas a
través de una interfaz de usuario común. Algunas de las herramientas se comparten con otros
lenguajes de Visual Studio, y otras, como el compilador de C#, son exclusivas de Visual C#.
A continuación se detallan las herramientas y ventanas más importantes de Visual C#. Las
ventanas de la mayoría de estas herramientas se pueden abrir desde el menú Ver.
 El Editor de código, para escribir código fuente.
 El compilador de C#, para convertir el código fuente de C# en un programa ejecutable.
 El depurador de Visual Studio, para depurar el programa.
 El Cuadro de herramientas y el Diseñador, para desarrollar rápidamente interfaces de
usuario con el mouse.
 El Explorador de soluciones, para ver y administrar archivos de proyecto y configuraciones.
 El Diseñador de proyectos, para configurar opciones del compilador, rutas de
implementación, recursos, etc.
 La Vista de clases, para navegar por el código fuente según los tipos, no los archivos.
 La ventana Propiedades, para configurar propiedades y eventos en los controles de la
interfaz de usuario.
 El Explorador de objetos, para ver los métodos y clases disponibles en las bibliotecas de
vínculos dinámicos, incluidos los ensamblados de .NET Framework y los objetos COM.
 Esquema de Documentos, proporciona una vista esquemática de los elementos y
secuencias de comandos del documento actual.

Explorador de soluciones
La ventana de la parte superior derecha es el
Explorador de soluciones, que muestra todos los
archivos del proyecto en una vista de árbol jerárquica.
Cuando se utiliza el menú Proyecto para agregar
nuevos archivos al proyecto, se verán reflejados en el
Explorador de soluciones. Además de los archivos, el
Explorador de soluciones también muestra la
configuración del proyecto y las referencias a las
bibliotecas externas que necesita la aplicación.
Para obtener acceso a las páginas de propiedades del
Diseñador de proyectos, haga clic con el botón
secundario del mouse en el nodo Propiedades del
Explorador de soluciones y, a continuación, haga clic
en Abrir. Utilice estas páginas para modificar opciones
de generación, requisitos de seguridad, detalles de
implementación y muchas otras propiedades del
proyecto.

Ventanas del Editor y del Diseñador de Windows Forms

Permite escribir el código y desarrollar las interfaces


de usuario.
El Código Editor, el Diseñador de Windows Forms o
el Diseñador de Windows Presentation Foundation
(WPF) utilizan la ventana principal grande. Puede
cambiar entre la vista Código y la vista Diseño
haciendo clic en Código o Diseñador en el menú
Ver, o utilizando los métodos abreviados de teclado
F7 o MAYÚS + F7. En la vista Diseño, puede
arrastrar controles a la ventana desde el Cuadro de
herramientas, que se puede hacer visible haciendo
clic en la ficha Cuadro de herramientas del margen
izquierdo.

Características del Editor de Código


 Fragmentos de Código (Code Snippets): Los fragmentos de código están listos para usar
y se pueden insertar rápidamente en el código. Para insertar un fragmento seleccionar
botón derecho Insertar Fragmento de Código y elegir el fragmento de la lista proporcionada
 Smart Tags: Habilita las áreas más comunes para aplicarlas dentro del contexto de
trabajo.
 Intellisense: Ofrece una serie de características que facilitan el acceso a referencias del
lenguaje. Permite realizar búsquedas en elementos del lenguaje.
 Refactorización: La refactorización es el proceso que consiste en mejorar el código una
vez escrito cambiando su estructura interna sin modificar su comportamiento externo.
 Seguimiento de Cambios: Cuando el margen izquierdo está pintado de amarillo significa
que la línea fue editada y no ha sido grabada. Si el margen es verde significa que el código
ha sido grabado recientemente.
 Marcadores (Bookmarks): Puede utilizar marcadores para marcar líneas en el código de
forma que pueda volver rápidamente a una ubicación concreta y saltar de sentidos entre
las ubicaciones
Refactorización
 Extraer Métodos: Proporciona una manera sencilla para crear un nuevo método a partir
de un fragmento de código existente
 Cambiar Nombres: Ofrece una manera sencilla de cambiar el nombre a los identificadores
de los símbolos de código, como campos, variables locales, métodos, espacios de
nombres, propiedades y tipos
 Encapsular Campos: Permite crear rápidamente una propiedad a partir de un campo
existente
 Extraer Interfaz: Ofrece una manera sencilla de crear una nueva interfaz con miembros
originados a partir de una clase, estructura o interfaz existente
 Quitar Parámetros: Proporciona una forma sencilla para quitar parámetros de métodos.
Cambia la declaración; en cualquier ubicación en la que se llame al miembro, se quitará el
parámetro para reflejar la nueva declaración
 Reordenar parámetros: Proporciona una manera sencilla de cambiar el orden de los
parámetros para los métodos. Cambia la declaración y, en todas las ubicaciones donde se
llama al miembro, los parámetros se reorganizan para reflejar el nuevo orden

Ventana de Propiedades

Permite establecer las propiedades y enlazar los


eventos para los controles de la interfaz de usuario,
como botones, cuadros de texto, etc.

Cuadro de herramientas
El Cuadro de herramientas muestra los iconos de los
elementos que puede agregar a los proyectos Visual
Studio.
Cada icono del Cuadro de herramientas se puede arrastrar
y colocar en una superficie de vista de diseño; o bien,
copiarse y pegarse en un editor de código dentro del
entorno de desarrollo integrado (IDE) de Visual Studio.
Cualquier acción agrega el código básico para crear una
instancia del elemento del Cuadro de herramientas en el
archivo del proyecto activo.

Referencias de Proyectos
Para poder escribir un código que trabaje con un componente externo, el proyecto debe contener
en primer lugar una referencia al mismo. Puede hacer referencia a los siguientes tipos de
componentes:
 Bibliotecas de clases o ensamblados de .NET Framework
 Componentes COM
 Otros ensamblados o bibliotecas de clases de proyectos de la misma solución
 Servicios Web XML
Use Agregar referencia (Cuadro de diálogo) para agregar referencias a los componentes en
tiempo de diseño. También puede utilizar el cuadro de diálogo Agregar referencia para ir a
ensamblados que no se muestren. No puede agregar referencias de Caché de ensamblados global
(GAC), ya que forma parte estrictamente del entorno de tiempo de ejecución.
Lenguajes de Visual Studio .Net
Visual Basic .Net
Rescrito por completo para trabajar bajo .NET. Ahora totalmente orientado a objetos.
Características:
 Sintaxis similar a Visual Basic de versiones anteriores
 Herencia, Sobrecarga, Constructores y miembros estáticos
 Administración estructurada de excepciones
 Comprobación de Tipos
 Incluye IntelliSense.

C#
Fue un lenguaje creado especialmente para .NET. Totalmente orientado a objetos.
Características:
 Sintaxis similar a C++, Java
 Basada en signos de llaves {}
 Tipos seguros
 Sensible a mayúsculas y minúsculas
 Todo es tratado como objetos
 Las líneas finaliza con un ; (punto y coma)
 Incluye IntelliSense.

Visual C++
Permite la generación de código C++, que no sea manejado por el CRL (.Net Framework)
Características:
 Lenguaje Orientado a Objeto
 Compatible con COM y con integración de código de plataformas.
 Incluye seguridad de tipos.
 Proporciona seguridad por medio de mecanismos de confianza intrínsecos del código.
 Compatible con componentes XML basados en Web y conceptos de metadatos
extensibles.
 Interoperabilidad con otros lenguajes, entre plataformas y con datos heredados.
 Capacidad de control de versiones para facilitar la administración y la implementación.
 Incluye IntelliSense.

Elección del Lenguaje


Prácticamente no hay diferencias de performance entre lenguajes ya que todos compilan en MSIL
La elección del lenguaje dependerá de su experiencia previa con otros lenguajes o decisión
personal.
 Si conoce Java, C++, etc. >> C# (nuestra elección)
 Si conoce VB o VBScript >> VB.NET
3- Introducción a Aplicaciones Windows

Introducción
Windows Forms es una de las dos tecnologías que se utiliza en Visual C# para crear aplicaciones
cliente inteligentes basadas en Windows que se ejecutan en .NET Framework. Windows Forms es
especialmente adecuado para escenarios de desarrollo rápido de aplicaciones donde la prioridad
principal no es una interfaz gráfica de usuario compleja.

Formularios Windows
Un formulario es una superficie visual en la que se muestra información al usuario. Normalmente
las aplicaciones de Windows Forms se generan agregando controles a los formularios y
programando respuestas a las acciones del usuario, como clics del mouse (ratón) o presiones de
teclas. Un control es un elemento de la interfaz de usuario discreto que muestra datos o acepta la
entrada de datos.
Cuando un usuario hace algo en su formulario o en alguno de sus controles, la acción genera un
evento. La aplicación reacciona a estos eventos utilizando código y procesa los eventos cuando
aparecen.
Los formularios Windows Forms contienen diversos controles que puede agregar a los formularios:
controles que muestran cuadros de texto, botones, cuadros desplegables, botones de opción e
incluso páginas Web.
Con el Diseñador de Windows Forms de arrastrar y colocar de Visual Studio, puede crear con
facilidad aplicaciones de Windows Forms. Simplemente seleccione los controles con el cursor y
agréguelos donde desee en el formulario. El diseñador dispone de herramientas como líneas de
cuadrícula y líneas de ajuste para minimizar la molestia de alinear los controles.
Su evento más usado es el evento Load que se ejecuta al cargar el formulario en memoria.
Algunas de sus propiedades son: Text, Enabled, FormBorderStyle, Icon, MaximizeBox,
MinimizeBox, ControlBox, Size, StartPosition y WindowsState.

Controles
Los controles de los formularios Windows Forms son componentes reutilizables que encapsulan
funciones de la interfaz de usuario y se utilizan en aplicaciones Windows cliente. Estos formularios
Windows Forms no sólo proporcionan varios controles listos para usar, sino que también
proporcionan la infraestructura para desarrollar controles personalizados. Los controles existentes
se pueden combinar entre sí o ampliar, también se pueden crear otros controles personalizados.

Control Button

Representa un control de botón de Windows.


Se puede hacer clic en Button utilizando el mouse (ratón), la tecla Enter o la barra espaciadora si el
botón tiene foco.
Es posible cambiar la apariencia del botón.
Su evento más usado es el evento Click. Propiedades que se configuran habitualmente: Text,
Enabled, Font, Image, TextAlign, etc.

Control TextBox

Representa un control de cuadro de texto de Windows.


Con el control TextBox, el usuario puede escribir texto en una aplicación. Este control tiene
funcionalidad adicional que no se encuentra en el control de cuadro de texto de Windows estándar,
como el enmascaramiento de caracteres de contraseña y la edición de múltiples líneas.
Las propiedades que generalmente se configuran son: Text, TextAlign, Enabled, BackColor,
ForeColor, Size, PasswordChar, MultiLine, ReadOnly y MaxLength.

Control Label

Representa una etiqueta estándar de Windows


Los controles Label se utilizan normalmente para proporcionar texto descriptivo de un control. Por
ejemplo, se puede utilizar un objeto Label para agregar texto descriptivo para un control TextBox e
informar al usuario del tipo de datos que se espera tener en el control. Los controles Label se
pueden utilizar también para agregar texto descriptivo a un Form para proporcionar al usuario
información útil. Por ejemplo, se puede agregar Label en la parte superior de Form que proporciona
al usuario instrucciones sobre cómo especificar datos en los controles del formulario. Los controles
Label se pueden utilizar también para mostrar información en tiempo de ejecución sobre el estado
de una aplicación. Por ejemplo, se puede agregar un control Label a un formulario para mostrar el
estado de cada archivo cuando se procesa una lista de archivos.
Las propiedades que generalmente se configuran son: Text, TextAlign, Enabled, BackColor,
ForeColor, AutoSize, etc.

Control ComboBox

Representa un control de cuadro combinado de Windows


Un ComboBox muestra un campo de edición de cuadro de texto combinado con un ListBox y
permite al usuario seleccionar elementos de la lista o escribir texto nuevo. El comportamiento
predeterminado de ComboBox es mostrar un campo de edición con una lista desplegable oculta.
La propiedad DropDownStyle determina el estilo que mostrará el cuadro combinado. La propiedad
Items permite ingresar la lista de valores

Control ListBox
Representa un control de Windows para mostrar una lista de elementos.
El control ListBox permite mostrar una lista de elementos para que el usuario los seleccione
haciendo clic en ellos. Un control ListBox puede proporcionar una o varias selecciones mediante la
propiedad SelectionMode. La propiedad Items permite ingresar la lista de valores

Control RadioButton

Permite al usuario seleccionar una única opción entre un grupo de elecciones cuando se
emparejan con otros controles RadioButton.
Cuando el usuario selecciona un botón de opción dentro de un grupo, los otros se borran
automáticamente. Todos los controles RadioButton de un contenedor determinado, como Form,
constituyen un grupo. Para crear varios grupos en un formulario, coloque cada grupo en su propio
contenedor, como un control GroupBox o Panel.
La propiedad Checked permite saber si la opción esta seleccionada o no.

Control CheckBox

Utilice un control CheckBox para dar al usuario una opción del tipo verdadero/falso o sí/no. El
control CheckBox de casilla de verificación puede mostrar una imagen o texto, o ambos.
La propiedad Checked permite saber si la opción esta seleccionada o no

MessageBox
Muestra un cuadro de mensaje que puede contener texto, botones y símbolos que informan e
instruyen al usuario.

MessageBox.Show("Aca se ingresa el mensaje a mostrar.", "Titulo de la


Ventana", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);

Introducción a Eventos
Un evento es una acción a la que se puede responder o que se puede "controlar" mediante código.
Los eventos se pueden generar mediante una acción del usuario, por ejemplo, haciendo clic con el
mouse (ratón) o presionando una tecla, mediante código del programa o mediante el sistema.
Las aplicaciones controladas por eventos ejecutan código en respuesta a los eventos. Cada
formulario y cada control exponen un conjunto de eventos predefinido que se puede utilizar al
programar. Si se produce uno de estos eventos y hay código en el controlador de eventos
asociado, se invocará este código.
Los tipos de eventos que produce un objeto varían, pero muchos tipos son comunes a la mayoría
de los controles. Por ejemplo, la mayoría de los objetos controlan un evento Click

private void button1_Click(object sender, EventArgs e)


{
MessageBox.Show("Mensaje en el evento click del button");
}
Módulo II

Introducción al lenguaje
C#
1- Introducción a C#
Definición
La estructura de un lenguaje de programación específica los elementos que debe incluir en su
aplicación y define cómo organizar estos elementos para que el compilador entienda su código.
El siguiente código muestra la estructura básica de una aplicación C#:

using System;
class HelloWorld
{
static void Main()
{
Console.WriteLine("Hola Mundo");
}
}

Los elementos y los principios de organización que se muestran en las seis líneas de código
anteriores son brevemente descriptas línea por línea en las siguientes secciones.
 La palabra reservada using: Hace referencia a recursos de la biblioteca del .NET
Framework de Microsoft. Se utiliza para crear un alias para un espacio de nombres o para
importar tipos definidos en otros espacios de nombres.
 El espacio de nombres (namespace) System: System es el espacio de nombres que
provee acceso a toda la funcionalidad de sistema sobre la cual se construye la aplicación.
 Class: Programar en C#, o en cualquier lenguaje orientado a objetos, consiste en escribir
clases, las cuales se usan para crear objetos. En el ejemplo de código, la clase se llama
HelloWorld.
 El método Main: Los métodos describen el comportamiento de una clase. En la tercera
línea, static void Main es un método global que le dice al compilador donde comienza la
ejecución de la aplicación. Toda aplicación C# debe incluir un método Main en una de las
clases. Normalmente el método Main se encuentra en Program.cs

Sentencias
Las sentencias son instrucciones que se completan para realizar acciones en aplicaciones C#. Las
sentencias están separadas entre sí por un punto y coma, para permitir al compilador distinguir
unas de otras.
Algunos lenguajes ubican una sentencia por línea. En C#, usted puede incluir múltiples sentencias
en una línea, o una sentencia en múltiples líneas. Es buena práctica escribir una sentencia por
línea; aunque, por cuestiones de legibilidad, es mejor dividir una sentencia larga en varias líneas.

Llaves
Las llaves {} se usan para identificar el comienzo y el final de bloques de código en una aplicación.
Cada llave que abre debe tener su correspondiente llave que cierra.
En el ejemplo, las llaves que siguen a “class HelloWorld” encierran los ítems que están dentro de la
clase HelloWorld. Las llaves que siguen a “Main” se usan para encerrar las sentencias que están
en el método Main.
Microsoft Visual Studio® .NET provee varias señales para asegurarse que sus llaves estén
correctamente cerradas. Cuando se escribe una llave que cierra, los elementos que encierra
aparecen en negrita por un instante. También, los indicadores que están en el margen izquierdo
del documento muestran el alcance del grupo de sentencias.

Como dar formato a un código en C#


Dar formato es otro elemento del programa, diseñado para ayudar a organizar su código. Se
fomenta el uso de convenciones para mejorar la estructura y la legibilidad de su código.
Ejemplo
El código demuestra cómo aplicar los principios de indentación, sensibilidad a mayúsculas y
minúsculas, espacios en blanco y comentarios:

using System;
class HelloWorld
{
static void Main()
{
Console.WriteLine("Hola Mundo");
//escribe Hola Mundo
}
}

Indentación
La indentación indica que la sentencia se encuentra dentro de un mismo grupo de sentencias.
Las sentencias que están en un mismo grupo o bloque deberían estar indentadas al mismo nivel.
Esta es una convención importante que mejora la legibilidad de su código. Aunque la indentación
no es obligatoria, o requerida por el compilador, es una práctica recomendada.

Sensibilidad a mayúsculas y minúsculas


C# es sensible a mayúsculas y minúsculas, lo que significa que el compilador distingue entre
caracteres en mayúscula y minúscula. Por ejemplo, las palabras “programa”, “Programa” y
“PROGRAMA” se consideran diferentes en una aplicación, no se puede sustituir una por otras.

Espacio en blanco
El espacio en blanco es ignorado por el compilador. Por eso, se pueden usar espacios en blanco
para mejorar la legibilidad y el formato del código. La única excepción es que el compilador no
ignora los espacios entre comillas.

Comentarios
Se pueden incluir comentarios de una sola línea en una aplicación insertando una doble barra (//)
seguida del comentario.
Alternativamente, si su comentario es muy largo y ocupa múltiples líneas, puede usar barra
asterisco (/*) para indicar el comienzo de un comentario y asterisco barra (*/) para indicar el final de
su comentario.
El siguiente ejemplo es un comentario de múltiples líneas que incluye un asterisco al principio de
cada línea. Estos asteriscos son opcionales y puede incluirlos para hacer que el comentario sea
más fácil de identificar.

/*
* Comentario de múltiples líneas
* Este ejemplo muestra cómo dar formato a un
* comentario de múltiples líneas en C#
*/
/* uso alternativo de este comentario */
Diseño
Usted puede ubicar la llave que abre al final de la línea en que comienza el grupo, o puede ubicar
la llave en la siguiente línea del método o clase, tal como se muestra en el siguiente ejemplo:

using System;
class HelloWorld
{
static void Main()
{
Console.WriteLine("Hello, World");
}
}

Ambos diseños son aceptados y correctos. Sin embargo, es importante ser consistente.
Su organización debería elegir qué diseño usar.
2- Tipo de Datos Predefinidos
Introducción
Cada vez que su aplicación deba almacenar datos temporalmente para usarlos durante la
ejecución, se almacenan en variables. Puede pensar una variable como si fuera una caja de
almacenamiento. Las cajas vienen en diferentes tamaños y formas, llamados tipos, éstos proveen
almacenamiento para varios tipos de datos. Por ejemplo, el tipo de variable usado para almacenar
un nombre es diferente al que se usa para guardar la edad de la persona.

Tipos de Datos
Los tipos predefinidos son aquellos provistos por el lenguaje C# y .NET Framework. La siguiente
tabla lista los tipos predefinidos y describe los datos que están diseñados para almacenar.

Tipo predefinido Definición #Bytes


Byte Enteros de 0 a 255 1
Sbyte Enteros de -128 a 127 1
Short (Int16) Enteros de -32768 y 32767 2
Ushort (UInt16) Enteros de 0 y 65535 2
Int (Int32) Enteros de -2147483648 y 2147483647 4
Uint (UInt32) Enteros de 0 y 4294967295 4
Long (Int64) Enteros de -9223372036854775808 y 9223372036854775807 8
Ulong (UInt64) Enteros de 0 y 18446744073709551615 8
Bool Booleano: true o false 1
Float Punto flotante de precisión simple 4
Double Punto flotante de precisión doble 8
Decimal Decimal con 28 dígitos (punto fijo) 12
Object Tipo Base para todos otros tipos N/A
Char Carácter Unicode simple entre 0 y 65535 2
String Secuencia ilimitada de caracteres Unicode N/A
DateTime Para fechas y hora 8

Almacenado Datos
Suponga que está escribiendo una aplicación que permite al usuario comprar ítems por Internet
con tarjeta de crédito. Su aplicación debe administrar varias piezas de información: el nombre de la
persona, el monto de compra, el número de la tarjeta de crédito y la fecha de expiración de la
tarjeta. Para representar esta información, su aplicación usa distintos tipos.

Eligiendo un tipo
Deje que el dato que está representando determine la elección del tipo. Por ejemplo, si algo puede
ser solo verdadero o falso, use bool. Decimal es una buena elección para dinero o cualquier valor
con decimales. Es preferible no usar los tipos de datos de punto flotante para no generar
problemas con los redondeos. Cuando se trabaje con enteros, un int es la elección típica, a menos
que haya una razón para elegir otro tipo.
Además de los tipos predefinidos, usted puede definir sus propios tipos para contener cualquier
dato que elija.

Variables
Una variable es un espacio de almacenamiento para un tipo en particular. Por ejemplo, si su
aplicación debe procesar un valor de dinero, requiere una variable que soporte ese valor.
Antes de usar una variable, debe declararla. Al declarar una variable, usted está reservando
espacio de almacenamiento para esa variable en memoria. Después de declarar una variable,
debe inicializarla asignándole un valor.
La sintaxis para declarar una variable es el tipo de declaración seguido del nombre de la variable.
Por ejemplo:

int miEntero;
bool archivoFueCerrado;

Nombres de variables
La siguiente lista identifica algunas buenas prácticas para nombrar variables:

 Asignar nombres significativos.


 Usar la notación camello. En la notación camello la primera letra del identificador es
minúscula y la primer letra de cada palabra siguiente en el identificador es mayúscula,
como nuevaCuentaBancaria.
 No usar palabras reservadas de C#.
 Aunque C# sea sensible a mayúsculas y minúsculas, no crear variables que difieran solo
en ello.

Inicializando variables
Para inicializar una variable, se le asigna un valor. Para asignar un valor, usar el operador (=)
seguido del valor, y luego un punto y coma, como se muestra en el siguiente ejemplo:

int miVariable;
miVariable = 1;

Se puede combinar estos pasos, por ejemplo:

int miVariable = 1;

Más ejemplos de declaraciones de variables se muestran en el siguiente código:

int x = 25;
int y = 50;
bool estaAbierto = false;
sbyte b = -55;

Asignando valores literales


Cuando se asigna 25 a x en el código anterior, el compilador asigna el valor literal 25 en la variable
x. No obstante, la siguiente asignación genera un error de compilación:

decimal bankBalance = 3433.20;


// ERROR!

Este código causa un error porque el compilador de C# asume que cualquier número literal con un
punto decimal es un double (tipo de dato double), a menos que se especifique que es un decimal.
Se especifica el tipo de literal agregando el sufijo, como se muestra en el siguiente ejemplo:

decimal balance= 3433.20M;

Los sufijos de literales que se pueden usar se muestran en la siguiente tabla. Se permiten
minúsculas:
Categoría Sufijo Descripción

Entero U Sin signo


L Long
UL Long sin signo
Número Real F Float
D Double
M Decimal
L Long

Tipo Caracteres
Un carácter (tipo char) se especifica entre comillas simples:

char miInicial = 'a';

Caracteres de Escape
Algunos caracteres no se pueden especificar usando comillas simples, por ejemplo, un carácter de
nueva línea o un beep o una comilla simple. Para representar estos caracteres, se debe usar
caracteres de escape, los cuales se muestran en la siguiente tabla:

Secuencia de escape Nombre del character


\' Comilla simple
\" Comilla doble
\\ Barra invertida
\0 Null
\a Alerta
\b Retroceso
\f Avance
\n Línea Nueva
\t Tabulación Horizontal
\v Tabulación Vertical

Por ejemplo, se puede especificar una comilla simple como sigue:

char comillaSimple = '\'';

Examinando variables en Visual Studio .NET (Depuración)


El entorno de desarrollo de Visual Studio .NET provee herramientas útiles para examinar el valor
de las variables mientras su aplicación esta ejecutándose.
Para examinar el valor de una variable, ubicar un breakpoint en la variable que usted desea
examinar, corra la aplicación en modo Debug, y luego usar la herramienta de Debug para ver los
valores.

1. Ubicar un breakpoint haciendo click en el margen izquierdo de la ventana de código. El


breakpoint queda indicado como un punto rojo. Ud. puede ubicar un breakpoint haciendo
click en New Breakpoint en el menú Debug.
2. Ejecutar su aplicación en modo Debug

3. Su aplicación se ejecutará hasta que encuentre un breakpoint. Cuando la aplicación encuentra


un breakpoint, se pausa, y el entorno de desarrollo marca la línea próxima a ejecutarse
4. Usar el menú Debug para ver el valor de la variable o simplemente posicione el cursor sobre la
misma. Para abrir las ventanas de Debug, en el menú Debug, seleccionar Windows, y luego
hacer click en Autos o en Locals

La ventana Autos muestra las variables usadas en la sentencia actual y la próxima. Por
defecto, la ventana Autos se visualiza abajo del entorno de desarrollo cuando se encuentra en
modo debug.

La ventana Locals muestra las variables locales.

5. Para pasar al próximo breakpoint, cuando esté listo de continuar ejecutando su programa,
puede presionar F5 o hacer click en Continue en el menú Debug. O puede ejecutar el
programa paso a paso presionando F11 o F10, o haciendo click en Step Over del del menú
Debug
6. Para pasar al próximo breakpoint, cuando usted esté listo

Tipo de Dato string


La cadena (string) es uno de los tipos de datos más comúnmente usado. Una variable string
contiene una secuencia de caracteres alfanuméricos que son usados como entrada para cálculos o
búsquedas.
Nota: No hay límite en el número de caracteres que conforman una cadena.

Una cadena se declara como cualquier otra variable, se asigna el tipo (string) y se le da un
nombre. Se puede asignar un valor literal a una variable string encerrando el valor entre comillas
dobles.

string saludo = "Hola Mundo";


También se pueden incluir caracteres de escape en un string. Por ejemplo, si Ud. desea crear un
string escrito en dos líneas, puede incluir un retorno de línea en el string usando el carácter \n,
como se muestra en el siguiente ejemplo:

string saludo = "Hola \nMundo";

Este código produce la siguiente salida:

Hola
Mundo

Si Ud. quiere insertar una tabulación, use el carácter de escape \t, como se muestra en el siguiente
ejemplo:

string saludo = "Hola \tMundo"; //produce Hola Mundo


string ruta = "c:\\My Documents\\sample.txt";
// produces c:\My Documents\sample.txt

Usando cadenas literales


Una cadena literal es un string que es interpretado por el compilador exactamente como esté
escrito, lo que significa que aún cuando la cadena ocupe múltiples líneas o incluya caracteres de
escape, éstos no son interpretados por el compilador y son incluidos en la salida. La única
excepción son las comillas dobles, que deben ser interpretadas por el compilador para que pueda
reconocer dónde termina la cadena.
Una cadena literal se indica con el símbolo (@) seguido de la cadena entre comillas dobles. Por
ejemplo:

string saludo = @"Hola";


string saludo = @"Hola\tMundo"; // produces "Hola\tMundo"
string ruta = @"c:\My Documents\sample.txt";
// produce c:\My Documents\sample.txt

Si se desea usar comillas dobles dentro de la cadena literal, se debe agregar otro par de comillas
dobles. Por ejemplo, para producir “Hola” se usa es siguiente código:

string s = @"""Hola"""; // Nota: tres comillas dobles de cada lado

El código anterior produce la salida:


"Hola"

Entendiendo Unicode
El .NET Framework usa Unicode UTF-16 (Unicode Transformation Format, 16-bit encoding form)
para representar caracteres. C# también codifica caracteres usando el estándar de Unicode. El
estándar de Unicode es el mecanismo universal actual de codificación que se usa para representar
texto en el procesamiento de computación. El estándar anterior era ASCII. El estándar Unicode
representa un avance significativo sobre ASCII porque Unicode asigna un valor numérico único,
llamado punto de código, y un nombre a cada carácter que se usa en todos los lenguajes del
mundo. ASCII define solo 128 caracteres, lo que significaba que algunos lenguajes no se podían
representar correctamente en una aplicación.
Por ejemplo, el carácter “A” se representa por el código de punto “U+0041” y el nombre “LATIN
CAPITAL LETTER A”. Los valores están disponibles para más de 65.000 caracteres, y hay espacio
para soportar hasta un millón más. Para más información, ver el estándar Unicode en
www.unicode.org.
Constantes
Una constante es una variable cuyo valor no puede modificarse. Las constantes son útiles en
situaciones donde el valor que se usa tiene un significado y es fijo, como el número pi, el radio de
la Tierra, o el porcentaje de un impuesto.
Las constantes hacen su código mas legible, mantenible y robusto. Por ejemplo, si asigna el valor
6378 a la constante llamada radioTierra, cuando use este valor en cálculos es inmediatamente
aparente qué valor se está haciendo referencia, y no es posible asignarle un valor distinto por otra
persona.
Una constante se declara usando la palabra clave y el tipo. Se debe asignar un valor a la constante
en el momento de la declaración.

Ejemplos:
const int radioDeLaTierra = 6378; //km
const long distanciaAlSol = 149600000; //km
const double velocidadOrbital = 29.79D; //km seg

Enumeraciones
Una enumeración especifica un grupo de constantes. Una enumeración es un tipo definido por
usuario, lo que significa que usted puede crear una enumeración, declarar variables de ese tipo y
asignar valores a esas variables. El propósito de una enumeración es representar valores
constantes.
Además de proveer todas las ventajas de las constantes, las enumeraciones:
 Hacen que su código sea más fácil de mantener asegurando que a sus variables se
asignen solamente valores anticipados.
 Permiten que usted asigne nombres fácilmente identificables a sus valores, haciendo que
su código sea más fácil de leer.
 Hacen que su código sea más fácil de escribir, porque se asignan valores de la
enumeración., ya que muestra una lista de posibles valores que usted puede usar.
 Permiten que especifique un set de valores constantes y defina un tipo que acepte valores
solamente de ese set.
Usted crea una enumeración usando la palabra clave enum, asignando un nombre, y luego
listando los valores que su enumeración puede tomar.
Es recomendable que use la notación Pascal, para el tipo y para cada miembro de la enumeración.
En la notación Pascal, la primera letra de cada palabra del identificador se escribe con mayúscula,
como ListaDePlanetas.

Ejemplo

enum Planeta
{
Mercurio,
Venus,
Tierra,
Marte
}

El código anterior crea un nuevo tipo, Planeta. Ud. puede crear variables de este tipo y asignarles
un valor de la lista de la enumeración.
Cuando usted quiera hacer referencia a un miembro en una enumeración, use el nombre de la
enumeración, un punto y el nombre del miembro.

Por ejemplo: el siguiente código declara una variable planetaInterno de tipo Planeta, y le asigna un
valor:
Planeta planetaInterno = Planeta.Venus;

Usted puede declarar una enumeración en una clase o en un espacio de nombre, pero no dentro
de un método.
Si los miembros de su enumeración deben tener un valor específico, usted puede asignar a
miembros de una enumeración esos valores en la declaración. El siguiente código asigna el valor
del radio de cada planeta interno:

enum Planetas
{
Mercurio = 2437,
Venus = 6095,
Tierra = 6378
}

Usted puede usar cualquier entero como tipo base que se usará para la enumeración
especificando el tipo luego del nombre de la enumeración. Por ejemplo:

enum Planetas : uint


{
Mercurio = 2437,
Venus = 6095,
Tierra = 6378
}

Conversión de Datos
Cuando se diseña aplicaciones, a menudo se debe convertir un dato de un tipo a otro. La
conversión puede ser necesaria cuando se realizan operaciones con dos tipos distintos.
Por ejemplo, cuando se ingresa un valor numérico en una página web, el tipo de dato puede ser
texto. Un programador debe entonces convertir ese texto a un tipo numérico.
Otra razón para convertir es evitar el desbordamiento (overflow). Si usted trata de sumar dos bytes,
el compilador retorna un int. Retorna un int porque el byte puede mantener solo 8 bits, hasta un
valor de 255, entonces el resultado de sumar dos bytes podría resultar fácilmente en un número
mayor de 255 (int=byte+byte). Por esta razón, el valor resultante de la suma es convertido por el
compilador y devuelto como un int.
Hay dos tipos de conversiones en el .NET Framework: implícitas y explícitas.
 Una conversión implícita es automáticamente realizada por la CLR (Common Language
Runtime) sobre operaciones que garantizan no truncar información.
 En una conversión explícita se solicita explícitamente al compilador a realizar una
conversión, que de otra forma podría perder información o produciría un error.

Conversiones implícitas
La siguiente tabla muestra los tipos de conversión implícita que soporta C#:

De A
Sbyte short, int, long, float, double, decimal
Byte short, ushort, int, uint, long, ulong, float, double, decimal
Short int, long, float, double, decimal
Ushort int, uint, long, ulong, float, double, decimal
Int long, float, double, decimal
Uint long, ulong, float, double, decimal
long, ulong float, double, decimal
Float Double
Char ushort, int, uint, long, ulong, float, double, decimal

Notar que las conversiones implícitas pueden ser realizadas desde un tipo pequeño a otro más
grande o desde un entero sin signo a un entero con signo.

Ejemplo
El siguiente ejemplo muestra una conversión implícita:

int x = 123456; // int es un entero de 4 bytes


long y = x; // conversión implícita a un long

Conversión explícita
La sintaxis para realizar una conversión explícita se muestra en el siguiente código:

tipo variable1 = (tipo) variable2;

El tipo entre paréntesis indica al compilador que el valor de la derecha (variable2) es convertido al
tipo que está especificado entre paréntesis.

Ejemplo
El siguiente ejemplo muestra una conversión explícita:

int x = 500;
short z = (short) x;
// conversión explícita a un short, z contiene el valor 500

Es importante recordar que las conversiones explícitas pueden resultar en pérdida de datos o
generar errores si los tipos de datos o los valores asignados no son compatibles. Por ejemplo, en
el siguiente código, un decimal es explícitamente convertido a un int:

decimal d = 1234.56M;
int x = (int) d;

El resultado de esta conversión es que a x se le asigna el valor 1234.

Otras conversiones
La biblioteca de clases de .NET Framework provee un soporte para tipos de conversiones en la
clase System.Convert.

int x = 500;
short z = System.Convert.ToInt16(x);

Expresiones y Operadores
El propósito de escribir una expresión es realizar una acción y retornar un valor. Por ejemplo, usted
puede escribir una expresión para hacer un cálculo matemático, asignar un valor o comparar dos
valores:
Una expresión es una secuencia de operadores y operandos. Un operador es un símbolo
determinador que indica la acción que usted quiere que ocurra en su expresión. Un operando es el
valor sobre el cual la operación es realizada. Un operador está específicamente diseñado para
producir un nuevo valor en base al operando.
Tipos de operadores:
 Aritméticos: Usados para realizar cálculos aritméticos como la suma.
 De Comparación: Usados para comparar si un valor es mayor, mayor o igual, menor,
menor o igual a otro.
 Lógicos: Usados para definir situaciones and/or.
 Condicional: Usado para realizar una sentencia if.
 De Asignación: Usado para asignar un valor a una variable.

La mayoría de los operadores solamente se usan con datos numéricos, pero otros también se usan
para cadenas.
La siguiente tabla lista todos los operadores que se pueden usar en C#:

Tipo de Operador
Operador
Primario (x), x.y, f(x), a[x], x++, x--, new, typeof, sizeof, checked,unchecked
Unario +, -, !, ~, ++x, --x, (T)x
Matemático + , - ,*, /, %
Desplazamiento << , >>
Comparación < , > , <= , >= , is
Igualdad ==
Lógico &,|,^
Condicional && , || , ?
Asignación = , *= , /= , %= , += , -= , <<=, >>= , &= , ^= , |=

Nota
Es importante notar la diferencia entre el operador de asignación y el operador de igualdad. Notar
que “es igual a” se representa con dos signos igual (==) porque un solo signo (=) se usa para
asignar un valor.

int x = 10;
// asignación
int y = 20;
int z = x + y;
// (z == 30) z es igual a 30?

C# hace posible usar una sintaxis concisa para manipular datos en forma compleja. La siguiente
tabla muestra cómo realizar operaciones en una forma más corta.

Forma corta Expresión idéntica


x++ , ++x x=x+1
x--, --x x=x-1
x += y x=x+y
x -= y x=x–y
x *= y x=x*y
x /= y x=x/y
x %= y x=x%y
x >>= y x = x >> y
x <<= y x = x << y
x &= y x=x&y
x |= y x=x|y
x ^= y x=x^y
Incremento y decremento
Los operadores de incremento y decremento pueden usarse antes o después del operando. Por
ejemplo, x++ y ++x son ambos equivalentes a x=x+1. Sin embargo, cuando estos operadores se
usan en expresiones, x++ y ++x se comportan de manera diferente. ++x incrementa el valor de x
antes de que la expresión sea evaluada. Es decir, se incrementa x y luego el nuevo valor de x se
usa en la expresión.

Ejemplo 1

int x = 5;
(++x == 6) // verdadero o falso?
La respuesta es “verdadero”.

x++ incrementa el valor de x después de que la expresión se ejecuta, entonces, la expresión se


evalúa usando el valor original de x.

Ejemplo 2

x = 5
(x++ == 6) // // verdadero o falso?
La respuesta es “falso”.

Ejemplo 3

int x = 10
int y = x++; // y es igual a 10
int z = x + y; // z es igual a 21

Una ayuda para mejorar la legibilidad de su código, es ubicar el incremento y el decremento en


sentencias separadas.

Negación lógica
El operador de negación lógica es un signo de admiración (!). Se usa para revertir el valor de un
tipo bool.

Si bool b es falso, !b es verdadero


Si bool b es verdadero, !b es falso

Por ejemplo:
bool estaAbierto = true;
bool estaCerrado = !estaAbierto;

Operadores matemáticos
Además de los operadores obvios + - * y /, existe el operador de resto (%) que devuelve el resto de
una división. Por ejemplo:

int x = 20 % 7;
// x == 6

Operadores lógicos
C# provee operadores lógicos, como se muestra en la siguiente tabla:

Tipo de Operador Operador Descripción


Lógico
Condicional && x && y retorna verdadero si ambos son verdaderos y se
evalúa solo si x es verdadero.
|| x || y retorna verdadero si alguno de ellos o ambos son
verdaderos y se evalúa solo si x es falso.
Booleano & x & y retorna verdadero si ambos son verdaderos
| x | retorna verdadero si alguno de ellos o ambos son
verdaderos.
^ x ^ y retorna verdadero si alguno de ellos es verdadero y
falso si ambos son verdaderos o ambos falsos.

Los desarrolladores a menudo usan los operadores lógicos condicionales. Estos operadores
siguen las mismas reglas que los operadores booleanos pero tienen la característica que solo son
evaluados si es necesario.

Con qué usar operadores


Se puede usar también el operador de suma y de igualdad con cadenas. El signo más concatena
cadenas y el de igualdad las compara.

string a = "semi";
string b = "circulo";
string c = a + b;
string d = "cuadrado";

La cadena c tiene el valor semicírculo.

bool mismaForma = ( "circulo" == "cuadrado" );


mismaForma = ( b == d );

El booleano mismaForma es falso en ambas sentencias.

Precedencia de Operadores
Los desarrolladores a menudo crean expresiones que realizan más de un cálculo, comparación o
una combinación de ambos. En estas situaciones, la precedencia de los operadores controla el
orden en el cual se evalúan las expresiones. Si se desea que las operaciones se realicen en un
orden diferente, se debe indicar al compilador el orden usando paréntesis.
Por ejemplo, el operador mas (+) tiene una precedencia más baja que el operador de multiplicación
(*), entonces a + b * c significa multiplicar b * c y luego sumar a.

Paréntesis: Usar paréntesis para mostrar el orden de evaluación y hacer la evaluación de su


expresión más legible. Los paréntesis extra son eliminados por el compilador y no hacen su
aplicación más lenta.
Por ejemplo, en la siguiente expresión, el compilador multiplica b por c y luego suma d.

a=b*c+d

Usando paréntesis, en la siguiente expresión, el compilador primero evalúa lo que está entre
paréntesis, (c + d), y luego multiplica por b.

a = b * (c + d)

Los siguientes ejemplos demuestran la precedencia de los operadores y el uso de paréntesis para
controlar el orden de la evaluación.
10 + 20 / 5 (es reultado es 14)
(10 + 20) / 5 (es reultado es 6)
10 + ( 20 / 5 ) (es reultado es 14)
((10 + 20) * 5) + 2 (es reultado es 152)

Asociatividad
Todos los operadores binarios, aquellos que necesitan dos operandos, son asociativos a izquierda,
es decir, que la expresión se evalúa de izquierda a derecha, excepto por los operadores de
asignación. Los operadores de asignación y condicionales son asociativos a derecha.

Por ejemplo:
x + y + z se evalúa como (x + y) + z
x = y = z se evalúa como x = (y = z)

Matrices (Arrays)
Una matriz es una estructura de datos que contiene varias variables del mismo tipo. Una matriz se
declara con un tipo:

type[] arrayName;

Ejemplos:
int[] array1 = new int [5];
int[] array2 = new int [] { 1, 3, 5, 7, 9 };
int[] array3 = { 1, 2, 3, 4, 5, 6 };

Una matriz tiene las propiedades siguientes:


 Una matriz puede ser unidimensional, multidimensional o escalonada
 El valor predeterminado de los elementos numéricos de matriz se establece en cero y el de
los elementos de referencia se establece en null.
 Una matriz escalonada es una matriz de matrices y por consiguiente sus elementos son
tipos de referencia y se inicializan en null.
 Las matrices inicializan su índice en cero: una matriz con n elementos se indiza desde 0
hasta n-1.
 Los elementos de una matriz pueden ser de cualquier tipo, incluido el tipo matriz.
 Los tipos de matriz son tipos de referencia derivados del tipo base abstracto Array. Puesto
que este tipo implementa IEnumerable e IEnumerable<T>, puede utilizar la iteración
foreach en todas las matrices de C#.

int[] numbers = { 4, 5, 6, 1, 2, 3, -2, -1, 0 };


foreach (int i in numbers)
{
System.Console.Write("{0} ", i);
}
3- Sentencias C#
Sentencia IF
Una sentencia condicional permite controlar el flujo de la aplicación seleccionando las sentencias
que serán ejecutadas, basándose en el valor de una expresión booleana.
Hay tres variaciones de una sentencia condicional:
 If
 if / else
 if / else if.

Cuando una expresión que se está evaluando es verdadera, el código siguiente a la sentencia if
será ejecutada.

La sintaxis para la sentencia if / else es la siguiente:


if (expresión booleana)
sentencia1
else
sentencia2
La sentencia1 se ejecuta si la expresión booleana es verdadera. Si es falsa se ejecuta la
sentencia2.

Por ejemplo:
if ( ventas > 10000 ) {
bono += 100;
}
else {
bono = 0;
}

Se puede usar else if para evaluar varias condiciones dentro de la misma sentencia

if (ventas > 10000)


{
bono += 100;
}
else if (ventas > 5000)
{
bono += 30;
}
else
{
bono = 0;
}

Se puede evaluar más de una expresión en una sentencia. Por ejemplo, las expresiones que
siguen a la sentencia if se evalúan como verdaderas si ventas es mayor a 10000 pero menor a
500000:

if ( (ventas > 10000) && (ventas < 50000) ) {


// ventas esta entre 10001 y 49999 inclusive
}

Usando el ternario
El operator ternario (?) es una forma corta de la sentencia if...else. Es útil cuando se desea realizar
una comparación y retornar un valor booleano.
Por ejemplo, la siguiente expresión asigna el valor 0 al bono si el valor de ventas es menor a
10000:

bono = (ventas > 10000) ? 100 : 0;

Sentencia switch
Una sentencia switch selecciona el código a ejecutar basándose en el valor de una expresión. Las
sentencias switch son útiles para seleccionar una rama de ejecución de una lista de opciones
mutualmente exclusivas. Usar sentencias switch hacen su aplicación más eficiente y su código más
legible que si se usa sentencias if anidadas.
Una sentencia switch toma la forma de una expresión seguida de bloques de opciones, indicando
los casos. Cuando la expresión en el argumento equivale al valor de uno de los casos, el código
que sigue a ese caso es ejecutado. Cuando no equivale a ningún caso, se ejecuta el caso por
defecto (default), si es que hay uno definido.
Se debe incluir una sentencia break al final de cada bloque de opción para que no se produzca un
error de compilación (siempre que exista código en ese caso).

Ejemplo:
La siguiente sentencia switch asume que x es un entero.
switch (x)
{
case 0:
// x is 0
break;
case 1:
// x is 1
break;
case 2:
// x is 2
break;
}

La secuencia de ejecución es la siguiente:


1. Se evalúa x.
2. Si una de las constantes en el caso es igual al valor de la expresión del switch, se pasa el
control a la sentencia seguida del caso.
3. Si ninguno de los casos equivale al valor de la expresión, el control se pasa al final de la
sentencia switch, o al caso por defecto, el cual es descripto en la siguiente sección.
Si x tiene el valor 1, las sentencias del caso 1 se ejecutan.

Default: Si lo desea se puede definir una condición para aquellos valores que no son manejados en
ninguno de los casos.
El siguiente ejemplo muestra cómo definir una condición por defecto.

switch (x)
{
case 0:
// x is 0
break;
case 1:
// x is 1
break;
case 2:
// x is 2
break;
default:
// x no es 0, 1 o 2
break;
}

El caso por defecto maneja cualquier valor que no esté contemplado en los casos.

Sentencias iterativas
C# provee varios mecanismos de iteración, lo cual le permite ejecutar un bloque de código
repetidas veces hasta que se cumple una cierta condición. En todos los casos una sentencia se
ejecuta hasta que una expresión booleana se hace verdadera.

Sentencia for
Una iteración for se usa para ejecutar un código un cierto número de veces. Se usa un for cuando
se conoce por adelantado el número de veces que quiere repetir la ejecución de un código. Por
ejemplo, suponga que desea saber el monto de una cuenta bancaria de ahorros luego de 10 años,
y desea saber el total que tendrá al finalizar cada año. Una forma es escribir la sentencia cuenta *=
interés 10 veces, o usar una iteración.

La sintaxis para declarar una iteración for es:

for (inicializador; condición; iterador) {


sentencias;
}

Ejemplo

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


Console.WriteLine( "i = {0}",i );
}
for ( int j = 100; j > 0; j -= 10 ) {
Console.WriteLine( "j = {0}", j );
}

Esta estructura es muy flexible. Por ejemplo, el contador de iteraciones puede ser incrementado o
decrementado en cada iteración. En este caso, es necesario conocer la cantidad de iteraciones.

Ejemplo de un for que decrementa

for ( int i = 10; i > 0; i-- ) {


// sentencias;
}

Ejemplo de un for que incrementa de 10 en 10

for ( int i = 0; i <= 100; i = i+10 ) {


// sentencias;
}

Las sentencias inicialización e iteración pueden contener más una variable local, como se muestra
en el siguiente ejemplo:

for ( int i = 0, j = 100; i < 100; i++, j-- ) {


Console.WriteLine("{0}, {1}", i, j );
}

Este ejemplo produce la siguiente salida:


0, 100
1, 99
2, 98
.
.
.
99, 1

Sentencia while
Tal como en el caso del for, la iteración while evalúa la condición antes de ejecutar el código. Se
usa cuando no se conoce exactamente cuántas veces debe iterar.

La sintaxis para declarar una iteración while es la siguiente:

while (condición) {
// sentencias;
}

Ejemplo

while ( leerArchivo == true ) {


// sentencias;
}

Usando la palabra reservada continue


Se puede usar la palabra reservada continue, para iniciar la próxima iteración sin ejecutar el resto
de las sentencias del while. El siguiente ejemplo lee comandos de un archivo.

while ( leerArchivo == true ) {


string comando = LeerProximaLinea();
if ( comando == "Comentar" ) {
continue; //comienza una nueva iteración
}
if ( comando == "Setear" ) {
// sentencias para hacer algo
}
}

Cuando el comando es un comentario, no hay necesidad de procesar el resto de la línea, entonces


se usa la palabra reservada continue para comenzar una nueva iteración.

Usando la palabra reservada break


También se puede salir de una iteración. Cuando se encuentra la palabra reservada break, se
termina la ejecución y continúa la siguiente sentencia al while.

while ( leerArchivo == true ) {


string comando = LeerProximaLinea();
if ( comando == "Exit" ) {
break; //sale del while
}
if ( comando == "Setear" ) {
// sentencias para hacer algo
}
}

Sentencia do
En una iteración do, se ejecutan las sentencias del do, se evalúa la condición y si es verdadera, se
ejecutan las sentencias nuevamente. Es útil cuando se desea ejecutar el código del cliclo al menos
una vez.

La sintaxis de una iteración do es la siguiente:

do {
// sentencias que se ejecutan al menos 1 vez
} while (expresión booleana);

Nota: El punto y coma después de la sentencia do es obligatorio.

Ejemplo
En el siguiente ejemplo, se usa un do para escribir números del 1 al 10 en una columna: int i = 1;

do {
Console.WriteLine("{0}", i++);
} while ( i <= 10)

Control de Excepciones
C# incorpora mecanismos para el tratamiento de excepciones, que pueden producirse durante la
ejecución de un programa.
La instrucción try-catch consta de un bloque try seguido de una o más cláusulas catch, las cuales
especifican controladores para diferentes excepciones. Cuando se produce una excepción,
Common Language Runtime (CLR) busca la instrucción catch que controla esta excepción. Si el
método que se está ejecutando actualmente no contiene un bloque catch de este tipo, CLR
examina el método que llamó al método actual y así sucesivamente en la pila de llamadas. Si no se
encuentra ningún bloque catch, CLR muestra al usuario un mensaje de excepción no controlada y
detiene la ejecución del programa.
El bloque try contiene el código protegido que puede causar la excepción. Este bloque se ejecuta
hasta que se produce una excepción o hasta completarse satisfactoriamente.
El bloque finally es útil para limpiar cualquier recurso asignado en el bloque try, así como también
para ejecutar cualquier código que deba ejecutarse incluso si hay una excepción. El control se
transfiere siempre al bloque finally independientemente de cómo finalice el bloque try.

private void Prueba() {


Cursor = Cursors.WaitCursor;
try
{
int a = 10;
int b = 0;
int c = a / b;
}
catch (DivideByZeroException ex)
{
MessageBox.Show(ex.Message);
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
finally
{
Cursor = Cursors.Default;
}
}

Los objetos de excepción que describen un error se crean y, a continuación, se producen con la
palabra clave throw.

private decimal Dividir(decimal x, decimal y)


{
if (y == 0)
throw new Exception("No es posible dividir por cero");

return x / y;
}

Das könnte Ihnen auch gefallen