Saltar al pie de página
Iron Academy Logo
Aprender C#
Aprender C#

Otras categorías

Comprender las variables y los tipos de datos de C#

[[academy-video-youtube({"vid": "UntC0hoeGAQ", "start_time": "0", "title": "Comprendiendo las variables y los tipos de datos de C#", "creator": "Tim Corey", "length": "28m 27s"})]]

En la programación en C#, las variables son elementos fundamentales que almacenan valores de datos. Comprender cómo definir y utilizar variables de forma eficaz es crucial para escribir código eficiente y fácil de mantener. Las variables pueden ser de distintos tipos, incluidos los tipos de datos básicos, las constantes y las variables de tipo dinámico, cada una de ellas con fines específicos. Además, la conversión de tipos, dinámico y var palabras clave añaden flexibilidad y robustez a la programación en C#.

El vídeo de Tim Corey sobre Dynamic vs Var in C# ofrece una visión general de estos conceptos. En este artículo, exploraremos varios temas cubiertos por Tim, incluyendo:

  1. Diferencia entre dinámico y variable
    • Tipos de datos básicos
    • Variables y constantes
  2. Conversión automática dinámica
  3. Inconvenientes de la dinámica en el desarrollo
  4. Por qué y cuándo utilizar Dynamic
  5. Por qué y cuándo utilizar Var

Al comprender estos conceptos a través de las explicaciones de Tim Corey, obtendrás una visión más profunda de cómo gestionar y utilizar variables en C# de forma eficaz.

Diferencia entre Dinámico y Var

En C#, se utiliza var para variables locales de tipo implícito donde el tipo se determina en tiempo de compilación, asegurando la seguridad de tipos y soporte de IntelliSense. En contraste, dynamic permite que las variables eviten la verificación de tipos en tiempo de compilación, resolviendo el tipo en tiempo de ejecución, ofreciendo más flexibilidad pero con el riesgo de errores de ejecución y rendimiento reducido.

Tim Corey explica que var asegura la seguridad de tipos con la determinación de tipos en tiempo de compilación ya que son variables estáticas, mientras que dynamic proporciona flexibilidad con la resolución de tipos en tiempo de ejecución, lo que puede provocar errores de ejecución y problemas de rendimiento.

Tipos de datos básicos

Tim comienza su demostración en Visual Studio presentando los tipos de datos básicos en C#. Crea un objeto dynamic llamado testDynamic, al cual se le puede asignar un nuevo valor en cualquier momento, y su tipo de datos puede cambiar dinámicamente en tiempo de ejecución. Esto se demuestra con el siguiente código:

// Declaration of a dynamic variable that can change types at runtime
dynamic testDynamic;
// Declaration of a dynamic variable that can change types at runtime
dynamic testDynamic;

C# ofrece varios tipos de datos básicos para manejar diversas clases de datos. Los tipos enteros incluyen int para enteros con signo de 32 bits, long para enteros con signo de 64 bits, short para enteros con signo de 16 bits, y byte para enteros sin signo de 8 bits. Para números de punto flotante, C# ofrece float para valores de precisión simple de 32 bits, double para valores de precisión doble de 64 bits, y decimal para valores decimales precisos de 128 bits, ideal para cálculos financieros. El tipo de datos char representa caracteres Unicode de 16 bits, mientras que el tipo bool se utiliza para valores verdaderos o falsos. Además, el tipo de datos string representa una secuencia de caracteres, permitiendo el almacenamiento y manipulación de texto.

Estos tipos de datos son fundamentales para programar en C#, ya que permiten almacenar y manipular datos de forma eficaz, como demuestra Tim en otros ejemplos. Se pueden declarar y asignar múltiples variables de tipos integrales int en una línea, y cada tipo de datos tiene un valor predeterminado si no se le asigna explícitamente un valor inicial. Las variables constantes mantienen valores fijos, proporcionando coherencia en todo el código. Además, las variables de instancia y las variables estáticas también pueden declararse utilizando estos tipos de datos, lo que garantiza estructuras de programa robustas y flexibles.

Variables y constantes

Tim Corey a las 1:21 intenta crear un objeto var llamado testVar sin una asignación inicial, lo que resulta en un error de compilación porque var requiere una asignación inicial para inferir su tipo:

// This will result in a compile-time error due to lack of type inference
// var testVar;
// This will result in a compile-time error due to lack of type inference
// var testVar;

Esto resulta en una línea roja ondulada bajo testVar, indicando un error. A las 1:55 Tim explica que var necesita ser asignado un tipo en el momento de la declaración. Por ejemplo:

