> **EXAME TEMA 1: FUNDAMENTOS DE .NET (Sintaxe, Variables e Estruturas)**

# Pregunta 1: Tipos de Datos e Variables (Castellano)

En .NET, tenemos tipos de datos por valor (Value Types) y tipos por referencia (Reference Types).

- Explica la diferencia principal entre ambos en cuanto a dónde se almacenan en memoria (Stack vs. Heap).
- Pon un ejemplo de cada uno.

## Respuesta

Los tipos de datos por valor son aquellos que representan íntegramente el valor en memoria, es decir, que contienen los los Bits del valor en memoria y en uso; mientras que los tipos de datos por referencia sólo contienen la referencia en memoria de los datos. La diferencia principal es que cuando usamos la referencia, alteramos un punto en memoria, y cuando enviamos o retornamos un valor de este estilo, éste se alterará en su origen, a parte de donde se opere; mientras que el tipo de dato por valor sólo se altera en el ámbito local y heredado donde se encuentre.

Cara los Stack y los Heap, la diferencia principal es cómo almacenan los datos:

- **Stack** o Pila: Almacena los datos en LIFO: Last In, First Out; o último entra, primero sale. Lo que quiere decir es que en el conjunto de datos, el primero que saldrá para su uso o iteración será el último en entrar, e irá consumiendo por iteración por el último siempre.
- **Heap** (No sé como será en Español xD): Básicamente es el almacenamiento ordenado en árbol. Básicamente vienen siendo la definición de los elementos como los objetos sobre sus clases.

Ejemplos:

- **Datos por valor**: Cualquier variable sin la partícula `ref`: `string prueba = "Hola xD"`
- **Datos por referencia**: Cualquier variable con la partícula `ref`: `public static void accion(ref int prueba){ ... }`
- **Stack**: `Stack<string> stack = new Stack<string>{ "Hola", "Buenas", "Adiós" }`
- **Heap**: Un objeto que sea del tipo de una clase que a su vez herede de una abstracción.

> **Anotaciones**: No tenía tan claros los Stack y los Heap, pero afiancé conceptos ahora mismo. La contra del Stack es la lista. ¿No?

## Corrección

Valoración: 6/10

- **El acierto**: Has definido bien el **Stack** como LIFO y su uso para la ejecución local.
- **La "alucinación" técnica**: ¡Cuidado! Un tipo por referencia **no es lo mismo** que pasar un parámetro por referencia (`ref`).
    - **Tipos por valor**: Son los tipos simples (`int`, `bool`, `double`, `struct`). Se guardan en el **Stack**.
    - **Tipos por referencia**: Son las `class`, `interface`, `string` y los `array`. El valor real reside en el **Heap**, y en el Stack solo guardamos el "puntero" o dirección.
- **Tu ejemplo de** `string`: Aunque lo pusiste como ejemplo "por valor", el `string` **es un tipo por referencia** (aunque se comporte de forma especial por ser inmutable).
- **Heap**: No es necesariamente un árbol; visualízalo como un "almacén dinámico" donde el Garbage Collector entra a limpiar cuando ya nadie referencia a esos objetos.

# Pregunta 2: Estructuras de Control de Flujo (Galego)

Explica a diferenza de uso e funcionamento entre un bucle For...Next e un bucle Do...Loop (ou While).

- ¿En que situación elixirías un sobre o outro?
- Explica brevemente que é o que fai a instrución Exit For ou Exit Do.

## Resposta

Aínda que no mundo de Visual Studio, o Visual Basic estea case obsoleto dende as súa versión 4.7, podemos facer símil con C# como linguaxe extendida actualmente. O For...Next, en Visual Basic, equivalente a For en C#, fai un bucle condicionado, nativamente por unha razón de seguiren unha sucesión numérica; mentres que pola contra, o bucle Do...Loop, de Visual Basic, equivalente ó bucle Do While de C#, vai orientado a sempre facer unha iteración, e as seguintes, condicionadas.

O primeiro, o For...Next está moi ven para recorreren factores numerados ou ordeados, aínda que non confundir co Foreach, que é para recorrer conxuntos; mentres que o Do...Loop é moi útil para iterar cunhas ordes condicionando os ciclos a excepción do primeiro, como cando queres conseguir, a partires dun valor aleatorio, algún valor que non estea rexistrado xa, onde requires de facer unha iteración, comprobar, e se está, volver a intentalo.

Se queremos rompelo bucle dende dentro, fora das condicións que podemos establecer en ambos dende á súa definición, podemos facer uso de Exit for ou Exit Do no caso de Visual Basic; o pola contra, Break en C#.

> **Nota**: As nomenclaturas de C#, en código, son en minúsculas por mor de seren unha linguaxe con Case Sensitive, a diferenza de Visual Basic.

> **Anotacións**: Despistoume os termos amosados aquí pero en canto analicei que eran Visual Basic entendín a referenicia. Moi boa esta pregunta, sobretodo pola retrocompatibilidade e os arquivos VBS.

