sábado, 26 de marzo de 2022

Curso avanzado de C#, Usando Ampliación y Reducción de Conversiones

Podemos clasificar las conversiones como de ampliación (Widening)  o estrechamiento (Narrowing). El código que realiza una conversión. También puede ser también implícito o explícito.

En una conversión de ampliación, el tipo de datos de destino puede contener cualquier valor proporcionado por los datos de origen tipo. En una conversión de reducción, el tipo de datos de destino no puede contener todos los valores posibles mantenidos por el tipo de datos de origen. Por ejemplo, una variable int puede contener valores enteros entre –2,147,483,648 y 2,147,483,647.
Una variable short puede contener valores enteros solo entre –32,768 y 32,767. Eso significa que convertir desde un short a un int es una conversión de ampliación porque un int puede contener cualquier valor short. Una conversión de ampliación siempre tiene éxito.

En contraste, la conversión de un int a un short es una conversión de estrechamiento porque un short no puede  mantener todos los valores posibles en un int. Eso no significa una conversión de short a int puede fallar, sin embargo. Si una variable int tiene un valor que puede caber en un short, como 100 o –13,000, la conversión tendrá éxito. Si el int tiene un valor que no cabe en un corto, como 70.000, la conversión falla.

De forma predeterminada, C # no lanzará una excepción si una conversión de reducción produce un error para enteros o tipos de coma flotante. Para los enteros, trunca el resultado y continúa como si nada hubiera salido mal, para los tipos de coma flotante, el programa establece el valor de la variable de resultado en Infinito si el valor no se ajusta y continúa ejecutándose.

Tenemos varias formas de hacer que C# lance una excepción para las conversiones enteras de estrechamiento no válidas.   

Podemos usar un bloque marcado como se muestra en el siguiente código. 

public void Chequeo()
{
   int grande = 1000000;
   short pequeño = (short)grande;
}

Dentro del bloque el programa lanzará una excepción OverflowException cuando la conversión del Int grande al short pequeño falla.

El bloque Chequeo no protege el código dentro de los métodos llamados dentro del bloque. Por ejemplo, si este código llamara al método CalculaImpuestos  y realizamos una conversión de estrechamiento. Si el método falla, el programa no lanzará una excepción.

También podemos hacer un programa para lanzar excepciones para conversiones de enteros no válidas, para ello, abrimos la página de propiedades del proyecto, seleccionamos la pestaña Compilación, y haciendo clic en el botón Avanzadas, muestra un cuadro de diálogo de Configuración avanzada de compilación.

Usando Ampliación y Reducción de Conversiones

Curso avanzado de C#, Usando Ampliación y Reducción de Conversiones

Nos aseguramos de que el check de Comprobar el desbordamiento y subdesbordamiento aritmético  está marcada. 

Comprobar el desbordamiento y subdesbordamiento aritmético


Si un programa guarda un valor de doble precisión en una variable flotante, El código debe verificar explícitamente el resultado para ver si está configurado en Infinito o para detectar un desbordamiento. El código también deberá comprobar para que capture las condiciones de desbordamiento.

Errores comunes: 
Realización de conversiones reducidas que resultan en desbordamientos

Los programadores principiantes a menudo no se dan cuenta de que el programa no se quejará si se realiza una conversión de reducción que resulta en un desbordamiento. Para evitar errores confusos, conviene obligar al programa a lanzar excepciones en esos casos.

El siguiente código utiliza el método EsIndeterminado de tipo flotante para determinar si el la conversión de estrechamiento causa un desbordamiento:

double grande = -1E40;
float pequeño = (float)grande;
if (float.EsIndeterminado(pequeño)) throw new OverflowException();

Realización de conversiones de coma flotante 

El programa continuará ejecutándose si una conversión o cálculo de coma flotante produce un desbordamiento. Para evitar errores, debemos comprobar el resultado de  las variables Infinity y NegativeInfinity.

Utilizando conversiones implícitas y explícitas

Una conversión implícita es aquella en la que el programa convierte automáticamente un valor a otro sin ninguna declaración adicional para indicarle que realice la conversión. En contraste, una la conversión explícita utiliza un operador o método adicional, como un operador de conversión o un método de análisis para indicar explícitamente al programa de cómo realizar la conversión.
Debido a que las conversiones de reducción pueden resultar en una pérdida de datos, un programa de C# no realizará una conversión de reducción automática, por lo que no se habilitará una conversión de reducción implícita.
Para ello debe obligarse al código d a utilizar explícitamente algún tipo de operador o método de conversión para dejar en claro que tenemos la intención de realizar La conversión, con un posible resultando de pérdida de datos. 

En contraste, una conversión de ampliación siempre tendrá éxito, por lo que un programa de C# puede hacer conversiones implícitas de ampliación implícitamente sin utilizar un operador o método de conversión explícito. Podemos utilizar un operador de conversión, pero no estamos obligados a hacerlo. El siguiente código muestra ejemplos de conversiones implícitas y explícitas:

// Conversión de estrechamiento. Debe ser explícita.
double value1 = 10; float value2 = (float)value1;

//  Conversión de ensanchamiento, puede ser implicita.
int value3 = 10; long value4 = value3;

Para los tipos por referencia, la conversión a una clase o interfaz ancestral directa o indirecta es una conversión de ampliación, Así que un programa puede hacer la conversión implícitamente.  La siguiente entrada incluye más información sobre conversión de tipos por referencia.


sábado, 19 de marzo de 2022

Curso avanzado de C#. Propiedades Indexadas, Tipos genéricos y Métodos genéricos

Las propiedades indexadas, o indexadores, se comportan de manera un poco diferente a las propiedades estándar. El propósito principal de las propiedades indexadas es permitir el "acceso a grupos de elementos de forma similar a como se accede a un array". En otras palabras, si tenemos clases que utilizan matrices u otros tipos de colecciones, debemos considerar el uso de indizadores para acceder a los valores de estas colecciones internas. Las propiedades estándard discutidas hasta ahora se utilizan para acceder a valores individuales en clases, mientras que una propiedad indexada Se utilizará para encapsular un conjunto de valores.

Para mostrar el funcionamiento de las propiedades indexadas, necesitamos un ejemplo simple que lo ilustre. Una aplicación que trate con direcciones de red en un escenario de subredes IP. 

Curso avanzado de C#. Propiedades Indexadas, Tipos genéricos y Métodos genéricos


sábado, 12 de marzo de 2022

Curso avanzado de C#. Encapsulación

En OOP, el concepto encapsulación se utiliza para describir el concepto de empaquetar las propiedades, métodos, y cualquier otro miembro de la clase. La encapsulación también se utiliza para referirse a la "ocultación" de los detalles de implementación de la funcionalidad de la clase y también la protección de las características de la clase.

Curso avanzado de C#. Encapsulación


sábado, 5 de marzo de 2022

Curso avanzado de C#. Sobrecarga de Métodos

Un método es definido por su modificador, el tipo de retorno, el nombre, el número y el tipo de los argumentos. Un método también tiene una firma. La firma de un método, es lo que identifica de forma única el método de cualquier otro método que tenga el mismo nombre. Cuando llamamos a un método en nuestro código, el compilador busca un método con la firma correcta. La firma consiste en el nombre del método, el tipo de datos y la cantidad de parámetros en el método. El tipo o parámetro en un método, además  puede ser un tipo pasado por valor, un tipo pasado por referencia o un parámetro de salida. El tipo de retorno, por tanto no es el componente único de una firma de método.

Sobrecarga de Métodos