// var assignment with type inference from the initial value
var testVar = 2; // testVar is inferred to be of type int
// var assignment with type inference from the initial value
var testVar = 2; // testVar is inferred to be of type int

Tim (2:44) demuestra que si más tarde intenta asignar un valor doble a testVar, causa un error porque testVar fue inicialmente asignado como un int:

// Attempting to change the type from int to double causes an error
// testVar = 1.1; // Error: Cannot implicitly convert type 'double' to 'int'
// Attempting to change the type from int to double causes an error
// testVar = 1.1; // Error: Cannot implicitly convert type 'double' to 'int'

Tim (3:17) enfatiza que el tipo de var se establece en el momento de su asignación inicial y no puede cambiar más adelante. Si testVar se asigna inicialmente un valor doble, se inferirá como un doble:

// Another example with dynamic typing
var testVar = 2.1; // Now testVar is a double
// Another example with dynamic typing
var testVar = 2.1; // Now testVar is a double

Aunque Tim no habla de las variables constantes, son igualmente importantes en los programas de C#. Las constantes en C# se declaran usando la palabra clave const seguida del tipo de datos e identificador de la variable constante, como:

// Declaring a constant variable
const int MaxValue = 100;
// Declaring a constant variable
const int MaxValue = 100;

A las constantes se les debe asignar un valor en el momento de la declaración, que no se puede cambiar durante la ejecución del programa, proporcionando valores inmutables para la lógica del programa.

Conversión automática de tipos dinámicos

Tim enfatiza cómo la palabra clave dynamic permite un manejo flexible de tipos al comportarse de forma similar a object, pero con capacidades adicionales. A las 3:53, Tim demuestra cómo dynamic puede convertir sin problemas entre diferentes tipos durante la ejecución, mostrando su capacidad para manejar cálculos que involucran enteros y dobles sin conversión explícita, como se muestra en su ejemplo de código:

// Demonstrating dynamic type conversion at runtime
dynamic testDynamic = 1;
testDynamic = testDynamic + 2.1;
Console.WriteLine(testDynamic); // Outputs 3.1 as it converts the integer to a double
// Demonstrating dynamic type conversion at runtime
dynamic testDynamic = 1;
testDynamic = testDynamic + 2.1;
Console.WriteLine(testDynamic); // Outputs 3.1 as it converts the integer to a double

Aquí, Tim (4:39) ilustra que testDynamic inicialmente contiene un valor entero pero lo convierte sin esfuerzo a un valor doble cuando se suma 2.1, resultando en la salida 3.1.

A pesar de su flexibilidad, Tim advierte contra el uso excesivo de dynamic debido a los costos de rendimiento que incurren las frecuentes conversiones de tipo. Él enfatiza a las 5:55 que dynamic debe utilizarse con moderación en el desarrollo de C# para evitar una carga innecesaria en el procesador y la pérdida de verificación de tipos en tiempo de compilación y soporte de IntelliSense, crucial para mantener bases de código robustas y sin errores.

Desventajas de la dinámica en el desarrollo

Tim Corey ilustra cómo dynamic puede llevar a errores de ejecución y comportamiento inesperado en tus aplicaciones. Comienza mostrando cómo declarar una variable dinámica y asignarle una cadena vacía inicial para evitar un error inmediato. Luego intenta llamar a un método inexistente sayHi en la variable dinámica, lo que no causa un error de compilación pero resulta en una excepción en tiempo de ejecución, demostrando una desventaja clave de dynamic: la falta de verificación en tiempo de compilación.

// Demonstrating lack of compile-time checks with dynamic
dynamic testDynamic = "";
// testDynamic.sayHi(); // Runtime error: method does not exist
// Demonstrating lack of compile-time checks with dynamic
dynamic testDynamic = "";
// testDynamic.sayHi(); // Runtime error: method does not exist

Además, en el minuto 8:38, Tim muestra cómo las variables dinámicas pueden cambiar de tipo en tiempo de ejecución, lo que puede provocar un comportamiento inesperado. Asigna un objeto Person a una variable dinámica, luego lo reasigna a una cadena, y muestra cómo esta flexibilidad puede llevar a errores lógicos y dificultar la depuración.

// Demonstrating the potential errors with dynamic type reassignment
dynamic testDynamic = new Person();
testDynamic = "Hi";
Console.WriteLine(testDynamic); // Works fine, but not ideal for type safety
// Demonstrating the potential errors with dynamic type reassignment
dynamic testDynamic = new Person();
testDynamic = "Hi";
Console.WriteLine(testDynamic); // Works fine, but not ideal for type safety