## Corrección

Valoración: 9/10

- **Aciertos**: Muy buena distinción entre el `For` (iteración controlada/numérica) y el `Do While` (basado en condición). Has entendido perfectamente que el `Do...Loop` garantiza al menos una ejecución si la condición está al final.
- **Matiz C#**: En efecto, el `Exit For` es el `break`. Recuerda también el `continue` (o `Continue For`), que salta a la siguiente iteración sin salir del bucle.

# Pregunta 3: Sintaxe e Lóxica (Mezclado)

Analiza o seguinte fragmento de pseudocódigo/lóxica e dime se hai algún erro ou como o optimizarías:

> *"Necesito comprobar unha variable 'idade'. Se é menor de 18, imprimir 'Menor'; se é exactamente 18, imprimir 'Xusto'; e se é maior de 18, imprimir 'Adulto'."*

- ¿Que estrutura de control usarías para que fose o máis eficiente posible (If...Then...Else ou Select Case)? Xustifica a túa resposta.

## Resposta

If...Then...Else en Visual Basic se nos ceñimos ás opcións, pero realmente habería que facer uso de If...Then...Else If...Then...Else... por mor das 3 condicións, que en C# sería if...else if...else.... O Select Case de Visual Basic, equivalente ó Switch de C#, só valería se soubéramos, dentro dun marco definido e limitado de opcións, pero os termos maior que ou menor que, que eliminan dito factor, impídennos o uso desta opción.

## Respuesta

If...Then...Else en Visual Basic si nos ceñimos a las opciones, pero realmente habría que hacer uso de If...Then...Else If...Then...Else... por las 3 condiciones, que en C# sería if...else if...else.... El Select Case de Visual Basic, equivalente al Switch de C#, sólo nos valdría si estuviéramos, dentro de un marco definido y limitado de opciones, pero los términos de menor que y mayor que, que eliminan dicho factor, nos impoden usar esta opción.

## Correción

Valoración: 5/10 (¡Aquí te he pillado!)

- **Tu respuesta**: Dices que el `Select Case` no vale para "mayor que" o "menor que".
- **La realidad en VB.NET**: ¡Sí se puede! A diferencia del `switch` clásico de C# (que es más rígido), el `Select Case` **de Visual Basic** es superpotente:
VB.Net

```vb
Select Case idade
    Case Is < 18
        Console.WriteLine("Menor")
    Case 18
        Console.WriteLine("Xusto")
    Case Else
        Console.WriteLine("Adulto")
End Select
```

- **Optimización**: En este caso, el `Select Case` es más legible que un `If...ElseIf` anidado, aunque a nivel de rendimiento sean similares.

# Pregunta 4: Tipos de Datos Específicos (Castellano)

¿Qué diferencia existe entre el tipo de datos Decimal, Double y Single? Si estuvieras desarrollando una aplicación para la gestión económica de la Xunta (contabilidad), ¿cuál de los tres elegirías para manejar importes monetarios y por qué?

## Respuesta

Los tipos Decimal, Double y Single son las clases que definen a los objetos cuyo tipado nativo serían decimal, double y single, respectivamente. Se diferencian por su niveld e precisión binaria:

- **Decimal**: Hace uso de 16 bytes, o 128 Bits.
- **Double**: Hace uso de 8 Bytes, o 64 Bits.
- **Single**: Hace uso de 4 Bytes, o 32 Bits.

Por el tipo de cifras que se pueden llegar a alcanzar, hay que valorar la precisión que se puede necesitar. Partiendo de que trabajaríamos en Euros,éstos poseen 2 decimales, pero en estos casos no trabajamos con una mantisa con parte flotante fija, salvo por definición en Decimal, que sí puede definir dicho factor. Lo ideal sería trabajar con lo más cercano al procesador, y por tanto, hacer uso de una mantisa de 64 Bits por globalidad y rendimiento, con una mantisa real de 32 Bits en enteros y 32 Bits en su parte decimal, pero a nivel de datos, éstos perderían mucho. Si el interés es almacenamiento óptimo, quizás, lo ideal es Decimal por su capacidad de poder mover la coma, pero sino, con Double sería más que suficiente por la capacidad que representa en Euros.

## Corrección

Valoración: 4/10 (¡Peligro de quiebra en la Xunta! 💸)

- **El error crítico**: Has recomendado `Double` para contabilidad por rendimiento. **¡ERROR!** En informática, el `Double` y el `Single` son de coma flotante binaria. Esto significa que no pueden representar con exactitud números como "0.1", provocando errores de redondeo acumulados que harían que la caja de la Xunta no cuadrara por céntimos.
- **La respuesta correcta**: Para dinero **siempre, siempre, siempre se usa** `Decimal`.
    - `Decimal` tiene una **coma flotante decimal**, diseñada específicamente para aplicaciones financieras donde el redondeo debe ser exacto. Es más lento que el `Double`, pero en contabilidad la precisión manda sobre la velocidad del procesador.