Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Tabla de Contenido
La plataforma .NET ofrece numerosos servicios a las aplicaciones que para ella se
escriban, como son un recolección de basura, independencia de la plataforma, total
integración entre lenguajes (por ejemplo, es posible escribir una clase en C# que derive
de otra escrita en Visual Basic.NET que a su vez derive de otra escrita en Cobol)
C# combina los mejores elementos de múltiples lenguajes de amplia difusión como C++,
Java, Visual Basic o Delphi. De hecho, su creador Anders Heljsberg fue también el
creador de muchos otros lenguajes y entornos como Turbo Pascal, Delphi o Visual J++.
La idea principal detrás del lenguaje es combinar la potencia de lenguajes como C++
con la sencillez de lenguajes como Visual Basic, y que además la migración a este
lenguaje por los programadores de C/C++/Java sea lo más inmediata posible.
Microsoft lanza esta nueva tecnología como respuesta a tecnología Java de Sun. El
Framework .NET tiene grandes similitudes con la plataforma Java, por eso todos
aquellos que estén familiarizados con Java comprenderán en seguida el funcionamiento
de .NET.
ASP.NET es la parte del .NET Framework dedicada al desarrollo Web. A través del
servidor Web (IIS) nuestras aplicaciones ASP.NET se ejecutarán bajo el CLR y
podremos usar el conjunto de clases del .NET Framework para desarrollarlas,
obteniendo así una versatilidad y una potencia nunca antes conseguida en las
aplicaciones ASP.
También son destacables los servicios Web, que nos permitirán comunicarnos a través
de Internet entre diferentes computadoras, incluso entre distintos sistemas. Así como
.NET Remoting que nos permite tener objetos en máquinas remotas e invocarlos desde
otras máquinas. Y Windows Forms, parte del .NET Framework que permite crear
aplicaciones en el más clásico de los sentidos.
Existen varias versiones del .NET Framework: 1.0, 1.1, 2.0, 3.0 y 3.5. En estas dos
ultimas versiones, el CLR es el mismo de la versión 2.0, pero con el agregado de 3
componentes más, como puede apreciarse en la figura 1.2:
Figura 1.2
Por cierto que con Windows Vista ha salido ya el .Net Framework 3.0.
Existe un proyecto que está tratando de llevar esta arquitectura al mundo de Linux. Este
proyecto se llama Mono, y puedes encontrar información en la siguiente liga electrónica:
http://www.mono-project.com/Main_Page
El CLR permite que excepciones lanzadas desde código para .NET escrito en un
cierto lenguaje se puedan capturar en código escrito usando otro lenguaje, e
incluye mecanismos de depuración que pueden saltar desde código escrito para
.NET en un determinado lenguaje a código escrito en cualquier otro. Por
ejemplo, se puede recorrer la pila de llamadas de una excepción aunque ésta
incluya métodos definidos en otros módulos usando otros lenguajes.
Los compiladores que generan código para la plataforma .NET no crean código
máquina para las diferentes plataformas hardware. Generan código escrito en un
lenguaje intermedio denominado Microsoft Intermediate Language. Cuando decimos
que un compilador crea código para la plataforma .NET, estamos diciendo que crea
código MSIL, que es el único lenguaje que es capaz de interpretar el CLR.
Las principales ventajas del código MSIL es que facilita la ejecución multiplataforma y la
integración entre lenguajes al ser independiente de la CPU. Sin embargo, dado que las
CPU's no pueden ejecutar directamente código MSIL, es necesario convertirlo antes al
código nativo de la CPU en la que vayamos a ejecutar nuestra aplicación. De esto se
encarga un componente del CLR, denominado Compilador JIT (Just in Time). Este
compilador convierte dinámicamente el código MSIL a código nativo según sea
necesario. Se distribuye en tres versiones principales: compilador JIT normal,
económico y prejitter. El compilador JIT normal, es el que se suele usar por defecto.
Éste sólo compila el código MSIL a código nativo a medida que va siendo necesario, ya
que así se ahorra tiempo y memoria, al evitarse tener que compilar innecesariamente el
código que nunca se va a ejecutar. El compilador JIT económico funciona de forma
similar al compilador normal, solo que no realiza ninguna optimización de código al
compilar, sino que traduce cada instrucción MSIL por su equivalente en el código
Tras conocer casi al completo la arquitectura .NET, ya sabemos que las aplicaciones
primero se convierten al lenguaje MSIL para posteriormente convertirlas al lenguaje
nativo de la arquitectura hardware donde se ejecuten. Podemos pensar que la actuación
del compilador JIT puede disminuir el rendimiento de la aplicación compilada, debido a
que debe invertirse un cuantum de tiempo adicional para volver a compilar la aplicación
dependiendo de la arquitectura del procesador. Esto es cierto, pero comparándolo con
arquitecturas similares, como Java, resulta ser más eficiente ya que cada código no es
interpretado y compilado al lenguaje nativo cada vez que se ejecuta, sino que es
traducido una única vez; cuando se llama al método al que pertenece. Además, el
hecho de que el compilador JIT tenga acceso en tiempo de ejecución a la máquina
donde se ejecuta la aplicación hace que posea mucha más información de ella, por lo
que puede realizar más optimizaciones que las que podría realizar cualquier compilador
tradicional.
Para manipular IL, Microsoft nos provee de dos herramientas gratuitas, incluidas en el
.NET Framework SDK: el lldasm, que nos permite desensamblar un ejecutable .NET, y
ver su código IL, y el llasm, que dado un texto IL lo compila a ejecutable .NET.
Notablemente, .NET en su librería tiene funciones para la emisión de código IL, desde
nuestros programas, lo cual nos permite generar ejecutables "en el momento",
capacidad que puede ser aprovechada creativamente.
Sus principales creadores son Scott Wiltamuth y Anders Heljslberg, éste último conocido
por haber sido el diseñador del lenguaje Turbo Pascal y la herramienta de diseño rápido
Delphi. En la plataforma .NET es posible escribir código en muchos otros lenguajes,
Las batallas legales entre Microsoft y Sun Microsystems acerca de Java durante casi
cuatro años llevaron a Microsoft a plantearse la necesidad de un nuevo lenguaje de
programación. Mientras que Sun Microsystems sugería a Microsoft que asumiera los
términos de licencia del lenguaje Java, Microsoft desarrollaba su propia versión de Java,
J++, basada en la tecnología licenciada de Sun. La última versión de J++, la 7.0, no fue
tal, y Microsoft decidió lanzar C#, trabajando conjuntamente con el ECMA, para
estandarizar el lenguaje al mismo tiempo. Microsoft originalmente desarrollo un lenguaje
llamado “COOL’, que representaba únicamente una mejora del lenguaje C++. El
resultado significó la respuesta de Microsoft a la tecnología Java de Sun Microsystems.
Sencillez de uso C#
Elimina muchos elementos añadidos por otros lenguajes y que facilitan su uso y
compresión, como por ejemplo ficheros de cabecera, o ficheros fuentes IDL Interface
Definition Language, en inglés, lenguaje de definición de interfaces. Es por ello que se
dice que C# es autocontenido. Además, no se incorporan al lenguaje elementos poco
útiles, como por ejemplo macros, herencia múltiple u operadores diferentes al operador
Modernidad
Al ser C# un lenguaje de última generación, incorpora elementos que se ha demostrado
a lo largo del tiempo que son muy útiles para el programador, como tipos decimales o
booleanos, un tipo básico string, así como una instrucción que permita recorrer
colecciones con facilidad (instrucción foreach). Estos elementos hay que simularlos en
otros lenguajes como C++ o Java.
Orientado a objetos
C# como lenguaje de última generación, y de propósito general, es orientado a objetos.
C# no permite la inclusión de funciones ni variables globales que no estén incluidos en
una definición de tipos, por lo que la orientación a objetos es mas pura y clara que en
otros lenguajes como C++. Además, C# soporta todas las características del paradigma
de la programación orientada a objetos, como son la encapsulación, la herencia y el
polimorfismo.
Orientado a componentes
La propia sintaxis de C# incluye elementos propios del diseño de componentes que
otros lenguajes tienen que simular mediante construcciones más o menos complejas.
Es decir, la sintaxis de C# permite definir cómodamente propiedades (similares a
campos de acceso controlado), eventos (asociación controlada de funciones de
respuesta a notificaciones) o atributos (información sobre un tipo o sus miembros).
Recolección de basura
Todo lenguaje incluido en la plataforma .NET tiene a su disposición el recolector de
basura del CLR. Esto implica que no es necesario incluir instrucciones de destrucción
de objetos en el lenguaje.
Seguridad de tipos
C# incluye mecanismos de control de acceso a tipos de datos, lo que garantiza que no
se produzcan errores difíciles de detectar como un acceso a memoria de ningún objeto,
por ejemplo. Para ello, el lenguaje provee de una serie de normas de sintaxis, como por
ejemplo no realizar conversiones entre tipos que no sean compatibles. Además, no se
pueden usar variables no inicializadas previamente, y en el acceso a tablas se hace una
comprobación de rangos para que no se excedan ninguno de los índices de la misma.
Se puede controlar así mismo los desbordamientos en operaciones aritméticas,
produciéndose excepciones cuando se produzcan.
Unificación de tipos
En C# todos los tipos derivan de una superclase común llamada System.Object, por lo
que automáticamente heredarían todos los miembros definidos en esta clase. Es decir,
son objetos. A diferencia de Java, en C# esta característica también se aplica para los
tipos básicos.
Eficiente
En principio, en C# todo el código incluye numerosas restricciones para asegurar su
seguridad y no permite el uso de punteros. Sin embargo, y a diferencia de Java, en C#
es posible saltarse dichas restricciones manipulando objetos a través de punteros. Para
ello basta marcar regiones de código como inseguras (modificador unsafe) y podrán
usarse en ellas punteros de forma similar a cómo se hace en C++, lo que puede resultar
vital para situaciones donde se necesite una eficiencia y velocidad procesamiento muy
grandes.
Compatible
Para facilitar la migración de programadores, C# no sólo mantiene una sintaxis muy
similar a C, C++ o Java que permite incluir directamente en código escrito en C#
fragmentos de código escrito en estos lenguajes, sino que el CLR también ofrece, a
través de los llamados Platform Invocation Services (PInvoke), la posibilidad de acceder
a código nativo escrito como funciones sueltas no orientadas a objetos tales como las
DLLs de la API Win32. Nótese que la capacidad de usar punteros en código inseguro
permite que se pueda acceder con facilidad a este tipo de funciones, ya que éstas
muchas veces esperan recibir o devuelven punteros.
Introducción al entorno de
desarrollo integrado Visual C# 2008
Express Edition
”dâ° xá âÇ xáÑ•Ü|àâ vâÄà|ätwÉR Xá xÄ Öâx Ñâxwx Å|ÜtÜ Ätá vÉátá wxáwx Åâv{Éá ÑâÇàÉá wx
ä|áàtA ;[xÇÜç YA TÅ|xÄ<
f| {tç âÇ áxvÜxàÉ wxÄ uâxÇ °å|àÉ Üxá|wx xÇ Ät vtÑtv|wtw ÑtÜt tÑÜxv|tÜ xÄ ÑâÇàÉ wx ä|áàt wxÄ
ÑÜ™}|ÅÉ ç äxÜ Ätá vÉátá wxáwx xáx ÑâÇàÉ wx ä|áàt tá• vÉÅÉ wxÄ ÑÜÉÑ|ÉA
;[xÇÜç YÉÜw<
Tabla de Contenido
2.1 Compilación de un programa C# en la consola ............................................................................... 2
2.2 Compilación de un programa C# en Microsoft Visual C# 2008 Express Edition .......... 6
2.3 Elementos esenciales de un programa en C# ............................................................................... 12
2.3.1 Espacios de nombres ............................................................................................................................. 13
2.3.2 La función Main ( ) .................................................................................................................................. 14
2.4 Descripción del entorno de desarrollo IDE .................................................................................... 15
2.5 El explorador de soluciones ................................................................................................................... 18
2.6 Ventana de Propiedades .......................................................................................................................... 21
2.7 Lista de errores............................................................................................................................................. 21
2.8 Personalizando nuestro entorno de trabajo de Visual C# ..................................................... 23
2.9 Característica IntelliSense ...................................................................................................................... 25
2.10 Configuración de botones y menús ................................................................................................. 26
2.11 Ventana Inmediato y Depuración..................................................................................................... 28
2.12 La ayuda de Visual C#............................................................................................................................. 32
Para compilar un programa desde la consola utilizamos el siguiente comando csc que
significa C Sharp Compiler, pero si observamos en la siguiente pantalla nos
muestra un error que nos indica que no reconoce el comando.
Podemos ver las variables de entorno de la variable path y debemos de agregar la ruta
C:\Windows\Microsoft.NET\Framework\v3.5 que es donde se encuentra el archivo
csc.exe, si observamos en la siguiente pantalla no aparece dicha ruta.
Vamos a realizar el mismo programa pero ahora con ayuda de Visual C# 2008 Express
Edition, para tal efecto abrimos
Nuestro primer programa es programa muy sencillo que se limita a imprimir dos líneas
de texto en pantalla. Nada útil desde un punto de vista práctico, pero suficiente para que
el principiante se familiarice con las herramientas de su entorno de trabajo y asimile
cuáles son los conceptos más elementales del lenguaje. Como puede ver, los
comentarios se pueden escribir al estilo del lenguaje de programación en C, con el
símbolo //, o bien delimitados por los símbolos /* y */. Este programa se encuentra
en un espacio de nombres llamado proyecto1 que sirve como una especie de carpeta
en la que agrupar clases de objetos relacionadas entre sí. Por lo tanto, para hacer
referencia a una clase es frecuente que no baste con su nombre y que sea necesario
indicar también el espacio de nombres en el que se encuentra. Por ejemplo, en nuestro
caso tenemos una única clase llamada Class1 en el espacio de nombres proyecto1,
por lo que su nombre completo sería proyecto1.Class1.
Por convenio, todo programa tiene una clase llamada Program con un método llamado
Main que es en el que comienza la ejecución. Fíjese en que Main debe escribirse con
la primera letra en mayúscula pues, la norma dice que todos los miembros públicos de
una clase deben empezar por una letra mayúscula. Fíjese también en que se trata de
un método con el modificador static, lo que significa que no es necesario tener ningún
objeto de la clase Program para poder llamarlo; esto es especialmente útil al comienzo
de la ejecución de un programa puesto que en ese momento aún no se ha creado
ningún objeto.
System.Console.WriteLine("UACM ");
System.IO; contiene clases que pueden leer y escribir flujos de datos y archivos de
disco. Las clases contenidas en este espacio de nombre pueden gestionar la entrada y
salida de archivos sincrónica y asincrónica.
Definida en la línea 6 no devuelve nada (por eso la palabra clave void) y no toma
argumentos (de ahí los paréntesis vacíos). El compilador C#. de hecho, acepta
cualquiera de las cuatro posibles construcciones de la función Main () :
static void Main(string[ ] args)
Comentar el código nos permite añadir notas a los archivos fuente de C#. Estas notas
pueden ayudarnos a documentar el diseño y el funcionamiento de la aplicación.
Podemos colocar comentarios en cualquier parte del código fuente de C# donde inicia
un bloque importante, clase, ciclo, para explicar el objetivo de cierto código.
Los comentarios de una línea empiezan con dos barras inclinadas y afecta el resto de la
línea, en ocasiones cuando probamos nuestro código y queremos borrar o eliminar una
línea temporalmente para observar que pasaría si eliminamos dicha línea, utilizamos al
inicio de la línea dicho comentario para no borrarla, posteriormente podemos regresar al
código original al eliminar nuevamente las dos barras inclinadas. En nuestro código en
la línea 3 existe este tipo de comentario.
{ //Este es un comentario
/* Este es un comentario
de más de una línea podemos
escribir cuantas líneas deseamos
hasta concluir con asterisco diagonal */
La línea 10
System.Console.ReadLine();
Nos sirve para detener la pantalla de ejecución en MSDOS, si no la incluimos no
veríamos la ejecución de nuestro proyecto.
En resumen podemos ver esta imagen que ilustra de manera general las ventanas
principales de entorno de Visual C#
2 http://msdn.microsoft.com/es-mx/library/ms173077(VS.80).aspx
La ventana de propiedades es muy útil cuando trabajamos con Windows Forms por
ejemplo en botones, etiquetas, podemos cambiar el color, el texto, tamaño, tipo de letra,
etc, propiedad que se analizará con detalles en el capítulo 4, por lo pronto vemos en la
siguiente pantalla las propiedades del archivo program.cs.
En nuestro ejemplo al final de una línea omitimos el ; (punto y coma) para ver que
sucede
Una vez que entramos se muestra la siguiente pantalla, tenemos diferentes opciones
podemos configurar nuestro entorno, proyectos y soluciones, editor de textos, etc.
En la parte superior del entorno de Visual C# aparecen varias barras de botones que
facilitan el acceso rápido a las opciones más habituales, la barra de botones cuentan en
el extremo izquierdo con una asa, al posicionarnos nos muestra una flecha tipo estrella
que apunta hacia los cuatro lados (abajo, arriba, izquierda, derecha) si damos clic con
botón principal de Mouse, podemos tomar la barra completa y llevarlas a cualquier otro
punto, disponiéndolas horizontal o verticalmente en los márgenes del entorno o bien
dejándolas como ventanas flotantes.
Cuando agregamos una barra nos muestra completamente todos los botones de la
barra, pero de acuerdo a nuestras necesidades podremos personalizar las diferentes
barras de botones quitando o agregando solo un elemento, para tal efecto damos clic
en la opción de Personalizar… y en la opción comandos, seleccionamos el elemento
que queremos incluir y lo arrastramos a la barra donde queremos que aparezca sin
necesidad de incluir toda una barra, de manera similar si damos clic en la un botón que
queramos eliminar lo arrastramos a esta ventana y se eliminara.
3 http://msdn.microsoft.com/es-es/library/f177hahy.aspx
Posteriormente seleccionamos la línea 12 y damos clic con el botón izquierdo del Mouse
y nos aparece el siguiente submenú, y seleccionamos la opción Punto de
2.29 Capítulo 2: Introducción al entorno de desarrollo integrado Visual C#
2008 Express Edition
Interrupción → Insertar punto de interrupción. Repetimos el mismo
procedimiento para la línea 15. En la línea 12 realmente realizamos el procedimiento
tres veces pues existen tres expresiones en dicha línea.
Si deseamos eliminar los puntos de interrupción solo damos un clic sobre el texto o en el círculo
rojo y se eliminan.
En este parte podemos utilizar también la Ventana Inmediato y preguntar por el valor de las
variables de nuestro programa e incluso realizar operaciones con ella:
Otra ventana importante es la venta de Variables locales, en ella nos muestra el nombre
de la variable, su valor y el tipo.
Todas las opciones relativas a la ayuda las encontraremos en el menú del mismo
nombre. Desde él podremos acceder a la tabla de contenidos, buscar una cierta palabra
clave, establecer filtros, etc.
Esta pantalla nos muestra los temas que se encuentra en discusión en la sesión de
Foros:
2.34 Capítulo 2: Introducción al entorno de desarrollo integrado Visual C#
2008 Express Edition
Si elegimos la opción Informar de un error del menú Ayuda,
Tabla de Contenido
Métodos .........................................................................................................................................................................................3.2
Métodos Estáticos.....................................................................................................................................................................3.4
Sobrecarga de Métodos .........................................................................................................................................................3.5
Paso de variables por valor y por referencia. ......................................................................................................... 3.11
Arreglos ...................................................................................................................................................................................... 3.13
Arreglos Unidimensionales .............................................................................................................................................. 3.14
Clase System.Array ............................................................................................................................................................... 3.15
Foreach........................................................................................................................................................................................ 3.27
Arreglos bidimensionales.................................................................................................................................................. 3.29
Estructuras ..................................................................................................................................... 3.34
La ejecución de las instrucciones de un método puede depender del valor de unas variables
especiales denominadas parámetros del método, de manera que en función del valor que se
dé a estas variables en cada llamada la ejecución del método se pueda realizar de una u otra
forma y podrá producir uno u otro valor de retorno.
Para definir un método hay que indicar tanto cuáles son las instrucciones que forman su cuerpo
como cuál es el nombre que se le dará, cuál es el tipo de objeto que puede devolver y cuáles
son los parámetros que puede tomar. Esto se indica definiéndolo así:
<tipoRetorno><nombreMétodo>(<parámetros>)
{
<cuerpo>
}
En <tipoRetorno> se indica cuál es el tipo de dato del objeto que el método devuelve, y si no
devuelve ninguno se ha de escribir void en su lugar.
Como nombre del método se puede poner en <nombreMétodo> cualquier identificador válido.
Aunque es posible escribir métodos que no tomen parámetros, si un método los toma se ha de
indicar en <parámetros> cuál es el nombre y tipo de cada uno, separándolos con comas si son
más de uno y siguiendo la sintaxis que más adelante se explica.
{
Program prg=new Program();//Crea un objeto de la clase Program
prg.MisDatos();//Llama al método
// new Program().MisDatos();
}
Métodos Estáticos
Una tercera versión del mismo programa es declarar el método MisDatos() estático con la
palabra clave static de esta manera al llamar al método simplemente lo realizamos con el
nombre de la clase punto el nombre del método es decir con la instrucción
Program.MisDatos();
Program.MisDatos();
Los métodos static, son aquellos que se pueden ejecutar sin necesidad de instanciar la clase
donde está escrito. Un método estático es un método que existe en una clase como un todo
más que en una instancia específica de la clase. Por lo tanto, el hecho de que el método Main
tenga que ser static no es un capricho, ya que, de lo contrario, el CLR no sería capaz de
encontrarlo pues antes de que se ejecute la aplicación, lógicamente, no puede haber instancias
de ninguna de las clases que la componen.
En cualquiera de las tres versiones del programa el resultado de la ejecución sería el siguiente:
#region permite especificar un bloque de código que se puede expandir o contraer cuando se
utiliza la característica de esquematización del editor de código de Visual C#.
Por ejemplo:
#region
return 3 * val;
return 3 * val;
return 3 * val;
#endregion
Utilizando el compilador observamos como en la línea 9 aparece en color gris #region aquí
estan ocultos los tres métodos Triple que corresponde a métodos sobrecargados para
terminar una región utilizamos #endregion . De forma predeterminada, todo el texto se
muestra en el editor de código, pero podemos hacer que no se vea parte del mismo. El editor
de código nos permite seleccionar una región de código y contraerla, de forma que aparezca
debajo de un signo más (+).
Si deseamos expandir y ver los métodos damos clic sobre el cuadro con el simbolo + y
obsevaremos lo siguiente:
Esta característica de esquematización es muy útil para organizar nuestro código y visualizar el
alcance de cierta sección de código, también en programas muy extensos esta propiedad es de
gran ayuda.
Ejecución:
Cuando una variable es pasada por valor, el método recibe una copia del valor de la variable.
Por lo tanto, los cambios realizados a esa variable dentro del contexto de la función, no afecta a
la variable original.
Cuando es pasada por referencia, el método recibe la referencia a la variable original. Por tanto
los cambios realizados a esa variable dentro del contexto de la función, afecta a la variable
original.
Eso depende de lo que queramos hacer. Cada una tiene sus ventajas y desventajas. Al pasar
una variable por valor, estás asegurando que dicho valor no va a ser modificado por
equivocación. Por otro lado, al pasar una variable por referencia, aunque la variable puede ser
modificada por equivocación, ahorramos tiempo de ejecución y memoria, puesto que no es
necesario crear una copia de la variable.
Todas las variables que pasamos a un método declarado normalmente, son por valor. Para
pasar argumentos por referencia es necesario utilizar las palabras reservada ref o out, tanto al
declarar el método como al invocarlo. Cuando pasamos un argumento usando ref, es necesario
que dicha variable esté ya inicializada, de lo contrario obtendremos una excepción o error. Si la
variable que deseamos pasar por referencia no está inicializada, es nesesario usar out, de tal
manera que podamos inicializar la variable dentro del contexto del método.
En el programa Valor1.cs observamos que al llamar una variable y modificarla el valor dentro
del método cambia a 25, posteriormente el valor después de llamar al método original no
cambia permanece en 5.
Arreglos
Los tipos de datos que hemos usado hasta ahora, en ejemplos previos, tan solo
pueden contener un dato, ya sea simple: un número, un carácter o una cadena.
Cuando se tiene la necesidad de almacenar múltiples valores, del mismo tipo y con
información relacionada, se usan los arreglos.
Un arreglo es una lista de variables del mismo tipo que comparten el nombre,
distinguiéndose unas de otras por un índice, l o s arreglos también son conocidos como
vectores para arreglos de una dimensión o matrices para arreglos de dos dimensiones.
Una variable de tipo arreglo no aloja el valor sino una referencia al bloque de memoria
donde éste se encuentra.
Los arreglos, al igual que el resto de las variables se identifican con un nombre. Al
emplear ese nombre, se hace referencia a la estructura de datos como un todo, es
decir, con todos sus elementos. El lenguaje interpreta dicho nombre como un puntero.
Para acceder a sus elementos se utiliza el nombre del arreglo en forma indexada, es
decir, combinado con índices, para acceder a un elemento en particular de un arreglo
Arreglos Unidimensionales
Los arreglos, al igual que las demás variables deben declararse antes de poder
utilizarlas, los arreglos de una sola dimensión reciben también el nombre de vectores.
• El <tipo-base> puede ser cualquiera de los tipos básicos del lenguaje, o incluso
algunos complejos como estructuras.
• Los corchetes [] son obligatorios y denotan que el identificador descrito, del tipo
de variable indicado, es un arreglo.
Esta última declaración implícitamente dimensiona el arreglo para almacenar los N elementos
descritos, por lo que no se requiere dimensionarlo aparte.
Es decir:
• Con los valores indicados entre llaves { } se inicializarán los elementos del arreglo.
donde M<N, y N debe ser una expresión constante, como por ejemplo 10. Es factible hacer una
declaración donde M>N, en cuyo caso, el real dimensionamiento del arreglo se regirá por M.
Algunos ejemplos:
A continuación se lista una tabla con los principales operaciones que se pueden realizar a un
arreglo las cuales pertenece a la clase System.Array
Clase System.Array
Método o Descripción
Propiedad
FindAll() Encuentra todos los elementos del arreglo que cumplen con
la condición.
En la línea 11 se declara el arreglo b de diez elementos, pero no se inicializa, por tal razón se
inicializan automáticamente con cero.
En la línea 14 utilizamos un ciclo for para ir sumando cada uno de los elementos del arreglo y
almacenar la suma en la variable total, suma 1+2+3…. + 10 que da como resultado 55. En
esta línea utilizamos a.Length que es el tamaño del arreglo a que es 10, el ciclo for empieza
en 0 y termina en 9.
Para usar números aleatorios en C# podemos utilizar la clase Random del namespace System,
de la siguiente manera línea 20: Random objeto = new Random(); El método Next de la
clase Random genera y devuelve un número aleatorio entre 0 y la constante Int32.MaxValue
(2,147,483,647). El número es generado utilizando una semilla (seed) que por default es la
hora del sistema. En la línea 23 {b[i]=objeto.Next(1,99); asignamos a cada elemento del
arreglo un valor generado aleatoriamente entre 1 y 99, por lo que en cada ejecución los
elementos serán diferentes, el ciclo for de la línea 22 también nos sirve para imprimir cada
elemento del arreglo b.
Ejecución:
Ejecución:
La instrucción foreach repite un grupo de instrucciones incluidas en el bucle o ciclo para cada
elemento de una matriz o de un objeto collection. La instrucción foreach se utiliza para
recorrer en iteración una colección de elementos y obtener la información deseada, pero no se
debe utilizar para cambiar el contenido de la colección, ya que se pueden producir efectos
secundarios imprevisibles. Las instrucciones del bucle o ciclo siguen ejecutándose para cada
elemento de la matriz o la colección. Cuando ya se han recorrido todos los elementos de la
colección, el control se transfiere a la siguiente instrucción fuera del bloque foreach.
En cualquier punto dentro del bloque foreach, puede salir del ciclo utilizando la palabra clave
break o pasando directamente la iteración siguiente del ciclo mediante la palabra clave
continue. También se puede salir de un bucle foreach mediante las instrucciones goto,
return, throw.
Un arreglo bidimensional tiene dos dimensiones, en C# las dimensiones se manejan por medio
de un par de corchetes, dentro de los que se escriben, separados por comas, los valores de las
dos dimensiones.
Donde:
tipo indica el tipo correspondiente a los elementos del arreglo ,
identificador es el nombre del arreglo, y
el par de corchetes y la coma, [ , ], representan las dimensiones del arreglo y encierra dos
números enteros, cuyo producto corresponde al número de elementos del arreglo.
Ejemplos:
int [ , ] matriz ;
double [ , ] posicion ;
Chasis [ , ] automovil; // Chasis es una clase.
Observe que, en la declaración, el espacio entre los corchetes está vacío. Esto se debe a que,
durante dicha operación, no se reserva espacio en la memoria.
Donde:
dim1 y dim2 son valores enteros que representan las dimensiones del arreglo.
El tamaño del arreglo es el resultado de multiplicar los valores de las dimensiones y representa
el número de elementos del arreglo.
Ejemplos:
matriz = new int [2, 3] ; // Se crea el arreglo matriz, con 6 elementos de tipo entero
posicion = new double[4,2] ; // Se crea el arreglo posicion, con 8 elementos tipo doble
automovil= new Chasis[5,2] ; // Se crea el arreglo , Chasis con 10 objetos de la clase
automóvil.
Inicialización.
Un arreglo es un objeto que, cuando es creado por el compilador, se le asignan
automáticamente valores iniciales predeterminados a cada uno de sus elementos, de acuerdo a
los siguientes criterios:
Si el tipo del arreglo es numérico, a sus elementos se les asigna el valor cero.
Si el tipo del arreglo es char, a sus elementos se les asigna el valor '\u0000'.
Si el tipo del arreglo es bool, a sus elementos se les asigna el valor false.
Si el tipo del arreglo es una clase, a sus elementos se les asigna el valor null.
Acceso.
Se puede acceder a los valores de los elementos de un arreglo bidimensional a través del
nombre del arreglo y dos subíndices. Los subíndices deben escribirse entre corchetes y
representa la posición del elemento en el arreglo. Así, podemos referirnos a un elemento del
arreglo escribiendo el nombre del arreglo y los subíndices del elemento entre corchetes. Los
valores de los subíndices empiezan en cero para el primer elemento, hasta el tamaño del
arreglo menos uno.
Ejemplo:
double [ , ] posicion = new double[4,3] ;
// Crea el arreglo posicion, con 12 elementos de tipo double
posicion[ 2, 1] = 9.8 ;
double p = posición[ 2, 1] ;
// Asigna a la variable p el valor de 9.8, el mismo valor del arreglo en la
posición [2, 1]
En el siguiente ejemplo Matriz1.cs creamos un arreglo del 6 elementos del tipo string es
decir podemos almacenar en este cadenas de texto, consta de 3 filas y 2 columnas, con un
ciclo for anidado capturamos el nombre de 6 materias que deseamos inscribir en un
semestre, posteriormente con otro ciclo for anidado imprimimos los valores almacenados.
3.30 Capítulo 3: Métodos, Arreglos y Estructuras
Ejecución:
Estructuras
Una estructura es muy similar a una clase la cual puede contener campos, propiedades y
métodos, de hecho una estructura es un tipo especial de clase pensada para representar
objetos ligeros. Es decir, que ocupen poca memoria y deban ser manipulados con velocidad,
como objetos que representen puntos, fechas, etc. Ejemplos de estructuras son la mayoría de
los tipos básicos (excepto string y object).
Listamos las cosas habituales en las clases que no se pueden hacer con las estructuras:
Puede escribir constructores, pero estos han de tener argumentos. Dicho de otro modo, no se
puede escribir un constructor sin argumentos para una estructura.
Lógicamente, al tratarse de un tipo valor que se almacena en la pila, las estructuras no admiten
destructores.
No soportan herencia, lo cual implica que no pueden ser utilizadas como clases base ni como
clases derivadas. No obstante, sí pueden implementar interfaces, y lo hacen igual que las
clases.
Los campos de una estructura no pueden ser inicializados en la declaración. O sea, por
ejemplo, no se vale decir int a=10; porque tendríamos un error de compilación.
En el programa Estructura2.cs creamos una estructura llamada Real para establecer y leer
los valores de un número real, posteriormente creamos otra estructura llamada Rectangulo
con dos propiedades para establecer el ancho y alto, y un método llamado CrearRectangulo
para leer los valores. En el Main() línea 49 creamos una variable del tipo Rectángulo, que en
realidad es una estructura, la palabra var puede ser reemplazado por Rectángulo, en las
líneas 55 a 60 accedemos a las características del rectángulo y calculamos el área y perímetro.
C# 3.0 ofrece inferencia de tipos que es una magnifica característica de cualquier Lenguaje.
Conserva la seguridad del tipo, mientras nos permite escribir un código más "relajado". En otras
palabras, podemos definir variables y utilizarlas sin preocuparnos demasiado acerca de los
tipos, dejando que el compilador determine el tipo correcto de una variable por inferencia a
partir de la expresión de asignación a la variable misma. Nos permite definir una variable
mediante el uso de la palabra reservada var en lugar de un tipo específico. Cuando se utiliza
var, el compilador infiere el tipo de la expresión utilizada para inicializar las variables. El código
generado por el compilador contiene tipo inferido.
Cuando cambiamos interiormente, debemos cambiar también los objetos que nos rodean
Tabla de Contenido
Conceptos de clase y objeto .............................................................................................................................. 4.2
Sintaxis de definición de clases ....................................................................................................................... 4.2
Visibilidad de una clase y sus miembros. ................................................................................................... 4.4
Constructores ......................................................................................................................................................... 4.4
Llamada al Constructor. ..................................................................................................................................... 4.5
Clase base, derivada y herencia ...................................................................................................................... 4.8
Polimorfismo ....................................................................................................................................................... 4.13
Enlace estático y enlace dinámico. ............................................................................................................. 4.13
Clases Abstractas ............................................................................................................................................... 4.14
Destructor. ............................................................................................................................................................ 4.17
Encapsulación. .................................................................................................................................................... 4.18
Concepto de propiedad ................................................................................................................................... 4.24
C# es un lenguaje orientado a objetos puro, lo que significa que todo con lo que vamos
a trabajar en este lenguaje son objetos. Un objeto es un agregado de datos y de
métodos que permiten manipular dichos datos, y un programa en C# no es más que un
conjunto de objetos que interaccionan unos con otros a través de sus métodos.
Para definir una clase usamos la palabra clave class, después de esta pondremos el
nombre o identificador de la clase. Abrimos una llave y listamos los miembros de la
clase en la líneas siguientes, hasta finalizar la definición con la llave de cierre.
Las clases se usan para modelar las aplicaciones como si estuvieran compuestas de
objetos más o menos discretos. Al interior de una clase es posible definir otras.
De manera implícita, a menos que indiquemos lo contrario, toda ciase está derivada del
tipo object que es la base de todos los tipos de datos de C#. Éste cuenta con una serie
de miembros que, por tanto, son heredados por todas las ciases que podamos definir.
Si nuestra clase está derivada de otra, heredará, asimismo, todos los miembros de su
clase base y los de la clase base de la base, ascendiendo en la jerarquía hasta llegar a
object.
Tanto la clase como sus miembros pueden contar con múltiples modificadores, los
cuales se listan en la sección: Visibilidad de una clase y sus miembros.
Para crear una nueva clase primero debemos declararla y definir sus campos y
métodos, para crear una clase usamos la palabra clave class, la sintaxis completa es:
Esta es la definición formal, pero todo lo que esta entre corchetes es opcional es decir
puedo o no escribirse dependiendo de las necesidades de nuestra clase, por lo tanto
una clase esta definida por un atributo que es opcional, seguida de un modificador de
acceso que es también opcional, y la palabra clave class que no es opcional debe ir
siempre, seguido del identificador que también es obligatorio, opcionalmente despúes
Ejecución:
• private - Es el ámbito más reducido. Una clase privada sólo puede utilizarse en el
interior del ámbito en que se encuentra incluida, ya sea un namespace u otra clase. Los
miembros que tienen este modificador, igualmente, sólo pueden ser usados desde el
interior de la clase donde se han definido, nunca desde fuera, ni siquiera en clases
derivadas.
La visibilidad de las clases y sus miembros es algo que debe deducirse directamente
del diseño lógico de la propia aplicación. Normalmente ésta constará de una serie de
clases públicas a partir de las cuales se crearán los objetos fundamentales, exponiendo
métodos y propiedades que permitan a las aplicaciones configurar su funcionamiento.
Internamente, estas clases pueden utilizar otras no visibles desde el exterior, así como
miembros privados y protegidos.
Constructores
Para crear un objeto se necesita reservar suficiente espacio en memoria e inicializar los
valores de los campos que representan el estado del objeto.
Donde:
Llamada al Constructor.
Al constructor de una clase se le llama en el momento en que se crea algún objeto de la
misma usando el operador new. De hecho, la forma de uso de este operador es:
new <llamadaConstructor>
Ejecución:
class <nombreHija>:<nombrePadre>
{
<miembrosHija>
}
class Trabajador:Persona
{
public int Sueldo;
public Trabajador(string nombre, int edad, string curp, int sueldo)
: base(nombre, edad, curp)
{
Sueldo = sueldo;
}
}
: base(<parametrosBase>)
A esta estructura se le llama inicializador base y se utiliza para indicar cómo deseamos
inicializar los campos heredados de la clase padre. No es más que una llamada al
constructor de la misma con los parámetros adecuados, y si no se incluye el compilador
consideraría por defecto que vale :base(), lo que sería incorrecto en este ejemplo
debido a que Persona carece de constructor sin parámetros.
public class A
{
public A() { }
}
public class B : A
{
public B() { }
}
En caso de que haya escrito una clase de la cual no le interese que se deriven otras,
por considerarla una clase de uso final, tenemos que anteponer la palabra sealed antes
de class. Para probar si la utilizamos en la clase ClaseBase veremos como no se
puede compilar el programa obteniendo un mensaje de error, esa clase, por lo tanto,
solo podría utilizarse para crear objetos, pero nunca para derivar otras partiendo de ella.
Polimorfismo
La palabra polimorfismo tiene su origen en las palabras griegas poli ( muchos ) y morfos
( formas ) y se utiliza para indicar que un mismo mensaje enviado a diferentes objetos
producirá muchas formas de respuesta.
Por ejemplo, si tenemos la clase base Figura y de ella derivan las clases Rectángulo y
Elipse. Suponiendo que las tres tienen declarado el método Area( ), entonces
podemos tener objetos de las clases derivadas ( Rectángulo y Elipse) referenciados
como si fueran de la clase base (Figura) y después enviarles mensajes para que
devuelvan su área.
El polimorfismo no sólo es importante para las clases derivadas, sino también para las
clases base. Cualquiera que utilice la clase base podría, de hecho, estar utilizando un
objeto de la clase derivada que se haya convertido en el tipo de clase base. Los
diseñadores de una clase base pueden anticipar qué aspectos de su clase base
cambiarán probablemente para un tipo derivado. Por ejemplo, es posible que una clase
base para automóviles contenga un comportamiento sujeto a cambios si el automóvil en
cuestión es un vehículo familiar o uno descapotable. Una clase base puede marcar esos
miembros de clase como virtuales, lo cual permite que las clases derivadas que
representan automóviles descapotables y vehículos familiares reemplacen ese
comportamiento.
El enlace dinámico ( denominado también enlace tardío ) consiste en asignar los tipos a
las variables y expresiones en tiempo de ejecución.
Cuando pensamos en una clase como un tipo, asumimos que los programas crearán
objetos de ese tipo. Sin embargo, hay casos en que es útil definir clases para las cuales
no se desea instanciar objetos. Tales clases son llamadas clases abstractas. Debido a
que normalmente son utilizadas como base en jerarquías de clases, nos referiremos a
ellas como clases base abstractas. Las clases abstractas no sirven para instanciar
objetos porque están incompletas, siendo sus clases derivadas las que deberán definir
las partes faltantes.
El propósito de una clase abstracta es proveer una clase base apropiada desde la cual
otras clases hereden.
Las clases desde las cuales se pueden instanciar objetos se llaman clases concretas.
Tales clases proveen implementaciones de cada método o propiedad que definen.
Para definir una clase abstracta se utiliza la palabra clave abstract (que también sirve
para definir métodos y propiedades abstractos).
Sin embargo, no se puede asignar una referencia de una clase base a una referencia de
una clase derivada, por lo que es erróneo escribir: Humano h = new Mamífero( ); en
primer lugar, porque Mamífero es la clase base y Humano es una clase derivada y, en
segundo lugar, porque Mamífero es una clase abstracta.
[atributos] ~ <identificador> ( )
{// Cuerpo del destructor }
Consideraciones:
~ Carro()
{ // Instrucciones para limpiar}
El destructor llama implícitamente al método Finalize en la case base del objeto. Por
lo tanto, el código de destructor anterior se traduce implícitamente a:
Encapsulación.
Se facilita a los programadores que vaya a usar el tipo de dato (programadores clientes)
el aprendizaje de cómo trabajar con él, pues se le pueden ocultar todos los detalles
relativos a su implementación interna y sólo dejarle visibles aquellos que puedan usar
con seguridad. Además, así se les evita que cometan errores por manipular
inadecuadamente miembros que no deberían tocar.
Otra ventaja es que se facilita al creador del tipo la posterior modificación del mismo,
pues si los programadores clientes no pueden acceder a los miembros no visibles, sus
aplicaciones no se verán afectadas si éstos cambian o se eliminan. Gracias a esto es
posible crear inicialmente tipos de datos con un diseño sencillo aunque poco eficiente, y
si posteriormente es necesario modificarlos para aumentar su eficiencia, ello puede
hacerse sin afectar al código escrito en base a la no mejorada de tipo.
Por defecto se considera que los miembros de un tipo de dato sólo son accesibles
desde código situado dentro de la definición del mismo, aunque esto puede cambiarse
precediéndolos de uno los siguientes modificadores (estos ya se han explicado en el
tema Visibilidad de una clase y sus miembros, para recordar:
public: Puede ser accedido desde cualquier código, protected: Desde una clase sólo
puede accederse a miembros protected de objetos de esa misma clase o de subclases
suyas.
Para acceder a las variables, es decir, a la información que está dentro de los objetos lo
realizamos mediante los métodos public que permitan acceder y modificar dichas
variables, esto es, el método nombre. Darse cuenta que hay dos métodos con el mismo
nombre y diferentes parámetros en la definición, esto es:
Estos métodos conforman la interfaz pública que puede ser usada por el cliente. C#, y
en general cualquier lenguaje orientado a objetos debe de permitir la definición de
métodos con el mismo nombre y diferentes parámetros, ya que esta es la forma de
implementar otro pilar fundamental de la programación orientada a objetos, el
polimorfismo, que vimos anteriormente.
Hay otro método, declarado como private, que es un método de soporte, esto es, no
puede ser llamado por el cliente que use dicho método:
En una cadena para ingresar un retorno de línea o enter debemos de ingresar: \r\n
El cliente es el código que se utiliza fuera de la clase, es decir, un objeto. Esto que
parece obvio tal vez no lo sea. Es decir, hay que tener muy claro que según está
diseñada la clase, nosotros solo podemos usar de ella el método "nombre" en sus dos
versiones, con parámetros y sin parámetros (en los objetos instanciados a partir de la
clase). En realidad son dos métodos, no olvidar esto.
Evidentemente las variables de una clase se pueden definir como públicas, y se pueden
acceder directamente a ellas, pero no es recomendable si se quiere implementar el
concepto de encapsulación correctamente.
La ocultación del código es algo evidente: cuando se invoca el método Acelerar() del
objeto MiCoche, lo único que sabemos es que el coche acelerará, pero el cómo lo haga
es algo que no podremos ver desde el cliente. En cuanto a la protección de datos,
fijémonos también en un detalle del ejemplo: no podríamos modificar directamente el
valor de la propiedad Velocidad, dado que está definida como propiedad de sólo
lectura. La única forma de modificar su valor sería invocar los métodos Acelerar().
Esta importante característica asegura que los datos de los objetos pertenecientes a
esta clase se van a manejar del modo adecuado.
Una propiedad no almacena datos, sino sólo se utiliza como si los almacenase. En la
práctica lo que se suele hacer escribir como código a ejecutar cuando se le asigne un
valor, código que controle que ese valor sea correcto y que lo almacene en un atributo
privado si lo es; y como código a ejecutar cuando se lea su valor, código que devuelva
el valor almacenado en ese atributo público. Así se simula que se tiene un atributo
público sin los inconvenientes que estos presentan por no poderse controlar el acceso a
ellos.
get
{
<códigoLectura>
}
}
Al escribir los bloques de código get y set hay que tener en cuenta que dentro del
código set se puede hacer referencia al valor que se solicita asignar a través de un
parámetro especial del mismo tipo de dato que la propiedad llamado value (luego
nosotros no podemos definir uno con ese nombre en <códigoEscritura>); y que
dentro del código get se ha de devolver siempre un objeto del tipo de dato de la
propiedad.
En realidad el orden en que aparezcan los bloques de código set y get es irrelevante.
Además, es posible definir propiedades que sólo tengan el bloque get (propiedades de
sólo lectura) o que sólo tengan el bloque set (propiedades de sólo escritura) Lo que no
es válido es definir propiedades que no incluyan ninguno de los dos bloques.
Tabla de Contenido
Windows Forms .......................................................................................................................5.2
Creación de Proyectos .............................................................................................................5.4
El espacio de nombres System.Windows.Forms......................................................................5.6
Insertando controles dentro de la forma ...................................................................................5.7
Inserción de Código ...............................................................................................................5.10
Caja de Mensajes (MessageBox)...........................................................................................5.16
Caja de Selección ..................................................................................................................5.23
Visor de Imágenes y Enlaces .................................................................................................5.26
Web Browser y Creación de Menús .......................................................................................5.30
Formas que llaman a otras formas .........................................................................................5.33
Creación de Propiedades en una Clase .............................................................................5.36
Matrices en dataGridView...................................................................................................5.38
Creación de Menús ............................................................................................................5.40
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. El
Diseñador de Windows Forms se utiliza para crear la interfaz de usuario, y permite obtener
acceso a otras características de diseño y ejecución, tales como las siguientes:
Implementación ClickOnce.
Uso avanzado de bases de datos mediante DataGridView (Control, formularios
Windows Forms).
Barras de herramientas y otros elementos de interfaz de usuario que pueden tener el
aspecto y el comportamiento de Microsoft Windows XP, Microsoft Office o Microsoft
Internet Explorer.
Agregar controles
En cualquiera de los diseñadores se utiliza el mouse para arrastrar controles, que son los
componentes con representación visual, como botones y cuadros de texto, hasta una superficie
de diseño
A medida que se trabaja visualmente, el Diseñador de Windows Forms traduce las acciones en
código fuente de C# y las escribe en un archivo de proyecto llamado nombre.designer.cs donde
nombre es el nombre asignado al formulario. De igual forma, WPF Designer traduce las
acciones de la superficie de diseño a código de lenguaje de marcado de aplicaciones
extensible (XAML) y lo escribe en un archivo de proyecto que se denomina Window.xaml.
Cuando se ejecuta la aplicación, ese código fuente (Windows Forms) o código XAML (WPF)
ajustará la posición y el tamaño de los elementos de la interfaz de usuario de modo que
aparezcan como en la superficie de diseño.
Establecer propiedades
Controlar eventos
Los programas con interfaces de usuario gráficas son principalmente controlados por eventos.
Estos programas esperan a que un usuario haga algo, como escribir texto en un cuadro de
texto, hacer clic en un botón o cambiar la selección de un cuadro de lista. Cuando esto sucede,
el control, que es simplemente una instancia de una clase de .NET Framework, envía un
evento a la aplicación. Tiene la opción de controlar un evento escribiendo un método especial
en la aplicación al que se llamará cuando se reciba el evento.
Podemos utilizar la ventana Propiedades para especificar qué eventos desea tratar en el
código. Si seleccionamos un control en el diseñador y hacemos clic con el icono Rayo en el
botón Eventos de la barra de herramientas de la ventana Propiedades para ver los eventos del
control. El icono siguiente muestra el botón de eventos.
Para abrir Visual C# Express Edition 2008 ejecutamos el programa directamente o con los
acceso directos.
En el cuadro de herramientas
tenemos tres opciones desde
cerrar para desaparecer el
cuadro, ocultar automáticamente
o colocarla flotante, acoplable,
etc.
La siguiente tabla muestra las clases en este espacio de nombres agrupadas en categorías.
Hay algunas clases dentro de System.Windows.Forms que proveen soporte a las clases
mencionadas arriba. Ejemplos son: enumeraciones, clases argumento evento y delegados
usados por eventos dentro de controles y componentes.
Una ventana muy útil es la ventana de propiedades si no la tenemos disponible nos vamos al
menú Ver → Ventana Propiedades esta nos muestra la propiedad de cualquier control, por
ejemplo un botón, cuadro de texto, etiqueta.
Vamos a modificar las propiedades de la forma Form1 en primer lugar la seleccionamos y nos
vamos a la ventana de propiedades, aquí vemos en la parte superior el recuadro con el
siguiente texto: Form1 System.Windows.Forms.Form al final contiene una flecha hacia abajo
en ella podemos seleccionar los diferente elementos y modificar sus propiedades, en este
momento no tenemos ningún otro elemento solo la forma.
Por default Visual C# asigna los nombres a las etiquetas como label1, label2, button1,
textBox1, etc. Desde la ventana propiedades podemos modificar el nombre y las
características de la ventana. En la imagen siguiente se muestra el procedimiento a seguir para
cambiar las propiedades de cualquier elemento, en particular, la imagen se refiere al cambio
de propiedades del control button1.
Otra forma de ver las propiedades es seleccionar cualquier control damos clic con el botón
derecho en la opción Propiedades y automáticamente nos muestra las propiedades de dicho
control, esto se ilustra en la siguiente figura:
El código que se inserta aparece encerrado en el rectángulo, vemos que el método se llama
button1_Click que nos indica que realizará cuando demos doble clic sobre el botón.
En la línea 56 String.Format La clase String dispone del método Format que nos permite
formatear una expresión.
Multiplica.cs
// código que debemos insertar en el método button1_Click
Multiplica.cs
// código que debemos insertar en el método button1_Click
Vamos a insertar dos controles de tipo botón, el primero para limpiar los campos y el otro para
salir de la aplicación como se muestra en la siguiente figura:
Mostramos el código sombreado en color amarillo, para el botón 2, que nos sirve para limpiar
los campos de las tres cajas de texto, después de realizar un cálculo podemos limpiar el campo
con este botón.
Ejemplo de la ejecución:
El código para los botones de Limpiar y Salir, son identicos al del ejemplo Multiplica.
OK
OKCancel
YesNo
YesNoCancel
RetryCancel
AbortRetryIgnore
Information
Exclamation
Question
Error
DialogResult.OK
DialogResult.Cancel
DialogResult.Yes
DialogResult.No
DialogResult.Ignore
DialogResult.Abort
DialogResult.Retry
2 Etiquetas (Label)
2 Cajas de agrupamiento (GroupBox)
1 Botón (Button)
10 Botones de radio (RadioButton)
Lo que sigue es agregar una variable privada a la clase y lo hacemos antes del constructor:
Como en el primer método, se investiga cual de los radioButtons (mediante sender) cambió su
estatus de desactivado a activado y se pone la variable tipoDeIcono con uno de los cuatro
posibles valores que tiene la enumeración MessageBoxIcon.
Por último queremos programar el botón Mostrar para que al hacer clic sobre él se ejecute el
método button1_Click desplegando el MessageBox configurado con el valor que en su
momento tengan las variables tipoDeBoton y tipoDeIcono.
Ahora crearemos un nuevo proyecto C# del tipo de Aplicación de Windows Forms, al que
llamaremos CajadeSeleccion.
4 Etiquetas (Label)
12 Cajas de selección (CheckBox)
2 Botones (Button)
En la etiqueta uno escribimos el texto UACM POO en C#, las otras tres etiquetas las
utilizaremos para colocar los títulos Estilo, Fuente, Tamaño, las doce cajas de selección
nos ayudaran a modificar el texto de la etiqueta uno en cuanto al tipo de letra, tamaño y estilo,
el botón Salir cierra la aplicación y el botón Limpiar, regresa al texto original sin aplicar
ningún formato.
Repetimos el mismo paso para crear otros tres métodos para cambiar al estilo itálica, tachado o
subrayado, lo que harán estos métodos es cambiar la fuente de la etiqueta label1 para que el
estilo cambie a Bold o Italic o Strikeout o Underline
El principio que estamos usando aquí es el hecho de que para crear una Fuente hay que
hacerlo de la siguiente manera
donde FontFamily es una familia de fuentes como por ejemplo Arial o Consolas y
FontStyle puede ser Bold, Italic, Strikeout, Underline o la combinación de ellos, el
tamaño se pude especificar con un número por ejemplo 10, 12, 20.
Finalmente en la última columna con las cuatro cajas de selección cambiamos el tamaño del
texto de la etiqueta uno con un procedimiento similar a los dos anteriores primero configurando
el evento y después escribiendo en el método lo siguiente:
Observemos que nuevamente aquí de los tres parámetros o argumentos solo modificamos el
tamaño.
El botón limpiar regresa el texto de la etiqueta uno al formato original, por ejemplo si
cambiamos el tipo de letra a Broadway, Tachado y tamaño 20, al darle limpiar simplemente
regresamos al texto con el formato original para saber cuál era el formato original
seleccionamos la etiqueta uno y en propiedades vemos el tipo de letra y tamaño utilizado.
Este proyecto abarca dos secciones, en la primera se trata de un visor de imágenes, es una
aplicación muy simple que lee archivos gráficos, el botón Elegir Imagen en combinación con
el control openFileDialog nos permite seleccionar la ubicación de nuestra imagen, una vez
seleccionada la imagen se mostrara en el recuadro pictureBox1. La segunda parte son los
enlaces a tres elementos el primero abre la calculadora de Windows, la segunda abre una liga
a la página de la Universidad, por último abre el Explorador de Windows en el disco local C:\,
esto se logra mediante los controles linkLabel.
La siguiente figura muestra los controles necesarios para elaborar nuestro proyecto
Al botón 1 que dice Elegir Imagen al darle doble clic nos traslada al código e insertamos lo
siguiente:
En la segunda parte del proyecto se refiere a los Enlaces, usamos el control linkLabel el cual
tiene la peculiaridad de poseer una liga (como las páginas Web) a directorios de nuestro
sistema de archivos, a direcciones electrónicas de sitios Web o FTP y también a aplicaciones
que se encuentren en el Registro de Windows.
Ya tenemos agregados los tres linkLabel, ahora necesitamos la programación de los eventos
de hacer click en el control, en los tres eventos utilizaremos la llamada del método:
System.Diagnostics.Process.Start(parametros);
Observemos que normalmente no cambiamos el nombre de los controles por ejemplo aquí
utilizamos el nombre por default linkLabel1, linkLabel2, linkLabel3, esto digamos que
es por “simplicidad”, aunque si quisiéramos que fuera mas intuitivo nuestro programa
podríamos llamar en lugar de linkLabel1, quizás calculadora, o en lugar de linkLabel2 el
nombre de uacm, etc.
La ejecución de esta segunda parte del proyecto abrirá las siguientes aplicaciones:
1 Menú (menuStrip)
1 Caja del tipo combo (comboBox)
2 Botones (Button)
1 Navegador Web (webBrowser)
Insertamos dos botones uno que seleccionaría el link o enlace al cual queremos ir y el segundo
para salir del programa, luego vamos a insertar el control webBrowser y ajustarlo al tamaño
adecuado.
Ahora ya hemos finalizado la fase de diseño de nuestra aplicación, y hemos llegado al punto
donde necesitamos añadir algún código en C# para proporcionar la funcionalidad del programa.
Necesitamos añadir controladores para el botón y para cada opción de menú. Un controlador
es un método que se ejecuta cuando se activa un determinado control. Visual C# Express crea
controladores vacíos para nosotros automáticamente. Hacer doble clic sobre el botón, y
aparecerá el editor de código para nuestro proyecto. Veremos que el controlador para el evento
asociado al evento de mensaje que sucede cuando el usuario hace clic sobre un botón ha sido
creado por nosotros. Añadir código al método del controlador de modo que tenga una
apariencia similar al ejemplo siguiente.
Vamos a añadir el código para las opciones del menú, (volver a la ventana de diseño o
diseñador presionar Shift + F7 y para ir al código insertar F7), hacer doble clic sobre cada
uno de los elementos de menú. Visual C# Express crea métodos de controladores para cada
uno. Editar estos métodos de modo que tengan una apariencia similar al código siguiente.
public Form1()
{ InitializeComponent();
comboBox1.SelectedIndex = 0;
webBrowser1.GoHome();
}
Vamos a crear tres Formas (Clases) Form1, Form2 y Form3, y la idea es que Form1 pueda
llamar mediante respectivos botones a Form2 o Form3. Tanto Form2 como Form3 son dos
Formas del tipo modal (mientras que no se cierren no puede accederse a otra parte del
programa).
Una vez que la aplicación quede terminada lucirá semejante a la que se muestra a
continuación:
6 Etiquetas (Label)
1 Caja de texto (textBox)
2 Botones (Button)
2 Etiquetas (Label)
1 Botón (Button)
6 Etiquetas (Label)
5 Caja de texto (textBox)
1 Botón (Button)
En C# la manera de declarar una propiedad info para darle un valor al campo Informacion
(set) o para poder leer el contenido de éste (get) es la siguiente:
A continuación se muestra el código que debemos ingresar a los dos métodos del botón
Ingresar Datos y Acerca de..., anteriormente creado para Form1.
Matrices en dataGridView
El control DataGridView proporciona una tabla personalizable para mostrar datos. La clase
DataGridView permite personalizar celdas, filas, columnas y bordes mediante propiedades.
Controles utilizados:
4 Etiquetas (Label)
3 Grid (dataGridView)
2 Botones (Button)
1 Caja de texto (textBox)
{
int tam = int.Parse(textBox1.Text);
int[,] _matriz1 = new int[tam, tam];
int[,] _matriz2 = new int[tam, tam];
int[,] _matriz3 = new int[tam, tam];
for (int f = 0; f < tam; f++) // filas
{
for (int c = 0; c < tam; c++) //columnas
{
_matriz1[f, c] = int.Parse(dataGridView1[f, c].Value.ToString()); // almacena
_matriz2[f, c] = int.Parse(dataGridView2[f, c].Value.ToString());
_matriz3[f, c] = _matriz1[f, c] + _matriz2[f, c];
dataGridView3.CurrentCell = dataGridView3[f, c];
dataGridView3.CurrentCell.Value = _matriz3[f, c];
}
}
DataGridView.Rows Es una propiedad que obtiene una colección que contiene todas las filas
del control DataGridView.
Del lado izquierdo se muestra la ejecución cuando damos una dimensión de 5 para nuestra
matriz cuadrada en esta parte cada elemento de la matriz resultante se inicializa en cero, del
lado derecho cuando damos clic en Suma obtenemos el resultado de cada elemento de la
matriz resultante.
Creación de Menús
El siguiente proyecto muestra la creación de menús, utilizamos tres etiquetas y mediante las
opciones del menú Formato y Fondo, cambiamos el color de fondo, el tipo y color de la fuente
o letra, mediante el menú Acerca de… mostramos información de contacto del autor del
proyecto y la opción Salir. Como parte complementaria y para no incluirla en un solo proyecto
agregamos el control dateTimePicker y el botón Fecha, esto simplemente muestra un
calendario seleccionamos una fecha y al dar clic en el botón nos muestra la fecha elegida y del
día actual, esto con ayuda de un MessageBox.Show.
Controles utilizados:
3 Etiquetas (Label)
1 Menú (menuStrip)
1 DateTimePicker
1 Botón (Button)
Con ingresar un solo menuStrip se pueden derivar todos los menús que necesitemos, en las
siguientes imágenes se muestran cada una de las opciones del menú, es importante aclarar
que la opciones que aparecen como Ctrl+N, Ctrl+B, Ctrl+S, no se escriben si no son
accesos rápidos para trabajar con el proyecto por ejemplo con Ctrl+S, sale uno del proyecto,
en la siguiente pantalla se muestra como se configura esta propiedad.
El código del botón fecha nos da la información de la fecha seleccionada y el día actual junto
con la hora, su código es:
aÉ {tç Öâx xÅÑxétÜ á|xÅÑÜx ÑÉÜ Ät ÇÉv|™Ç ÑÜ|ÅxÜt wx Ätá vÉátá Öâx áx xáàâw|tÇ? á|ÇÉ ÑÉÜ
tÖâxÄÄÉ Öâx Ñâxwx ytv|Ä|àtÜ xÄ tÑÜxÇw|ét}xA
TÜ|áà™àxÄxá
Tabla de Contenido
En esta documento se describen dos entornos de desarrollo que son gratuitos, ambos
son de gran utilidad para programar en C#, el alumno elegirá para programar el que le
parezca mas conveniente o ambos.
Instalación
Para la instalación requerimos de los siguiente archivos, los cuales se incluyen en el CD
etiquetado como C# dentro de la carpeta EDI
En caso de preferir una ruta diferente de instalación es necesario dar clic en Examinar
y seleccionar la carpeta o directorio de nuestra preferencia.
En esta parte se mostrará cuales son los paquetes o productos que se descargaran e
instalarán, así como el tamaño de la descarga y el espacio requerido en disco.
Aquí es necesario que estemos conectados a Internet para continuar con la instalación.
Continuamos dando clic en Instalar
Una vez que inicializamos la aplicación nos vamos al menú Ayuda → Registrar
Producto.
Una vez obtenida la clave de registro copiamos y pegamos, la clave del registro y
damos clic en Registro Completo.
2. SharpDevelop 3.0
El procedimiento y los pasos a seguir son similares a los explicados anteriormente para
instalar y probar Visual C# 2008 Express Edition. Se deja al alumno el instalar y probar
dicho entorno de desarrollo.
Tabla de contenido
Tipo de datos enteros................................................................................................ A2.2
Tipo de datos de punto flotante ................................................................................. A2.2
Tipo de datos de caracteres ...................................................................................... A2.3
Tipo de datos lógicos ................................................................................................ A2.3
Constantes ................................................................................................................ A2.3
Aplicar formato a la tabla de resultados numéricos. .................................................. A2.3
Tipos primitivos y sus valores por default .................................................................. A2.4
Secuencias de escape .............................................................................................. A2.4
Variables ................................................................................................................... A2.5
Operadores ............................................................................................................... A2.5
Operadores aritméticos ............................................................................................. A2.5
Operadores relacionales ........................................................................................... A2.5
Operadores lógicos ................................................................................................... A2.6
Tabla completa de operadores .................................................................................. A2.6
Modificadores de acceso ........................................................................................... A2.6
Precedencia de operadores ...................................................................................... A2.7
Clase System.Array................................................................................................... A2.7
Clase System.String .................................................................................................. A2.9
Excepciones más comunes. ...................................................................................... A2.9
Estructuras de Control ............................................................................................. A2.10
Los tipos de punto flotante pueden representar números con componentes fraccionales.
Existen dos clases de tipos de punto flotante; float y double. El tipo double es el
más utilizado porque muchas funciones matemáticas de la biblioteca de clases de C♯
usan valores double. Quizá, el tipo flotante más interesante de C♯ es decimal, dirigido
al uso de cálculos monetarios. La aritmética de punto flotante normal está sujeta a una
variedad de errores de redondeo cuando se aplica a valores decimales. El tipo decimal
elimina estos errores y puede representar hasta 28 lugares decimales.
No existe una conversión definida entre bool y los valores enteros (1 no se convierte a
verdadero ni 0 se convierte a falso).
Constantes
Secuencias de escape
Toda variable se debe declarar antes de ser utilizada. La forma en que se declara una
variable en C♯ es la siguiente:
tipo nombre_variable;
nombre_variable = valor
Operadores
Operadores aritméticos
Operador Significado
+ Suma
- Resta
* Producto
/ División
% Módulo (residuo entero)
++ Incremento
-- Decremento
Operadores relacionales
Operador Significado
== Igual que
!= Distinto que
> Mayor que
< Menor que
Operadores lógicos
Operador Significado
^ XOR y de nivel de bits
|| OR de cortocircuito
&& AND de cortocircuito
! NOT
Modificadores de acceso
Modificador Descripción
Significa que el miembro es accesible desde fuera de la clase
public que lo define y de la jerarquía de las clases derivadas.
Accesible desde cualquier parte del mismo proyecto, desde otros
A2.6 Apéndice 2: Guía de referencia del lenguaje C#
proyectos que hagan referencia al proyecto, y desde un
ensamblado generado a partir del proyecto.
El miembro no es visible desde fuera de la clase y se puede
protected acceder a él solo desde clases derivadas o dentro de la misma
clase.
No se puede acceder al miembro desde fuera del ámbito de la
clase que lo define. Por lo tanto, ni siquiera las clases
private
derivadas tienen acceso a estos miembros. Es lo considerado por
defecto.
El miembro es visible soló desde la unidad de compilación
internal
actual. El modificador internal crea un híbrido de acceso
public y protected dependiendo de donde resida el código.
Es decir sólo puede ser accedido desde código perteneciente al
ensamblado en que se ha definido.
protected Sólo puede ser accedido desde código perteneciente al
internal ensamblado en que se ha definido o desde clases que deriven de
la clase donde se ha definido.
Precedencia de operadores
En todos los lenguajes los distintos operadores tienen una precedencia en una
expresión, o sea, un orden de prioridad para ser tratados por el compilador cuando
analiza una línea con múltiples operadores.
Clase System.Array
Método Descripción
Estructuras de Control
La instrucción if-else es básicamente igual que en C, C++ y Java.
Tabla de Contenido
Metodo.cs ....................................................................................................................................................................................... A3.2
Sobrecarga1.cs ............................................................................................................................................................................ A3.3
Sobrecarga2.cs ............................................................................................................................................................................ A3.4
Sobrecarga3.cs ............................................................................................................................................................................ A3.5
Valor1.cs ......................................................................................................................................................................................... A3.6
Referencia1.cs.............................................................................................................................................................................. A3.7
Arreglo1.cs .................................................................................................................................................................................... A3.8
Histograma.cs .............................................................................................................................................................................. A3.9
Ordenar.cs....................................................................................................................................................................................A3.10
MetodosArray.cs ......................................................................................................................................................................A3.12
Estadistica1.cs ...........................................................................................................................................................................A3.14
Estadistica2.cs ...........................................................................................................................................................................A3.15
Estadistica3.cs ...........................................................................................................................................................................A3.17
Foreach1.cs .................................................................................................................................................................................A3.19
Matriz1.cs.....................................................................................................................................................................................A3.20
Matriz2.cs.....................................................................................................................................................................................A3.21
Matriz3.cs.....................................................................................................................................................................................A3.22
Estructura1.cs ............................................................................................................................................................................A3.24
Estructura2.cs ............................................................................................................................................................................A3.25
Estructura3.cs ............................................................................................................................................................................A3.27
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace metodo_MisDatos
{
class Program
{
static void Main(string[] args)
{
new Program().MisDatos();
}
public void MisDatos() //método MisDatos()
{
Console.WriteLine("UACM IZTAPAPALAPA");
Console.WriteLine("PROGRAMACION ORIENTADA A OBJETOS EN C#");
Console.WriteLine("Armando Valera Paulino");
Console.WriteLine("mail: avalera@hotmail.com");
Console.WriteLine(DateTime.Now);
Console.WriteLine("\n");
Console.ReadLine();
}
}
}
Ejecución:
using System;
using System.Collections.Generic;
using System.Text;
namespace SobrecargaMetodos
{
public class Principal
{
private int Triple(int val)
{ return 3 * val; }
long lx = 5;
long ly = Triple(lx);
System.Console.WriteLine("lx={0} ly={1}", lx, ly);
double dx = 2.5;
double dy = Triple(dx);
System.Console.WriteLine("dx={0} dy={1}", dx, dy);
}
static void Main()
{
Principal p = new Principal();
p.SobreCarga();
System.Console.ReadLine();
}
}
}
Ejecución:
namespace SobrecargaMetodos
{
public class Principal
{
static void Main()
{
Principal p = new Principal();
Console.WriteLine("El número mayor es: {0}", p.mayor(3,4));
Console.WriteLine("El número mayor es: {0}", p.mayor(2.4,5.1));
Console.WriteLine("La letra mayor es: {0}", p.mayor('v','z'));
System.Console.ReadLine();
}
#region
int mayor(int a, int b) {
if(a > b) return a; else return b; }
}
}
Ejecución:
using System;
public class Principal
{
static void Main()
{
Principal p = new Principal();
#region
int mayor(int a, int b) {
if(a > b) return a; else return b; }
Ejecución:
using System;
class porValor
{
static void Main()
{
int n = 5;
Console.WriteLine("En valor antes de llamar al método: {0}", n);
Ejecución:
class porValor
{
static void Main()
{
int n = 5;
Console.WriteLine("En valor antes de llamar al método: {0}", n);
Ejecución:
using System;
class Arreglo1
{
static void Main( string[] args )
{
int[] a = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int[] b = new int[10];
int total = 0;
//Suma los elementos del arreglo a y se los asigna a total
for ( int i = 0; i<a.Length; i++)
total += a[ i ];
Console.WriteLine( "Suma de todos los elementos del arreglo a: "
+ total);
Console.ReadLine();
} // fin de Main
} // Arreglo1
Ejecución:
using System;
class Histograma
{
// metodo Main
static void Main( string[] args )
{
int[] x = { 17, 4, 16, 9, 10, 7, 13, 6, 19, 2 };
string salida = "Elemento\tValor\tHistograma\n";
// construir salida
for ( int i = 0; i < x.Length; i++ )
{
salida += "\n" + i + "\t\t" + x[ i ] + "\t";
for ( int j = 1; j <= x[ i ]; j++ ) // imprimir una barra
salida += "*";
}
Console.WriteLine( salida);
Console.ReadLine( );
} // fin Main
} // fin de la clase Histograma
Ejecución:
/* foreach(int i in valores)
{
Console.Write(i + " ");
}
Ejecución:
using System;
class ManipulacionArreglos
{
static void Main(string[] args)
{
int[] a= {12,5,9,19,4,8,11,5,3};
int [] b= new int[a.Length];
int [] c= new int[a.Length];
int pos1=Array.IndexOf(c,5);
int pos2=Array.LastIndexOf(c,5);
Console.ReadLine();
} //fin del Main()
}//fin de la clase ManipulacionArreglos
Ejecución:
using System;
class Estudiantes
{ //método principal Main()
static void Main( string[] args )
{
int[] calificaciones = { 9, 2, 5, 3, 4, 8, 2, 9, 7, 8, 10, 1,
6, 3, 8, 6, 4, 10, 3, 8, 2, 7, 7, 5, 7, 7, 8, 6, 7,
5, 7, 7, 5, 6, 7, 5, 6, 4, 8, 6, 7, 10, 5, 10};
// resultados
for ( int puntaje = 1; puntaje < frecuencia.Length; puntaje++ )
salida += puntaje + "\t\t" + frecuencia[ puntaje ] + "\n";
Console.WriteLine( salida);
Console.ReadLine();
} // fin Main
} // fin de la clase EncuestaEstudiantes
Ejecución:
using System;
class Estudiantes
{
// metodo Main
static void Main( string[] args )
{
int[] calificaciones = { 9, 2, 5, 3, 4, 8, 2, 9, 7, 8, 10, 1,
6, 3, 8, 6, 4, 10, 3, 8, 2, 7, 7, 5, 7, 7, 8, 6, 7,
5, 7, 7, 5, 6, 7, 5, 6, 4, 8, 6, 7, 10, 5, 10};
// resultados
for ( int puntaje = 1; puntaje < frecuencia.Length; puntaje++ )
salida += puntaje + "\t\t" + frecuencia[ puntaje ] + "\n";
Console.WriteLine( salida);
Console.ReadLine();
} // fin Main
return z;
}
} // fin de la clase EncuestaEstudiantes
Ejecución:
using System;
class Estudiantes
{
public static int maximo(int []a)
{
int max=0;
for(int i=1; i<a.Length; i++)
if (max<a[i])
max=a[i];
return max;
}
// metodo Main
static void Main( string[] args )
{
// resultados
for ( int puntaje = 1; puntaje < frecuencia.Length; puntaje++ )
salida += puntaje + "\t\t" + frecuencia[ puntaje ] + "\n";
Console.WriteLine( salida);
Console.ReadLine();
} // fin Main
} // fin de la clase EncuestaEstudiantes
Ejecución:
Console.ReadLine();
} // fin Main
} // fin de la clase Ciclos
Ejecución:
Console.ReadLine();
}
}
Ejecución:
using System;
public class Matrices
{
static void Main( )
{
const int filas = 4;
const int columnas = 3;
Ejecución:
using System;
class SumaMatrices
{ public static void Main( )
{ int f, c;
Console.Write("Dame el numero de filas de la matriz:" );
f= Convert.ToInt32(Console.ReadLine( ));
Console.Write("Dame el numero de columnas de la matriz:" );
c= Convert.ToInt32(Console.ReadLine( ));
int i, j ;
Console.WriteLine("\nTeclea los valores de la matria A: " );
for( i = 0 ; i < f ; i++ )
for( j = 0 ; j < c ; j++)
{Console.Write("A[{0},{1}]=", i,j);
A[i,j] = Convert.ToInt32(Console.ReadLine( ));}
struct Entero
{
private int val;
class Program
{
static void Main()
{
Entero Natural = new Entero();
Ejecución:
using System;
public struct Real
{
private double val;
public double Valor
{ get { return val; }
set { val = value; }
}
Rect.CrearRectangulo();
Console.WriteLine();
Ejecución:
Ejecución:
Tabla de Contenido
Clase1.cs ................................................................................................................................................................................ A4.2
Constructor1.cs .................................................................................................................................................................. A4.3
Constructor2.cs .................................................................................................................................................................. A4.4
Constructor3.cs .................................................................................................................................................................. A4.5
Herencia1.cs......................................................................................................................................................................... A4.6
Herencia2.cs......................................................................................................................................................................... A4.8
ClaseAbstracta1.cs ............................................................................................................................................................ A4.9
Polimorfismo1.cs ............................................................................................................................................................ A4.10
DestructoresHerencia.cs.............................................................................................................................................. A4.11
Encapsulacion1.cs .......................................................................................................................................................... A4.12
Encapsulacion2.cs .......................................................................................................................................................... A4.13
Propiedad1.cs................................................................................................................................................................... A4.15
Global1.cs ........................................................................................................................................................................... A4.16
namespace Clase1
{
public class Hola
{
// Aqui podriamos definir variables privadas
// ........
// Método Publico
public void Saludo( )
{
Console.WriteLine("Hola todo mundo!" );
}
}
Ejecución:
Ejecución:
Ejecución:
using System;
public class Prueba
{
public Prueba()
{
Console.WriteLine("Constructor por default");
Console.WriteLine("Armando Valera Paulino");
Console.WriteLine(DateTime.Now);
}
public Prueba(int x)
{
Console.WriteLine("\n\nConstructor con un argumento");
Console.Write("Creado objeto Prueba con x={0}",x);
}
}
//observese que a los dos contructores se les da la palabra public
//para que pueda ser accesible, si no se especifica como private
//automaticamente
class Principal
{
public static void Main()
{
Prueba prb1 = new Prueba(); //se invoca al constructor por default
Prueba prb2 = new Prueba(44);//se invoca al constructor con un
argumento
Console.ReadLine();
}
}
Ejecución:
using System;
class Persona
{
public string Nombre;
// Campo de cada objeto Persona que almacena su nombre
public int Edad;
// Campo de cada objeto Persona que almacena su edad
public string CURP;
// Campo de cada objeto Persona que almacena su CURP
void Cumpleaños()
// Incrementa en uno de edad del objeto Persona
{
Edad++;
}
Ejecución:
Ejecución:
using System;
using C=System.Console;
class Principal
{
static void Main()
{
Rectangulo r=new Rectangulo(5,10,20,60);
C.WriteLine("El área del rectángulo de 20x60 es : " + r.Area( ));
C.ReadLine();
}
Ejecución:
using C=System.Console;
Ejecución:
using System;
using C = System.Console;
class Primero
{
~ Primero( )
{
C.WriteLine("Se invocó al destructor Primero...");
}
}
Ejecución:
class NombreC {
// Definición de variables de instancia.
private string nombre1 ;
private string apellido1 ;
private string apellido2 ;
Encapsulacion2.cs
/*Encapsulacion2.cs
Programa que ilustra el concepto de encapsulación*/
using System;
using C=System.Console;
class Automovil
{
private double velocidad=40;
private string Marca;
private string Modelo;
private string Color;
Ejecución:
abstract class A
{
public abstract int PropiedadEjemplo
{
set;
get;
}
}
class B:A
{
private int valor=44;
class Principal
{
public static void Main()
{ B MiB=new B();
Console.WriteLine("El valor de retorno en get es
{0}",MiB.PropiedadEjemplo);
Console.ReadLine();
}
}
Ejecución:
using System;
using C=System.Console;
class Automovil
{
protected double velocidad=50;
private string Marca;
private string Modelo;
private string Color;
class AutomovilAvanzado:Automovil
{
public AutomovilAvanzado(string marca, string modelo, string
color):base(marca, modelo, color) {}
class Principal
{
public static void Main()
{ AutomovilAvanzado MiCoche=new
AutomovilAvanzado("Nissan","Sentra","Plata");
C.WriteLine("Los datos de mi coche son:");
C.WriteLine(MiCoche.Datos());
C.WriteLine("La velocidad inicial es de {0} km/h
\n",MiCoche.Velocidad);
MiCoche.Acelerar(90);
C.WriteLine("\nLa velocidad final es de {0}
km/h",MiCoche.Velocidad);
C.ReadLine();
}
}
Ejecución:
Tabla de Contenido
Caja de Mensajes.cs ........................................................................................................................................................... A5.2
CajadeSelección.cs ............................................................................................................................................................. A5.4
VisorImagenes_Enlaces.cs.............................................................................................................................................. A5.6
WebBrowser_Menu.cs ..................................................................................................................................................... A5.7
llamarFormas1.cs .............................................................................................................................................................. A5.8
llamarFormas2.cs .............................................................................................................................................................. A5.9
llamarFormas3.cs .............................................................................................................................................................. A5.9
menuCalendario.cs......................................................................................................................................................... A5.11
namespace CajadeMensajes
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
}
}
namespace CajadeSeleccion
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
}
//CAMBIOS DE ESTILO
private void Negrita_CheckedChanged(object sender, EventArgs e)
{
this.label1.Font = new Font(this.label1.Font.FontFamily,
this.label1.Font.Size, FontStyle.Bold);
}
}
}
namespace VisordeImagenes
{ public partial class Form1 : Form
{
public Form1()
{ InitializeComponent(); }
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
comboBox1.SelectedIndex = 0;
webBrowser1.GoHome();
}
namespace llamarFormas
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
}
}
namespace llamarFormas
{
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
llamarFormas3.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace llamarFormas
{
public partial class Form3 : Form
{
public Form3()
{
InitializeComponent();
}
}
}
namespace menuCalendario
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
BorrarColor();
label1.ForeColor = Color.Red;
label2.ForeColor = Color.Red;
label3.ForeColor = Color.Red;
rToolStripMenuItem.Checked = true;
}
}
}