Tim también explica cómo las variables dinámicas carecen de soporte IntelliSense, lo que puede dar lugar a errores en tiempo de ejecución debido a errores tipográficos o nombres de métodos incorrectos. Por ejemplo, a las 14:05, llama a una propiedad Email que no existe, destacando cómo este error pasa desapercibido hasta tiempo de ejecución. El código compila sin errores pero falla en tiempo de ejecución cuando los métodos o propiedades esperados en el objeto Person no se encuentran en la cadena.

// Demonstrating a runtime error due to missing property
// testDynamic.Email = "Test@test.com"; // property not found until runtime
// Demonstrating a runtime error due to missing property
// testDynamic.Email = "Test@test.com"; // property not found until runtime

Ventajas del uso de la palabra clave Var

En contraste, var es fuertemente tipado y proporciona verificación de tipos en tiempo de compilación y soporte de IntelliSense. Esto garantiza que cualquier problema relacionado con la tipografía se detecte durante el desarrollo, lo que hace que el código sea más fiable y fácil de mantener. Tim Corey demuestra esto creando una variable var y asignándole un objeto Person:

// Using var for strongly-typed assignments
var testVar = new Person();
testVar.FirstName = "Sue";
testVar.LastName = "Storm";

// The use of IntelliSense assists in reducing runtime errors
Console.WriteLine(testVar.SayHello()); // Ideally a method in Person class
// Using var for strongly-typed assignments
var testVar = new Person();
testVar.FirstName = "Sue";
testVar.LastName = "Storm";

// The use of IntelliSense assists in reducing runtime errors
Console.WriteLine(testVar.SayHello()); // Ideally a method in Person class

Intentar llamar a un método inexistente o reasignar la variable var a un tipo diferente será detectado en tiempo de compilación, previniendo errores potenciales en tiempo de ejecución.

// Attempting to change type results in compile-time errors with var
// testVar = "Hi"; // Compile-time error
// Attempting to change type results in compile-time errors with var
// testVar = "Hi"; // Compile-time error

Tipo de retorno de método

A las 15:05, Tim demuestra que también puedes devolver un tipo dynamic desde un método, pero no puedes devolver un var. Por ejemplo:

// Method returning a dynamic type
public dynamic GetMessage() {
    return "This is a test";
}
// Method returning a dynamic type
public dynamic GetMessage() {
    return "This is a test";
}

Intentar devolver var resultaría en un error de compilación porque la firma del método debe especificar un tipo de retorno concreto.

Por qué y cuándo utilizar Dynamic

Tim elabora sobre los escenarios específicos donde dynamic se vuelve esencial. Explica que C# es fundamentalmente un lenguaje fuertemente tipado, lo que significa que a cada variable se le asigna un tipo definitivo que permanece constante a lo largo de su ciclo de vida. Esto contrasta con lenguajes como JavaScript, donde las variables pueden cambiar de tipo dinámicamente.

Tim, en el minuto 18:14, ilustra que, aunque C# está diseñado para variables fuertemente tipadas, hay situaciones, especialmente cuando se interactúa con sistemas o lenguajes externos como Python, Ruby u objetos COM, en las que la tipificación dinámica puede ser beneficiosa. Él usa el ejemplo de integrar una API de Python para resaltar la necesidad práctica de dynamic. En estos casos, disponer de un sistema de tipos flexible que pueda adaptarse a varios tipos de datos de fuentes externas simplifica la interacción.

Tim Corey a las 18:44 enfatiza que mientras dynamic es útil para interacciones entre lenguajes, generalmente no se recomienda para código puramente en C# debido a la pérdida de verificación de errores en tiempo de compilación y soporte de IntelliSense. Advierte que la flexibilidad de dynamic viene a expensas del rendimiento y la seguridad de tipos, lo que lo convierte en una opción menos deseable para la programación regular en C# donde se deben preferir las variables fuertemente tipadas.

Por qué y cuándo utilizar la palabra clave Var

Tim luego discute el uso y la filosofía detrás de la palabra clave var en C#. Señala que hay dos grupos principales en cuanto al uso de var: aquellos que prefieren usarlo exclusivamente y aquellos que favorecen las declaraciones de tipos explícitas.

Tim, a las 19:43, explica que los defensores de var argumentan que fomenta mejores convenciones de nombres, haciendo que el código se autodomente. Creen que los nombres de las variables deben ser lo suficientemente descriptivos como para transmitir el tipo sin necesidad de una declaración explícita.

Por otro lado (20:46), los que prefieren las declaraciones de tipo explícitas argumentan que ver el tipo real directamente en el código aclara inmediatamente cuál es el tipo de una variable local, sin necesidad de pasar el ratón por encima de la variable para ver su tipo. Por ejemplo:

