Introducción a C# y Estructuras de Control
Introducción a C# y Estructuras de Control
Objetivo de la Unidad II
- Conocer la estructura del programa, haciendo uso de sentencias de control secuenciales.
- Conocer las características y forma de trabajo de C# y .NET
- Explorar la forma de Programar en C# a través de Consola.
Estrcutu
C# es un lenguaje orientado a objetos, por lo que en lenguaje todo es trabajado como un objeto.
Actualmente, C# es un estándar ECMA (European Computer Association Manufacturing) e ISO.
1
La sintaxis y estructuración de C# es muy parecida a la de C++ o Java, puesto que la intención de
Microsoft es facilitar la migración de códigos escritos en estos lenguajes a C# y facilitar su aprendizaje
a los desarrolladores habituados a ellos. Sin embargo, su sencillez y el alto nivel de productividad son
comparables con los de Visual Basic.
Características de C#:
Con la idea de obtener una visión general del lenguaje, a continuación se presenta de manera
resumida las principales características de C# Alguna de las características aquí señaladas no son
exactamente propias del lenguaje sino de la plataforma .NET en general, y si aquí se comentan es
porque tienen una repercusión directa en el lenguaje:
Sencillez: C# elimina muchos elementos que otros lenguajes incluyen y que son innecesarios
en .NET. Por ejemplo:
El tamaño de los tipos de datos básicos es fijo e independiente del compilador, sistema
operativo o máquina para que se compile (no como en C++), lo que facilita la
portabilidad del código.
No se incluyen elementos poco útiles de lenguajes como C++ tales como macros,
herencia múltiple o la necesidad de un operador diferente del punto (.) acceder a
miembros de espacios de nombres (::)
Modernidad: C# incorpora en el propio lenguaje elementos que a lo largo de los años ha ido
demostrándose son muy útiles para el desarrollo de aplicaciones y que en otros lenguajes
como Java o C++ se encuentran presentes, como el tipo básico decimal que permita realizar
operaciones de alta precisión con reales de 128 bits (muy útil en el mundo financiero), la
inclusión de una instrucción foreach que permita recorrer colecciones con facilidad y es
ampliable a tipos definidos por el usuario, la inclusión de un tipo básico string para
representar cadenas o la distinción de un tipo bool específico para representar valores lógicos.
2
En lo referente a la encapsulación es importante señalar que aparte de los típicos
modificadores public, private y protected, C# añade un cuarto modificador llamado internal,
que puede combinarse con protected e indica que al elemento a cuya definición precede sólo
puede accederse desde su mismo ensamblado.
Respecto a la herencia -a diferencia de C++ y al igual que Java- C# sólo admite herencia simple
de clases ya que la múltiple provoca más problemas que beneficios y en la mayoría de los
casos su utilidad puede ser simulada con facilidad mediante herencia múltiple de interfaces.
De todos modos, esto vuelve a ser más bien una característica propia del CTS que de C#.
Por otro lado y a diferencia de Java, en C# se ha optado por hacer que todos los métodos sean
por defecto sellados y que los redefinibles hayan de marcarse con el modificador virtual (como
en C++), lo que permite evitar errores derivados de redefiniciones accidentales. Además, un
efecto secundario de esto es que las llamadas a los métodos serán más eficientes por defecto
al no tenerse que buscar en la tabla de funciones virtuales la implementación de los mismos a
la que se ha de llamar. Otro efecto secundario es que permite que las llamadas a los métodos
virtuales se puedan hacer más eficientemente al contribuir a que el tamaño de dicha tabla se
reduzca.
Seguridad de tipos: C# incluye mecanismos que permite asegurar que los accesos a tipos de
datos siempre se realicen correctamente, lo que evita que se produzcan errores difíciles de
detectar por acceso a memoria no perteneciente a ningún objeto, es especialmente necesario
en un entorno gestionado por un recolector de basura. Para ello se toman medidas del tipo:
Sólo se admiten conversiones entre tipos compatibles. Esto es, entre un tipo y
antecesores suyos, entre tipos para los que explícitamente se haya definido un
operador de conversión, y entre un tipo y un tipo hijo suyo del que un objeto del
primero almacenase una referencia del segundo (downcasting) Obviamente, lo último
sólo puede comprobarlo en tiempo de ejecución el CLR y no el compilador, por lo que
en realidad el CLR y el compilador colaboran para asegurar la corrección de las
conversiones.
Se comprueba que todo acceso a los elementos de una tabla se realice con índices que
se encuentren dentro del rango de la misma.
3
A diferencia de Java, C# incluye delegados, que son similares a los punteros a funciones
de C++ pero siguen un enfoque orientado a objetos, pueden almacenar referencias a
varios métodos simultáneamente, y se comprueba que los métodos a los que apunten
tengan parámetros y valor de retorno del tipo indicado al definirlos.
Mejoras sobre C++ en las áreas de seguridad de datos, versionamiento, eventos y recolección de
basura.
Acceso al Sistema Operativo, COM y APIs
Soporta el modo unsafe que permite el uso de punteros como en C.
Generación de documentación XML automática.
Creación de páginas ASP.NET y servicios Web.
El programa tiene un punto de entrada que es el método Main, perteneciente a una clase. Más
adelante se desarrollarán ejercicios que necesiten de la definición e implementación de clases. Por
ahora es suficiente con que en el método Main se invoque la ejecución del ejercicio que se desea
probar; de este modo, se pueden escribir en un mismo archivo de código, todos los ejercicios; el uso
de otras clases favorece a la idea de que cada porción de código este documentada y realice una sola
tarea (luego se verá en más detalle).
C# es un lenguaje orientado a objetos elegante y con seguridad de tipos que permite a los
desarrolladores compilar diversas aplicaciones sólidas y seguras que se ejecutan en .NET Framework.
Puede utilizar C# para crear aplicaciones cliente de Windows, servicios Web XML, componentes
distribuidos, aplicaciones cliente-servidor, aplicaciones de base de datos, y más. Visual C# proporciona
un editor de código avanzado, cómodos diseñadores de interfaz de usuario, depurador integrado y
numerosas herramientas más para facilitar el desarrollo de aplicaciones basadas el lenguaje C# y .NET
Framework.
La sintaxis de C# es muy expresiva, pero también es sencilla y fácil de aprender; la sintaxis de C#
basada en signos de llave podrá ser reconocida inmediatamente por cualquier persona familiarizada
con C, C++ o Java.
C# admite métodos y tipos genéricos, que proporcionan mayor rendimiento y seguridad de tipos, e
iteradores, que permiten a los implementadores de clases de colección definir comportamientos de
Todas las variables y métodos, incluido el método Main que es el punto de entrada de la aplicación, se
encapsulan dentro de definiciones de clase.
Una clase puede heredar directamente de una clase primaria, pero puede implementar cualquier
número de interfaces. Los métodos que reemplazan a los métodos virtuales en una clase primaria
requieren la palabra clave override como medio para evitar redefiniciones accidentales. En C#, una
struct es como una clase sencilla; es un tipo asignado en la pila que puede implementar interfaces
pero que no admite la herencia.
4
Además de estos principios básicos orientados a objetos, C# facilita el desarrollo de componentes de
software a través de varias construcciones de lenguaje innovadoras, entre las que se incluyen las
siguientes:
Firmas de métodos encapsulados denominadas delegados, que habilitan notificaciones de
eventos con seguridad de tipos.
Propiedades, que actúan como descriptores de acceso para variables miembro privadas.
Atributos, que proporcionan metadatos declarativos sobre tipos en tiempo de ejecución.
Comentarios en línea de documentación XML.
Language-Integrated Query (LINQ) que proporciona funciones de consulta integradas en una
gran variedad de orígenes de datos.
5
1.1 La evolución de los C hasta C#
Para poder programar en C#, se hará a través de Visual Estudio, la cual nos muestra la siguiente
pantalla
Para compilar desde el IDE de Visual Studio, se deberán realizar los siguientes pasos:
6
b) Elegir como tipo de proyecto: Proyectos de Visual C#, y como plantilla “Aplicación de consola”
Este es un buen momento para dar nombre al proyecto (caja de textos Nombre) y decidir el
lugar en el que será almacenado (caja de texto Ubicación). En este ejemplo se dejarán los
valores que el programa propone por defecto. El resultado será el de la figura siguiente:
Se crea una clase Class1, que es la que debe implementar la funcionalidad y que posee un
método Main() y un constructor (como se visualiza en la figura anterior). Como se ve, la
estructura mínima que se ofrece es una clase, ya que la filosofía C# para .NET es trabajar
únicamente con clases, no con funciones ni variables globales.
7
c) El siguiente paso es añadir el código necesario apoyándose en las facilidades de desarrollo que
ofrece el IDE del Visual Studio
Se puede observar que, directamente, se importa el namespace System y otros que son de
común uso. Cuando se esté escribiendo el código, después de escribir la clase Console y el
punto para invocar al método WriteLine, automáticamente se presenta una ventana donde se
puede elegir el nombre del método, bien con el cursor o bien escribiendo las primeras letras
del método. Cuando el foco esté en el método, basta con pulsar RETURN y se escribe el
método WriteLine(). Al abrir el paréntesis, aparece la ayuda sobre el tipo de argumentos que
puede recibir el método.
e) Depurar de un programa
8
En cambio, si selecciona la opción Iniciar sin depurar, muestra la pantalla con el resultado de
ejecución, como se observa a continuación en la siguiente figura.
9
2. Estructura Básica de un Programa
Los programas en C# pueden constar de uno o varios archivos. Cada archivo puede contener
cero o varios espacios de nombres. Un espacio de nombres puede contener tipos como son
clases, estructuras, interfaces, enumeraciones y delegados, además de otros espacios de
nombres. A continuación, se muestra el esqueleto de un programa en C# que contiene todos
estos elementos.
Una solución debe de contener los siguientes elementos, que se muestran en la siguiente
figura:
Cuando se crea una aplicación de consola con Visual Studio, las primeras líneas en el editor de
código contienen directivas using que muestran varios espacios de nombres de .NET
Framework.
Un espacio de nombres es una manera de agrupar clases y estructuras de una manera que
limita su ámbito y evita conflictos de nombres con otras clases y estructuras.
Si utilizan clases de otros espacios de nombres en la biblioteca de clases, se debe agregar una
directiva using para ese espacio de nombres al archivo de código fuente. El permitir el uso de
tipos en un espacio de nombres, hace que no sea necesario calificar el uso de un tipo en dicho
espacio de nombres
10
2.2 Librería de clase base (BCL)
La Librería de Clase Base (BCL) es una librería incluida en el .NET Framework formada por
cientos de tipos de datos que permiten acceder a los servicios ofrecidos por el CLR y a las
funcionalidades más frecuentemente usadas a la hora de escribir programas. Además, a partir
de estas clases prefabricadas el programador puede crear nuevas clases que mediante
herencia extiendan su funcionalidad y se integren a la perfección con el resto de clases de la
BCL.
Por ejemplo, implementando ciertos interfaces podemos crear nuevos tipos de colecciones
que serán tratadas exactamente igual que cualquiera de las colecciones incluidas en la BCL.
Esta librería está escrita en CIL, por lo que puede usarse desde cualquier lenguaje cuyo
compilador genere CIL. A través de las clases suministradas en ella es posible desarrollar
cualquier tipo de aplicación, desde las tradicionales aplicaciones de ventanas, consola o
servicio de Windows NT hasta los servicios Web y páginas ASP.NET.
Es tal la riqueza de servicios que ofrece que incluso es posible crear lenguajes que carezcan de
librería de clases propia y sólo se basen en la BCL -como C#.
Dada la amplitud de la BCL, ha sido necesario organizar las clases en ella incluida en espacios
de nombres que agrupen clases con funcionalidades similares.
11
System.Security Acceso a la política de seguridad en que se basa el CLR
2.3 Comentarios
Un comentario es texto que se incluye en el código fuente para facilitar su lectura a los
programadores y cuyo contenido es, por defecto, completamente ignorado por el compilador.
Suelen usarse para incluir información sobre el autor del código, para aclarar el significado o el
porqué de determinadas secciones de código, para describir el funcionamiento de los métodos
de las clases, etc.
En C# hay dos formas de escribir comentarios. La primera consiste en encerrar todo el texto
que se desee comentar entre caracteres /* y */ siguiendo la siguiente sintaxis:
/*<texto>*/
Estos comentarios pueden abarcar tantas líneas como sea necesario. Po ejemplo:
/* Esto es un comentario
que ejemplifica cómo se escribe comentarios que ocupen varias líneas */
Ahora bien, hay que tener cuidado con el hecho de que no es posible anidar comentarios de
este tipo. Es decir, no vale escribir comentarios como el siguiente:
Esto se debe a que como el compilador ignora todo el texto contenido en un comentario y sólo
busca la secuencia */ que marca su final, ignorará el segundo /* y cuando llegue al primer */
considerará que ha acabado el comentario abierto con el primer /* (no el abierto con el
segundo) y pasará a buscar código. Como el */ sólo lo admite si ha detectado antes algún
comentario abierto y aún no cerrado (no mientras busca código), cuando llegue al segundo */
considerará que ha habido un error ya que encontrará el */ donde esperaba encontrar código.
12
Dado que muchas veces los comentarios que se escriben son muy cortos y no suelen ocupar
más de una línea, C# ofrece una sintaxis alternativa más compacta para la escritura de este
tipo de comentarios en las que se considera como indicador del comienzo del comentario la
pareja de caracteres // y como indicador de su final el fin de línea. Por tanto, la sintaxis que
siguen estos comentarios es:
// <texto>
// Este comentario ejemplifica como escribir comentarios abreviados de una sola línea
Estos comentarios de una sola línea sí que pueden anidarse sin ningún problema. Por ejemplo,
el siguiente comentario es perfectamente válido:
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
2.5 Namespace
13
La palabra clave namespace se utiliza para declarar un ámbito.
La capacidad de crear ámbitos dentro del proyecto permite organizar el código y le permite
crear tipos únicos globales.
2.6 Console
Cuando se inicia una aplicación de consola, el sistema operativo asocia automáticamente tres
arreglos de Entrada y Salida con la consola: flujo de entrada estándar, salida estándar, y el
flujo de salida de error estándar.
Así la aplicación puede leer la entrada del usuario (flujo de entrada estándar); escribir datos
normalmente en pantalla (flujo de salida estándar); y escribir datos de error en la pantalla
(flujo de salida de error estándar).
2.7 Class
La palabra clave class sirve para declarar las clases, como se muestra en la anterior figura. En
la línea: class Clase1, la clase se llama Clase1
De este modo se definiría una clase de nombre <nombreClase> cuyos miembros son los
definidos en <miembros> Los miembros de una clase son los datos y métodos de los que van a
disponer todos los objetos de la misma. Un ejemplo de cómo declarar una clase de nombre A
que no tenga ningún miembro es la siguiente:
class A
{}
14
Una clase así declarada no dispondrá de ningún miembro a excepción de los implícitamente
definidos de manera común para todos los objetos que creemos en C#. Todas las clases en c#
se derivan de la clase primaria: System.Object.
El lenguaje de C# utiliza las clases para organizar y empaquetar el código. De hecho, todo el
código ejecutable de C# debe estar contenido en una clase.
Si necesita mostrar varios elementos, utilice {0} para representar el primer elemento, {1} para
el segundo elemento, y así sucesivamente, de la forma siguiente.
El lenguaje de C# utiliza las clases para organizar y empaquetar el código. De hecho, todo el
código ejecutable de C# debe estar contenido en una clase, incluso en un programa breve
como "Hola bienvenido a intro". A continuación se muestra el programa completo que
muestra "Hola bienvenido a intro" en la ventana de la consola.
15
2.8 Main()
- Puede aceptar argumentos, lo cual resulta útil para crear programas de línea de comandos:
static void Main(string[] args)
{
//...
}
- O bien
static int Main(string[] args)
{
//...
return 0;
}
El parámetro del método Main es una matriz de tipo string que representa los argumentos de
la línea de comandos utilizados para invocar el programa.
Observe que, a diferencia de C++, esta matriz no incluye el nombre del archivo ejecutable
(.exe).
16
Como se ve, hay versiones de Main() que devuelven un valor de tipo int. Un int no es más que
un tipo de datos capaz de almacenar valor enteros comprendidos entre – 2.1471483.648 y
2.1471483.647, y el número devuelto por Main() sería interpretado como código de retorno
de la aplicación.
2.9 Método
Los métodos se declaran en una clase o struct especificando el nivel de acceso, como public o private,
modificadores opcionales como abstract o sealed, el valor de retorno, el nombre del método y
cualquier parámetro de método. Todas estas partes forman la firma del método.
Variables en C#
Una variable puede verse simplemente como un almacén de objetos de un determinado tipo al que
se le da un cierto nombre. Por tanto, para definir una variable sólo hay que decir cuál será el nombre
que se le dará y cuál será el tipo de datos que podrá almacenar, lo que se hace con la siguiente
sintaxis:
<tipoVariable> <nombreVariable>;
Una variable puede ser definida dentro de una definición de clase, en cuyo caso se correspondería
con el tipo de miembro que hasta ahora hemos denominado campo.
17
También puede definirse como un variable local a un método, que es una variable definida dentro del
código del método a la que sólo puede accederse desde dentro de dicho código. Otra posibilidad es
definirla como parámetro de un método, que son variables que almacenan los valores de llamada al
método y que, al igual que las variables locales, sólo puede ser accedida desde código ubicado dentro
del método. El siguiente ejemplo muestra cómo definir variables de todos estos casos:
class A
{
int x, z;
int y;
void F(string a, string b)
{
double p;
}
}
En este ejemplo las variables x, z e y son campos de tipo int, mientras que p es una variable local de
tipo double; a y b son parámetros de tipo string. Como se muestra en el ejemplo, si un método toma
varios parámetros las definiciones de éstos se separan mediante comas (carácter: , ), y si queremos
definir varios campos o variables locales (no válido para parámetros) de un mismo tipo podemos
incluirlos en una misma definición incluyendo en <nombreVariable> sus nombres separados por
comas.
Con la sintaxis de definición de variables anteriormente dada simplemente definimos variables pero
no almacenamos ningún objeto inicial en ellas. El compilador dará un valor por defecto a los campos
para los que no se indique explícitamente ningún valor según se explica en el siguiente apartado. Sin
embargo, a la variables locales no les da ningún valor inicial, pero detecta cualquier intento de leerlas
antes de darles valor y produce errores de compilación en esos casos.
Una variable representa la localización en memoria donde una instancia de un tipo es guardada.
Una variable representa un valor numérico o de cadena o un objeto de una clase.
El valor que la variable almacena puede cambiar, pero el nombre sigue siendo el mismo. Una variable
es un tipo de campo.
El código siguiente es un ejemplo sencillo de cómo declarar una variable de entero, asignarle un valor
y, a continuación, asignarle un nuevo valor.
Tipos de variables
18
Variables locales
Variables compartidas
- Se definen en la clase
- Permiten compartir datos entre los métodos de la clase.
Conflictos de ámbito
- El compilador no avisa se hay conflictos entre nombres de las variable locales y las de clase.
Tipos de datos
- Intrínsecos - Arrays
- Enumeraciones - Clases
- Estructuras - Interfases
- Punteros
- Delegados
19
Los tipos de datos básicos son ciertos tipos de datos tan comúnmente utilizados en la escritura de
aplicaciones que en C# se ha incluido una sintaxis especial para tratarlos.
Por ejemplo, para representar números enteros de 32 bits con signo se utiliza el tipo de dato
System.Int32 definido en la BCL, aunque a la hora de crear un objeto a de este tipo que represente el
valor 2 se usa la siguiente sintaxis:
System.Int32 a = 2;
Como se ve, no se utiliza el operador new para crear objeto System.Int32, sino que directamente se
indica el literal que representa el valor a crear, con lo que la sintaxis necesaria para crear entero de
este tipo se reduce considerablemente. Es más, dado lo frecuente que es el uso de este tipo también
se ha predefinido en C# el alias int para el mismo, por lo que la definición de variable anterior queda
así de compacta:
int a = 2;
20
Int32 Enteros normales 32 [-2.147.483.648, 2.147.483.647] int
Pese a su sintaxis especial, en C# los tipos básicos son tipos del mismo nivel que cualquier otro tipo
del lenguaje. Es decir, heredan de System.Object y pueden ser tratados como objetos de dicha clase
por cualquier método que espere un System.Object, lo que es muy útil para el diseño de rutinas
genéricas que admitan parámetros de cualquier tipo y es una ventaja importante de C# frente a
lenguajes similares como Java donde los tipos básicos no son considerados objetos.
El valor que por defecto se da a los campos de tipos básicos consiste en poner a cero toda el área de
memoria que ocupen. Esto se traduce en que los campos de tipos básicos numéricos se inicializan por
defecto con el valor 0, los de tipo bool lo hacen con false, los de tipo char con ‘\u0000’, y los de tipo
string y object con null.
Inicialización de variables
string s = "Hola";
Ámbito y Visibilidad:
22
Constantes en C#
23
El modificador const permite definir variables constantes.
Una constante no cambia nunca su valor.
Son implícitamente static
Una constante es otro tipo de campo.
Contiene un valor que se asigna cuando se compila el programa y nunca cambia después. Las
constantes se declaran con la palabra clave const; son útiles para que el código sea más legible.
3. Instrucciones
Concepto de instrucción
Toda acción que se pueda realizar en el cuerpo de un método, como definir variables locales, llamar a
métodos, asignaciones y muchas cosas más que veremos a lo largo de este tema, son instrucciones.
Las instrucciones se agrupan formando bloques de instrucciones, que son listas de instrucciones
encerradas entre llaves que se ejecutan una tras otra. Es decir, la sintaxis que se sigue para definir un
bloque de instrucciones es:
{
<lista Instrucciones>
}
Las acciones que realiza un programa se expresan en instrucciones. Las acciones comunes incluyen la
declaración de variables, la asignación de valores, la llamada a métodos, el recorrido en bucle de las
colecciones y la creación de bifurcaciones a uno u otro bloque de código en función de una condición
determinada. El orden en que se ejecutan las instrucciones en un programa se denomina flujo de
control o flujo de ejecución. El flujo de control puede variar cada vez que se ejecuta un programa,
dependiendo de cómo reacciona éste a la entrada que recibe en tiempo de ejecución.
Una instrucción puede estar compuesta por una única línea de código que finaliza en un punto y coma
o por una serie de instrucciones de una línea incluidas en un bloque. Un bloque de instrucciones se
encierra entre corchetes {} y puede contener bloques anidados. En el código siguiente se muestran un
ejemplo de instrucciones de una línea:
24
3.1 Tipos de instrucciones:
En la tabla siguiente se enumeran los diferentes tipos de instrucciones de C# y sus palabras clave
asociadas, con vínculos a temas que incluyen más información (Microsoft, 2016):
Instrucciones de Una instrucción de declaración introduce una nueva variable o constante. Una declaración de
declaración variable puede asignar opcionalmente un valor a la variable. En una declaración de constante,
se requiere la asignación.
C#
Instrucciones de Las instrucciones de expresión que calculan un valor deben almacenar el valor en una
expresión variable.
C#
Instrucciones de Las instrucciones de selección permiten crear bifurcaciones a diferentes secciones de código,
selección en función de una o varias condiciones especificadas. Para obtener más información, vea los
temas siguientes:
if, else, switch, case
Instrucciones de Las instrucciones de iteración permiten recorrer en bucle las colecciones como las matrices o
25
iteración bien realizar el mismo conjunto de instrucciones repetidamente hasta que se cumpla una
condición especificada. Para obtener más información, vea los temas siguientes:
do, for, foreach, in, while
Instrucciones de Las instrucciones de salto transfieren el control a otra sección de código. Para obtener más
salto información, vea los temas siguientes:
break, continue, default, goto, return, yield
Checked y Las instrucciones checked y unchecked permiten especificar si las operaciones numéricas
unchecked pueden producir un desbordamiento cuando el resultado se almacena en una variable
demasiado pequeña para contener el valor resultante .Para obtener más información,
vea checked y unchecked.
Instrucción Si marca un método con el modificador async , puede utilizar el operador await en el
await método. Cuando el control alcanza una expresión await en el método async, el control vuelve
al llamador, y el progreso en el método se suspende hasta que la tarea aguardada complete.
Cuando finaliza la tarea, la ejecución se puede reanudar en el método.
Para obtener un ejemplo, vea la sección “métodos Async” Métodos (Guía de programación de
C#).Para obtener más información, vea Programación asincrónica con Async y Await (C# y
Visual Basic).
Instrucción Un iterador realiza una iteración personalizada en una colección, como una lista o matriz. Un
yield return iterador utiliza la instrucción yield return para devolver cada elemento de uno en uno.
Cuando se alcanza una instrucción yield return , la ubicación actual en el código se recuerda.
La ejecución se reinicia desde esa ubicación cuando el iterador se denomina la próxima vez.
Para obtener más información, vea Iteradores (C# y Visual Basic).
Instrucción La instrucción fixed evita que el recolector de elementos no utilizados vuelva a ubicar una
fixed variable móvil. Para obtener más información, vea fixed.
Instrucción lock La instrucción lock permite limitar el acceso a los bloques de código a solo un subproceso a
la vez.Para obtener más información, vea lock.
Instrucciones Puede asignar una etiqueta a una instrucción y, a continuación, utilizar la palabra
con etiquetas clave goto para saltar a la instrucción con la etiqueta. (Vea el ejemplo de la fila siguiente.)
Instrucción La instrucción vacía está compuesta solo por un punto y coma. No hace nada y se puede
vacía utilizar en lugares donde se requiere una instrucción pero no es necesario realizar ninguna
acción. En los ejemplos siguientes se muestran dos usos de una instrucción vacía:
C#
void ProcessMessages()
26
{
while (ProcessMessage())
; // Statement needed here.
}
void F()
{
//...
if (done) goto exit;
//...
exit:
; // Statement needed here.
}
La instrucción return termina la ejecución del método en el que aparece y devuelve el control al
método que realizó la llamada. También puede devolver un valor opcional. Si el método es del
tipo void, la instrucción return se puede omitir.
Los métodos pueden devolver un valor al autor de la llamada. Si el tipo de valor devuelto, no es void,
el método puede devolver el valor mediante la utilización de la palabra clave return. Una instrucción
con la palabra clave return seguida de un valor que coincide con el tipo de valor devuelto devolverá
este valor al autor de llamada del método. La palabra clave return también detiene la ejecución del
método. Si el tipo de valor devuelto es void, una instrucción return sin un valor también es útil para
detener la ejecución del método. Sin la palabra clave return, el método dejará de ejecutarse cuando
alcance el final del bloque de código. En los métodos con un tipo de valor devuelto no nulo es
necesario usar la palabra clave return para devolver un valor.
Los errores (sintácticos y semánticos) pueden aparecer en el código de forma inesperada, En Visual
Studio se encuentran varias herramientas para la depuración de los errores.
El depurador de Visual Studio proporciona un menú Depurar que ofrece acceso a las herramientas del
depurador, Además, el lenguaje C# incorpora técnicas para controlar las posibles situaciones de error
en tiempo de ejecución.
Cuando una aplicación se ejecuta en modo de depuración, VS es capaz de conocer qué ocurre
exactamente en cada línea de código, Esa información de depuración está contenida en los archivos
.pdb
En modo depuración podremos:
o Consultar y modificar el valor de las variables,
o Detener un momento la ejecución Editar el código y continuar la ejecución,
o Parar la ejecución en un lugar concreto,
27
o Ejecutar el programa línea a línea,
o Realizar llamadas de prueba a métodos en la ventana Inmediato sin ejecutar la
aplicación,
o Etc.
28