Tema 3 Visual CSharp
Tema 3 Visual CSharp
Programación Visual
Visual C#
Sistemas Informáticos
(Grados en Ingenierías Industriales)
Conceptos básicos
La programación visual ofrece los mecanismos necesarios
para diseñar y desarrollar aplicaciones con un entorno visual
amigable y fácil de utilizar para el usuario (friendly).
El programador debe:
1. Diseñar la interfaz gráfica donde actúa el usuario.
2. Definir los eventos a los cuales el programa reaccionará, y las acciones a
efectuar al presentarse cada uno (manejador de eventos).
1
Características Principales de C#
C# (leído en inglés “C Sharp” y en español “C
Almohadilla”) es el lenguaje de propósito general
diseñado por Microsoft para su plataforma .NET.
Sus principales creadores son Scott Wiltamuth y
Anders Hejlsberg, éste último también conocido por
haber sido el diseñador del lenguaje Turbo Pascal y la
herramienta RAD Delphi (Rapid Application Development).
La sintaxis y estructuración de C# es muy
similar a la C++, lo que facilita la migración de
códigos en este lenguaje a C# y su aprendizaje a
los desarrolladores habituados a ellos.
En resumen, C# es un lenguaje de programación
que toma las mejores características de lenguajes
preexistentes como Visual Basic, Java, y C++ y
las combina en uno solo.
3
2
Empezar a Programar
Solución [Link]:
Archivo de "Solución" de nivel
superior: Hay uno por aplicación.
Contiene referencias a uno o más
archivos de proyecto (en este
caso sólo tiene un proyecto).
Proyecto [Link]:
Contienen códigos y objetos para el proyecto, escritos
siempre en el mismo lenguaje de programación.
Tres partes:
1. Properties: [Link] contiene atributos del programa
(autor, fecha, título, compañía...).
2. References: Referencias al código compilado que puede
usarse. Bibliotecas/Ensambladores con código, como System.
3. [Link]: Archivo fuente C#, donde hay que escribir el
código. 5
3
Empezar a Programar
Compilar:
Menú Generar o Depurar Generar Solución
Errores: Se muestran en la ventana "Lista de
Errores".
Para ver esa y otras ventanas: Menú Ver.
Ejecutar:
Menú Depurar Iniciar depuración (F5):
Ejecuta el código.
Menú Depurar Iniciar sin depurar (Ctrl-F5):
Ejecuta y añade al final el texto "Presione una tecla para
continuar..."
También se puede ejecutar paso a paso, para
depurar posibles errores.
7
Espacios de Nombres
Es frecuente que varios objetos puedan tener el mismo nombre.
Para evitar confundirlos se crean los Espacios de Nombres.
Ejemplo:
namespace Academia Esta clase se llama:
{ class Alumno
[Link]
{ ...
}
}
4
namespace y using
namespace Universidad
{
class Profesor // [Link]
{ ...
}
}
namespace Academia
{
class Profesor // [Link]
{ ...
}
}
La sentencia using permite usar tipos sin escribir el nombre completo con los namespaces.
Siempre se puede usar el nombre completo sin necesidad de utilizar “using”.
• Ejemplo: Declaramos 3 variables usando las dos clases anteriores:
using Universidad;
5
Una Aplicación Gráfica Simple Los nombres por
defecto pueden
tener un número
al final.
Agregar estos controles:
Etiqueta (Label): C# usa el nombre por defecto label1.
Cambiar algunas propiedades para probar, como el tamaño
Fichero [Link]:
Propiedad StartupUri: Indica qué ventana se empieza a
6
Una Aplicación Gráfica Simple
Si hace doble clic sobre el botón del formulario:
Se crea la función que se ejecutará cuando se use el botón
Ok (evento Click). Añadir este código:
private void Ok_Click(object sender, RoutedEventArgs e)
{
[Link]("Hola " + [Link]);
}
Palabras Reservadas
No se pueden usar para otro propósito.
Se escriben en azul en el editor de C#:
abstract, as, base, bool, break, byte,
case, catch, char, checked, class,
const, continue, decimal, default,
delegate, do, double, else, enum, event,
explicit, extern, false, finally, fixed,
float, for, foreach, goto, if, implicit,
in, int, interface, internal, lock, is,
long, namespace, new, null, object,
operator, out, override, params,
private, protected, public, readonly,
ref, return, sbyte, sealed, short,
sizeof, stackalloc, static, string,
struct, switch, this, throw, true, try,
typeof, uint, ulong, unchecked, unsafe,
ushort, using, virtual, void, while.
14
7
El método Main()
15
Sintaxis
Identificadores:
Son nombres para tipos, métodos, atributos,
variables, etc.
Debe ser una palabra sin blancos.
Caracteres Unicode.
Debe empezar con una letra o subrayado (_).
Distingue mayúsculas y minúsculas.
No debe entrar en conflicto con palabras
reservadas.
16
8
Visión general
Variables y constantes
• Declaración similar a C++:
– No hay variables globales. • Con tipo float fallaría porque 3.14 es una
constante tipo double.
static void Main() • Habría que usar: const float pi = 3.14F;
• Lo mismo si es una variable (sin const).
{
const double pi = 3.14; // Constante
const int r = 2;
9
Variables y constantes
El ámbito de una variable o constante comienza en el punto
de declaración y finaliza al final de su bloque.
Cada bloque o ámbito puede ser una función, una estructura
de control (for, while, if…).
Dentro del ámbito de una variable o constante es un error
declarar otra variable o constante con el mismo nombre.
{
int x;
{
...
int x; // Error: ya existe x
...
}
...
}
19
Sentencias y expresiones
10
Tipos Predefinidos o Primitivos
Son “tipos valor”: No hay que reservar memoria
explícitamente, sino que basta con declarar una variable.
Declarar variables (como en C): <tipo> <lista_variables>;
Tipos
enteros
• NOTA: Todos los tipos de datos primitivos en C# son objetos en el espacio de nombres System.
Para cada tipo, se proporciona un nombre corto o alias. Por ejemplo, int es el nombre corto
correspondiente a System.Int32, y double es la forma abreviada de [Link].
22
11
Tipos predefinidos: Tipos Reales
float / double:
Siguen la especificación IEEE 754.
Soporta ± 0, ± Infinity, NaN.
decimal:
Usa 16 bytes: Esencialmente un valor de 96 bits
escalado por una potencia de 10.
Comparado con double, tiene más precisión (29
dígitos significativos), pero un rango más
restringido (±1,0×10−28 a ±7,9×1028).
No soporta ceros con signo, infinitos o NaN.
Ejemplo:
decimal longitud = 6.69M;
23
24
12
Tipos predefinidos: char
25
26
13
Tipos predefinidos: string
Es una secuencia inmutable de caracteres Unicode.
Se puede acceder a cada char usando el operador [ ].
No se puede modificar: Para ello, usar arrays de char.
Declaración y asignación: string s = "Soy un string";
s2
28
14
El Sistema Unificado de Tipos
Conversiones implícitas:
Ocurren automáticamente al asignar datos de distinto tipo .
Se permiten si no hay pérdida de información (precisión).
Conversiones explícitas:
Requieren un cast (molde, similar al lenguaje C).
Puede haber pérdida de información (precisión, signo...).
Ambos tipos de conversiones pueden generar errores si no se
hacen bien y pueden ser definidas por el usuario.
int x = 123456;
long y = x; // implícita
short z = (short)x; // explícita: Riesgo de desbordamiento
double d = 1.2345678901234;
float f = (float)d; // explícita: Riesgo de perder decimales
long l = (long) d; // explícita: Riesgo de perder decimales
29
...
Implementa métodos de propósito general:
public bool Equals(object obj) Determina si el objeto
especificado es igual al objeto actual.
Ej.: Para dos variables x e y del mismo tipo: if ([Link](y)) ...
public string ToString() Devuelve un string que representa al
objeto actual. Se emplea para crear una cadena de texto legible para el
usuario que describe el objeto. La implementación predeterminada devuelve
el nombre completo del tipo del objeto object.
public Type GetType() Obtiene el objeto Type del tipo exacto en
tiempo de ejecución de la instancia actual.
Ej.: Si d es un double, también es un object, y esta sentencia escribe
“[Link]”: [Link] ([Link]());
30
15
Variables de tipo implícito: var
C# tiene la palabra var para declarar variables cuyo
tipo tendrá que calcular C# a partir del valor de
inicialización:
Ejemplos:
var valor = 99;
var frase = "Ya es tarde";
declaración.
No pueden cambiar de tipo durante la ejecución.
condiciones generales.
31
Enumeraciones enum
Arrays int[], string[]
Interfaces interface
Tipos referencia class
Tipos valor struct
32
16
Clases y Objetos
CLASE (class): Mecanismo para manipular
entidades en las aplicaciones (concepto similar
al TIPO de datos).
Las aplicaciones necesitan manipular entidades:
Cosas como clientes, motores, componentes... o algo
más abstracto como transacciones u operaciones.
De cada entidad es importante conocer:
1. Estado: Es la Información que necesitamos, formada
por datos llamados Áreas, Campos o Atributos
(fields).
2. Métodos (Methods): Operaciones posibles sobre cada
objeto de esta clase (funciones o procedimientos).
OBJETO (object, instance): Instancia de
una CLASE (concepto similar al de VARIABLE
de un TIPO de dato concreto).
Los objetos de una clase comparten su
comportamiento. 33
Clases y Objetos
VEHÍCULO
ANIMAL
PUNTO_2D
FIGURA (1, 3)
(5, 2.5)
(2, 2)
(2, 1)
34
17
Estado y Métodos
Definición de Funciones/Métodos
La sintaxis de las funciones es similar a C/C++.
Toda función (o método) debe estar en una clase.
Deben devolver un valor (con return), o bien ser
de tipo void.
Ej.: // Método que suma dos enteros:
// Muestra la suma y la devuelve
int Suma(int a, int b)
Para poner un { int resultado = a + b;
número en un
TextBox hay [Link] = [Link]();
que pasarlo a return resultado;
tipo string.
}
Objeto Método
Llamada: Es similar a C.
Para llamar a un método de un objeto se pone el nombre
del objeto y luego un punto: [Link]()
36
18
Definición de clases: Ámbito de variables
19
Sentencias condicionales: if
20
Ej: Mostrar Constantes de varios Tipos
Crear una aplicación WPF con este formato:
Objeto ListBox llamado EligeTipo : Inserte los ocho tipos de datos,
usando su propiedad Items (botón “...”).
Botón “Agregar” escogiendo para las ocho opciones el tipo ListBoxItem.
En la propiedad Content se deben escribir los ocho tipos de datos indicados.
Programar el evento
item concreto.
Ambas opciones abren la función que
SelectionChangedEventArgs e)
{ switch ([Link])
{ case 0: [Link] = "42";
break;
case 1: [Link] = "42L"; // L es sufijo para long
break;
case 2: [Link] = "0.42F"; // F sufijo para float
Si en el switch queremos usar el string de cada opción:
break;
switch ([Link]())
break;
case 7: [Link] = "false";
. . .
break;
} Se ponen en el orden empleado, empezando en CERO:
}
int, long, float, double, decimal, string, char y bool. 42
21
Sufijos para constantes numéricas
Las constantes numéricas (o literales) son de un tipo por
defecto, pero podemos cambiar ese tipo añadiendo un sufijo:
Una constante entera sin sufijo será del primer tipo en el que se puede
representar su valor: int, uint, long, ulong.
Las constantes reales se pueden escribir como enteros, como reales
con el punto, o en notación científica, y por defecto son double.
Los sufijos pueden ir en mayúscula o minúscula, pero se recomienda
usar siempre mayúscula.
43
22
Operadores de C#
C# proporciona operadores, cuyo significado está
definido para los tipos predefinidos.
Algunos operadores pueden ser sobrecargados.
Ej: La suma + sirve para varios tipos.
Asociatividad:
Los operadores de asignación y el condicional ternario son
asociativos hacia la derecha: Las operaciones son realizadas de
derecha a izquierda.
Ej.: x = y = z se evalúa como x = (y = z)
Los demás operadores binarios son asociativos hacia la
izquierda: Operaciones se ejecutan de izquierda a derecha.
Ej.: x + y + z se evalúa como (x + y) + z
Utilizar paréntesis para controlar el orden.
45
23
Operadores: Por Precedencia
Categoría Operadores
Sumar: +
Aditivos
Restar: –
Desplazamiento Shift bits left: <<
(bits) Shift bits right: >>
Menor que: <
Mayor que: >
Menor que o igual a: <=
Lógicos
Mayor que o igual a: >=
Igualdad/compatibilidad de tipos: is
Conversión de tipos: as
int a = 2;
[Link]("a<<1 es {0} y a<<2 es {1}", a<<1, a<<2); // 4 y 8
[Link]("a>>1 es {0} y a>>2 es {1}", a>>1, a>>2); // 1 y 0
47
int a = 2, b = 3;
[Link]("a&b es {0} y a|b es {1}", a&b, a|b); // 2 y 3
[Link]("a^b es {0} y ~a es {1}", a ^ b, ~a); // 1 y -3
48
24
Operadores: Observaciones
Tipo de una operación: depende del tipo de sus
operandos:
Expresión double: 5.0 / 2.0 Resultado: 2.5
Expresión int: 5 / 2 Resultado: 2
Expresión double (usa int-double): 5 / 2.0 2.5
Esta mezcla de tipos funciona pero no se recomienda.
ResizeMode a “CanMinimize”,
para que permita minimizar la
aplicación, pero no cambiar su
tamaño.
Llamar a los Cuadros de Texto
respectivamente: L, d, D, y Volumen.
En Volumen, marcar la propiedad
IsReadOnly, para que no pueda
escribirse en él.
Mostrar ventanas de error si hay
valores negativos, o si d>D.
50
25
Ej: Volumen de un Tonel (aplicación WPF)
Modificaciones adicionales:
Mostrar el resultado también en litros, siempre.
Redondear a 5 decimales: V = [Link](V, 5);
Poner el texto “Pulsa botón” en los dos volúmenes, cuando
se cambie alguno de los 3 datos de entrada.
Poder poner cada dato de entrada en una unidad de medida, y
el resultado mostrarlo en todas.
52
26
Ej: Volumen de un Tonel (aplicación WPF)
Mostrar el resultado también en litros (o decímetros cúbicos, dm3):
. . .
switch ([Link])
{
case 0: [Link] = "m^3";
V = V * 1000; // Conversión a litros: 1 m^3 = 1000 l.
break;
case 1: [Link] = "cm^3";
V = V * 1e-3; // Conversión a litros: 1 cm^3 = 0.001 l.
break;
case 2: [Link] = "mm^3";
V = V * 1e-6; // Conversión a litros: 1 mm^3 = 0.000001 l.
break;
}
Vol_litros.Text = [Link]();
} Recuerde:
• <tipo>.Parse(cad) convierte la cadena cad a un número de ese tipo.
• <variable>.ToString() convierte esa variable a cadena (no tiene argumento). 54
27
Esquema de la Calculadora Sencilla
Esquema del Documento:
Se accede con el botón derecho sobre el
formulario o en el menú Ver (otras ventanas).
Muestra todas las herramientas de una
ventana.
Por defecto una ventana tiene un elemento
llamado Grid.
Grid es un "panel" que gestiona cómo posicionar los
controles, principalmente cuando la ventana cambia
de tamaño.
Grid es flexible pero complejo: Por defecto tiene sólo
una celda en la que poner los controles, pero pueden
definirse múltiples filas y columnas.
Estas propiedades de los demás controles están
referidas al panel en el que se encuentran:
HorizontalAlignment: Valores Right/Left/Center/Stretch.
VerticalAlignment: Valores Top/Down/Center/Stretch.
Stretch estira el elemento para rellenar todo el espacio
menos los márgenes establecidos.
Margin: Son 4 valores (izda,arriba,dcha,abajo), que miden
las distancias según la alineación.
Existen otros controles panel:
StackPanel: Sitúa los controles verticalmente.
WrapPanel: Los sitúa en filas de izda. a dcha., cambiando
de fila cuando una fila se llena. 55
28
Sentencias de bucle: while y do-while
Notas:
La Inicialización y la Actualización pueden ser múltiples separando cada
una por coma. Si ambas se dejan vacías es como poner un while.
Existe el bucle foreach que es especial para recorrer arrays.
58
29
Ej: Calcular divisores (aplicación WPF)
Controles y nombres:
Dos TextBox llamados numero
y divisores.
En el segundo cambiar estas
propiedades: Auto en
VerticalScrollBarVisibility y
HorizontalScrollBarVisibility, y
marcar IsReadOnly.
Una etiqueta y dos botones.
if (num_divisores == 2)
[Link] = [Link];
30
Sobrecargar Métodos
Se pueden declarar dos métodos con el mismo nombre siempre
que tengan distinto número y/o tipo de argumentos.
El valor de retorno se ignora.
Según los argumentos de la llamada, el compilador sabrá qué
método ejecutar.
Es útil cuando necesita realizar la misma operación en distintos
tipos de datos.
Muchos métodos estándar de C# están sobrecargados.
Ejemplos:
61
31
Manejo de excepciones
Las excepciones son el mecanismo de C# para manejar
condiciones de error graves e inesperadas cuando el programa
se está ejecutando.
El error producido impide al programa continuar, por lo que hay
que hacer algo específico: Informar al usuario para que aporte
información, usar valores distintos…
Una excepción es cualquier error o comportamiento inesperado
encontrado en la ejecución de un programa que impide continuar.
Pueden ser o no culpa del usuario de la aplicación.
No pueden ser ignoradas.
No tienen que ser manejadas en el punto en el que ocurren.
Se proporcionan excepciones estándares.
El usuario puede definir sus propios tipos de excepciones.
Observaciones:
Son superiores a los valores de retorno.
Pueden ser usadas incluso en situaciones donde no se podrían retornar valores (Ej:
accediendo a una propiedad).
63
Manejo de excepciones
Sentencias: try... catch... finally...
Bloque try:
Contiene código que podría lanzar o generar excepciones.
Si no hay excepciones se ejecuta completamente.
Si se produce una excepción, la ejecución salta fuera del
bloque try y va al manejador de la excepción (bloque catch
específico).
Bloque catch:
Un bloque catch maneja una excepción (o varias).
Pueden existir múltiples bloques catch para manejar
diferentes clases de excepciones de forma separada.
Bloque finally:
Contienen código que se ejecutará siempre al final.
Es opcional.
64
32
Manejo de excepciones
try
{
// Código para ejecución normal
}
catch (<Exception> <VariableEx>)
{
// Manejo de errores (puede haber varios bloques catch)
}
finally
{
// Limpieza o liberación de recursos
}
try
{ int OpIzdo = [Link]([Link]);
int OpDcho = [Link]([Link]);
int respuesta = Calculos(OpIzdo, OpDcho);
[Link] = [Link]();
}
catch (FormatException fEx)
{ [Link]("ERROR: Introduce enteros. "
+ [Link]);
}
catch (OverflowException oEx)
{ [Link]("ERROR: Enteros muy grandes. "
+ [Link]);
}
66
33
Excepciones: Buscando el manejador
Excepciones
Se organizan en familias,
formando una jerarquía.
Ej.: SystemException
engloba a FormatException y
a OverflowException.
Exception: Familia superior.
Capturando esta se atraparán todas
las excepciones posibles.
34
Excepciones: Ejemplo en el ejercicio del Tonel
private void CalcularVolumen_Click(object sender, RoutedEventArgs e)
{ try
{ double LL = [Link]([Link]), //Conversión a double
dd = [Link]([Link]),
DD = [Link]([Link]);
if (dd > DD)
[Link]("El diámetro menor debe ser menor que el mayor.");
else if (dd < 0 || DD < 0 || LL < 0)
[Link]("Poner valores positivos siempre.");
else { double a = dd / 2 + 2 / 3.0 * (DD / 2 - dd / 2);
. . . // Falta código aquí...
}
}
Captura la excepción, si algún Parse genera un error de formato.
NOTA: Para saber qué Parse generó el error podemos usar una variable
catch (FormatException) int X=1; declarada antes de try y que incrementamos tras cada Parse, y
{ en el módulo catch ponemos un if (X==1) ... else if (X==2) ...
35
Excepciones: Lanzar con throw
Sentencia throw: Lanza una excepción explícitamente.
Cuando ocurre algún hecho que impida la ejecución normal del
programa.
Una excepción es una instancia de
[Link] o de una clase derivada:
Contiene información sobre la excepción. Propiedades:
Message: Texto que describe la condición de error
StackTrace: Secuencia de llamadas a métodos que provocaron la
excepción.
Hay excepciones predefinidas para la mayoría de los errores
comunes y si no, se pueden crear nuevas.
Ej.: Si un argumento se sale de rango, existe la excepción
ArgumentOutOfRangeException.
Crear nuevos tipos de excepciones permite personalizar nuestros
tipos de errores y un mejor control de ellos.
Se puede relanzar una excepción, o capturar una
excepción y lanzar otra diferente.
71
try
{ [Link]("Bloque try");
throw new Exception("Mensaje de error.");
[Link]("Esto no se ejecuta.");
}
catch (ArgumentNullException e) // No se produce
{ [Link]("Argumento null"); Un manejador general
captura las excepciones
} específicas, pero no al revés.
catch (Exception e)
{ [Link]("catch: " + [Link]);
}
finally
{ [Link]("Bloque finally");
}
Bloque try
Escribe: catch: Mensaje de error.
Bloque finally
72
36
Herencia
FiguraCerrada
73
Se declara un array
de tipo
FiguraCerrada.
En tiempo de
ejecución los
elementos son
Rombo, Círculo,
etc.
74
37
Polimorfismo y Vinculación Dinámica
• La vinculación dinámica resulta el complemento
indispensable del polimorfismo sobre los datos, y
consiste en que:
– La invocación del método que ha de resolver un mensaje se
retrasa al tiempo de ejecución, y se hace depender del tipo
dinámico del objeto receptor.
Polígono :Polígono
perímetro{^...}
obj : Cuadrado
Cuadrado :Cuadrado
perímetro{^4*lado}
75
38
Clases: Accesibilidad y Uso
Accesibilidad: Controla desde dónde se puede
acceder a cada atributo y procedimiento de una clase,
individualmente:
Privados (private): Atributos y procedimientos que sólo se
pueden acceder desde otros procedimientos de la misma clase
(por defecto).
Públicos (public): Son accesibles desde el interior y exterior
de la clase.
En el ejemplo anterior, si Circle tuviera todos sus atributos y
procedimientos privados, no podrían ser accedidos desde fuera de la clase,
por lo que la clase no tendría utilidad: no se podría modificar ni el radio de
un círculo.
77
class Punto {
private double x, y; // Coordenadas de cada punto 2D (privadas)
// Escribe el cuadrante donde está un punto Observe cómo se
public void EscribirCuadrante() {
if (x > 0 && y > 0) [Link]("Primer cuadrante."); crea un objeto
else if (x < 0 && y > 0) [Link]("Segundo cuadrante."); de una clase:
else if (x < 0 && y < 0) [Link]("Tercer cuadrante.");
else if (x > 0 && y < 0) [Link]("Cuarto cuadrante.");
else [Link]("No está en un cuadrante.");
[Link](); // Pulsar tecla
}
// Inicializa a cero las coordenadas class Program {
public void Inicializar_a_cero() { static void Main(string[] args) {
x = y = 0; Punto punto1 = new Punto(); //Creación
} punto1.Inicializar_a_cero();
// Pide un punto al usuario [Link](4, -5);
public void Inicializar() { [Link]();
string linea; }
[Link]("Dame la coordenada x :"); }
linea = [Link](); Imprime: Cuarto cuadrante.
x = [Link](linea);
[Link]("Dame la coordenada y :");
linea = [Link](); 1. Los atributos son private, i.e., NO pueden ser
y = [Link](linea); accedidos desde fuera de la clase.
} - En Main no podemos hacer: punto1.x = 3;
// Traslada un punto las distancias (x1,y1)
public void Trasladar(double x1, double y1) { 2. Todos los métodos pueden acceder a los atributos.
x = x + x1; 3. Los métodos son public, i.e., SÍ pueden accederse
y = y + y1; desde fuera de la clase, como se hace en Main.
} 4. Se facilitan dos funciones para inicializar un punto.
} 5. Atributos y métodos pueden ser private/public.
78
39
Definir una Clase: Accesibilidad y Constructores
Es frecuente poner los atributos como privados para evitar que sean
modificados de forma errónea:
Modificándolos a través de métodos podemos garantizar que sólo se
modifiquen cumplen los requisitos que queramos.
Los métodos de la clase siempre pueden acceder a los demás métodos y
atributos de dicha clase.
Los atributos se inicializan automáticamente (a 0, false, o null),
pero si son privados no se les puede dar valor, salvo que se programe un
constructor, que es un procedimiento que se ejecuta cuando se crea un
objeto con new:
Constructor: Es un método público con el mismo nombre de la clase.
No es muy útil que sea privado, pues sólo se podrían usar objetos de esa
clase desde métodos de dicha clase.
No pueden retornar ningún valor (no se pone ni void).
Si no escribe ningún constructor, el compilador genera uno por defecto que
no haga nada.
Constructor default: Aquél que no tiene argumentos.
Sobrecargar constructores: Puede programar varios constructores con
distintos argumentos, además del constructor default.
Se ejecutará el constructor que tenga el mismo número y tipo de sus
argumentos.
Si define un constructor, C# no genera ninguno por defecto:
Si además desea un constructor default sin argumentos, tendrá que
declararlo explícitamente. 79
40
Ejemplo: Clase Mamífero
class Mamifero
{
int num_patas, vidas; // Son privados por defecto
bool acuatico;
41
Métodos y atributos static
En C# todos los procedimientos deben definirse dentro de una clase,
pero no siempre se requiere una instancia para llamarlos.
Ej.: La clase Math tiene definidos procedimientos y atributos que pueden usarse
sin declarar ningún objeto de la clase Math.
[Link], [Link], [Link], [Link], [Link], [Link]...
Métodos y atributos static: Son aquellos que son útiles sin necesitar
que se ejecuten sobre una instancia previamente creada.
Para acceder a ellos se usa el nombre de la clase: <Clase>.<Atributo/Método>
Métodos static sólo pueden acceder a otros métodos y atributos
static.
Los métodos de instancia (no static) requieren crear primero una instancia.
Atributos static son compartidos entre todos.
Los atributos no static son locales para cada instancia de su clase.
Deben ser inicializados. Ej.: private static int objectCount = 0;
Es una variable private static para contar los objetos se crean. Habría que
incrementar ese atributo en cada procedimiento constructor (debe ser private
para asegurar que nadie más cambia su valor). Para acceder a su valor desde
fuera, se debe crear un procedimiento public static, que devuelva el valor.
Si el valor es constante es mejor definirlo con const.
Las contantes con const son también static.
83
42
Parámetros ref y out
Paso de argumentos ordinario es por valor:
El procedimiento trabaja con una copia del valor.
Ejemplo:
static void Algo(int argumento)
{ argumento++;
}
static void Main()
{ int x=8;
Algo(x);
[Link](x); // Escribe 8
}
43
Parámetros ref y out
Paso por Referencia, sólo de Salida (out):
Si un argumento es sólo de salida no tiene sentido que se le obligue a
que tenga un valor antes de invocar al procedimiento.
Palabra clave out en la definición y en la llamada al
procedimiento: Indica que el argumento debe cambiar en el
procedimiento y si no lo hace se genera un error de compilación.
Ejemplo:
static void Algo(out int argumento)
{ argumento = 7;
}
static void Main()
{ int x; // OJO: No inicializado
Algo(out x);
[Link](x); // Escribe 7
}
Puede usar los modificadores ref y out con tipos referencia y tipos
valor, con el mismo efecto: Si reasigna el argumento formal a otro
objeto, el argumento actual de la llamada será otro objeto. 87
44
C# incluye muchos más Controles
ComboBox: Para mostrar datos en un cuadro
desplegable, aunque permite al usuario escribir un
elemento de la lista.
Los elementos se añaden en la propiedad “Items”:
Image: Para añadir una imagen al formulario.
La propiedad “Source” indica el fichero de la imagen.
CheckBox: Permite seleccionar o no un elemento.
La propiedad “IsChecked” indica si está o no seleccionado.
Toma 2 ó 3 valores, según la propiedad “IsThreeState” (true, false, y null).
GroupBox: Control que muestra un marco alrededor
de un grupo de controles con un título opcional.
TabControl: Administra un conjunto relacionado de
páginas de fichas.
<Window x:Class="Nacimiento.Window1"
xmlns="[Link]
xmlns:x="[Link]
xmlns:wf="clr-namespace:[Link];assembly=[Link]"
Title="Window1" Height="300" Width="300">
45
Ej: Fecha de Nacimiento (aplicación WPF)
46