// Explicit type declaration provides clarity
string firstName = "Tim";
// Explicit type declaration provides clarity
string firstName = "Tim";

Algunos prefieren esta opción porque elimina cualquier ambigüedad sobre el tipo de variable.

Tim comparte su enfoque equilibrado a las 21:15, afirmando que típicamente utiliza tipos explícitos para tipos de datos comunes como string, int, double, y decimal porque hace el código más claro y evita problemas potenciales, como confundir double y decimal. Por ejemplo:

// Explicit type ensures there's no ambiguity between float types
double myMoney = 1.1; // This is a double
decimal myMoney = 1.1M; // This is a decimal
// Explicit type ensures there's no ambiguity between float types
double myMoney = 1.1; // This is a double
decimal myMoney = 1.1M; // This is a decimal

Tim subraya que declarar explícitamente el tipo garantiza que se utiliza el tipo correcto, especialmente cuando puede haber confusión entre tipos similares.

Sin embargo, Tim también reconoce que var puede ser particularmente útil cuando se trata de tipos largos o complejos. Proporciona un ejemplo a las 23:37 donde declarar un List<List<Person>> puede ser prolijo:

// Declaring a complex type using var
var rounds = new List<List<Person>>();
// Declaring a complex type using var
var rounds = new List<List<Person>>();

También demuestra su utilidad en los bucles foreach (23:55):

// Utilizing var in loop for cleaner code
foreach (var round in rounds) {
    // Do something with each round
}
// Utilizing var in loop for cleaner code
foreach (var round in rounds) {
    // Do something with each round
}

Tim concluye señalando que aunque var puede reducir la verbosidad, es crucial asegurarse de que los nombres de las variables sean claros y descriptivos para mantener la legibilidad y evitar confusión.

Al balancear el uso de var con tipos explícitos, los desarrolladores pueden escribir código claro, mantenible y eficiente, aprovechando las fortalezas de ambos enfoques según sea apropiado para el contexto.

Var como objeto anónimo

Tim discute el uso de var para situaciones donde el tipo no se conoce explícitamente o cuando se trabaja con tipos anónimos. Demuestra esto creando un objeto anónimo sobre la marcha, que no tiene un tipo predefinido. Este es el código que utiliza

// Creating an anonymous object with var
var myItem = new { FirstName = "Tim", Email = "test@test.com" };
// Creating an anonymous object with var
var myItem = new { FirstName = "Tim", Email = "test@test.com" };

Tim, a las 25:30, explica que dado que este objeto es anónimo y no tiene un nombre de tipo específico, la única manera de declarar variables para él es usando var. Este enfoque permite crear y utilizar objetos sin necesidad de definir una clase formal.

Para ilustrar cómo funciona esto en la práctica, Tim escribe (25:52):

// Outputting properties of an anonymous object
Console.WriteLine($"Hello {myItem.FirstName}: your email is {myItem.Email}");
// Outputting properties of an anonymous object
Console.WriteLine($"Hello {myItem.FirstName}: your email is {myItem.Email}");

Cuando ejecuta el código en 26:25, se obtiene el resultado:

Esto demuestra que var puede manejar las propiedades de un objeto anónimo, y Visual Studio proporciona soporte de IntelliSense para estas propiedades, a pesar de que el objeto sea anónimo.

Tim, a las 26:54, aclara que él prefiere usar tipos explícitos para tipos simples y comunes como string, enteros, e instancias de clases porque hace el código más claro. Sin embargo, usa var en casos donde el tipo es largo, complejo o no conocido explícitamente, como con tipos anónimos o declaraciones de tipos complejos.

Conclusión

Y ahí lo tienes: una comprensión clara de las variables y tipos de datos en C#, junto con el uso estratégico de las palabras clave var y dynamic. Siguiendo el enfoque equilibrado de Tim Corey, puedes asegurar la seguridad de tipos y claridad en tu código con la palabra clave var mientras aprovechas la flexibilidad de la palabra clave dynamic para escenarios específicos como la interacción con sistemas externos.

Para obtener información más detallada, asegúrese de ver el vídeo de Tim Corey sobre "Dynamic vs Var in C#" y eche un vistazo a su Canal de YouTube para obtener más información sobre C#.

Hero Worlddot related to Comprender las variables y los tipos de datos de C#
Hero Affiliate related to Comprender las variables y los tipos de datos de C#

Gana más compartiendo lo que te gusta

¿Creas contenidos para desarrolladores que trabajan con .NET, C#, Java, Python o Node.js? ¡Convierte tu experiencia en un ingreso extra!

Equipo de soporte de Iron

Estamos disponibles online las 24 horas, 5 días a la semana.
Chat
Email
Llámame