Usar tipos seguros y salidas legibles marca la diferencia al modelar entidades en C#. Aquí verás cómo una enumeración elimina errores comunes al definir el tipo de escuela y cómo un override de ToString entrega una impresión limpia y útil del objeto. Todo con ejemplos claros y buenas prácticas que evitan fallos por mayúsculas o cadenas mal escritas.
¿Por qué usar una enumeración en C# evita errores de tipo?
Las cadenas permiten valores ambiguos. En cambio, una enumeración limita las opciones a un conjunto controlado y previene errores en tiempo de compilación. Así, el tipo de escuela no acepta variaciones como “Primaria”, “primarias” o “PRIMARIA”. Solo valores válidos.
¿Qué es una enumeración enum y cómo se declara?
// En el mismo namespace de EntidadespublicenumTiposEscuela{ Primaria, Secundaria, Preescolar
}
Clave: declarar como public para usarla fuera del archivo donde se define.
Beneficio: autocompletado confiable y sin cadenas ambiguas.
¿Qué valores numéricos tiene una enum en C#?
publicenumTiposEscuela{ Primaria =0, Secundaria =1, Preescolar =3// no es obligatorio que sea consecutivo.}
Si omites números, C# asigna 0, 1, 2 en orden.
Puedes asignar cualquier entero. No requiere secuencia.
¿Cómo asignar y validar el tipo con TiposEscuela?
Cambia la propiedad de string a la enum creada. Obtendrás tipado fuerte y asignaciones válidas guiadas por el editor. Si la enum no es pública, no aparecerá para usarla.
¿Cómo luce la propiedad en la clase escuela?
publicclassEscuela{publicstring Nombre {get;set;}publicstring Pais {get;set;}publicstring Ciudad {get;set;}publicTiposEscuela TipoEscuela {get;set;}}// Asignación seguraescuela.TipoEscuela = TiposEscuela.Primaria;
Solo permite opciones de TiposEscuela tras ..
Ayuda el autocompletado con control + barra espaciadora.
¿Qué errores previene en tiempo de compilación?
No acepta “primarias”. Es un valor inexistente.
No convierte cadenas a la enum: “no se puede convertir de cadena de texto a tipos de escuela”.
Evita fallos por mayúsculas/minúsculas y variantes tipográficas.
¿Cómo personalizar la impresión con override ToString?
Imprimir el objeto directamente muestra el nombre completo del tipo (por ejemplo, CoreEscuela.Entidades.Escuela). Con override de ToString, defines una salida legible con los datos clave: nombre, tipo, país y ciudad.
¿Qué imprime por defecto un objeto en C#?
El nombre calificado del tipo dentro del namespace.
Porque en C# todo es un object que hereda de System.Object, cuyo ToString() por defecto devuelve el nombre del tipo.
¿Cómo implementar override ToString con interpolación de cadenas?
Mi código comprobado y comentado del archivo Program.cs
using System;using CoreEscuela.Entidades;//importamos el archivo del namespace CoreEscuela.Entidades para poder acceder y utilizar la clase Escuelanamespace Etapa1{classProgram{staticvoidMain(string[] args){var escuela =newEscuela("Platzi Academy",2012);//creamos una nueva instancia de la clase Escuela, recibe dos parametros para el constructor (nombre, año de creación) escuela.País="Colombia";//Definimos el atributo del país de la escuela escuela.Ciudad="Bogota";//Definimos el atributo de ka ciudad de la escuela escuela.TipoEscuela=TiposEscuela.PreEscolar;Console.WriteLine(escuela);//Escribimos la instancia de la escuela #endregion/* Por defecto imprimir una instancia ejecutara la funcion ToString lo cual nos mostrara el origen de la instancia, sin embargo esta función
se puede sobreescribir con override*/}}}
Aquí les dejo una porción de mis notas con los códigos que hemos visto, espero les sirva y disculpen si obvie algunas cosas.
Códigos
** void**: Es un método que se usa para nombrar la función que creamos
Sintaxis :
publicvoid nombre de la funcion(){}
class: Se usa para declarar una clase
Sintaxis:
classnombre de la clase(){}
namespace: Se usa para darle nombre al documento que tendrá un conjunto de clases las cuales poseerán un conjunto de atributos y/o métodos, y que tendrán objetos, es la punta de la jerarquía de un documento c#.
Sintaxis:
namespace nombre del namespace(){}
int: Se usa para declarar una variable de tipo entero
Sintaxis:
int Nombre de la variable = valor de la variable en número entero ;
string: Se usa para declarar una cadena de texto de ahí su nombre. el valor debe ser declarado dentro de la comillas.
Sintaxis:
string Nombre de la variable = “valor de la variable en caracteres ASCII”;
Console.WriteLine: Se usa para imprimir líneas de texto en la consola. puedes escribir el texto entre comillas o escribir el nombre de una variable de tipo string.
Sintaxis:
Console.WriteLine(“texto que se va a imprimir”);
get{}: Se usa para decir lo que se debe ejecutar cuando llamen la variable que lo contiene. junto con la instrucción return podemos encapsular otra variable privada y así invocarla correctamente.
Sintaxis:
get {return"copia:"+ nombre;}
set{}: Se usa para permitir darle un valor a la variable del objeto creado. si junto a value agregamos un .ToUpper() los caracteres se volverán a mayúscula.
Sintaxis:
set {nombre = value.ToUpper();}
Constructor: Se usa para crear instancias (objetos) a partir de la clase.
Sintaxis:
//manera actual de hacerlopublicEscuela(string nombre, int año)=>(Nombre,AñoDeCreación)=(nombre,año);//manera clásica de hacerlopublicEscuela(string nombreDentroDelConstructor, int nombreDentroDelConstructor){this.nombreDeLaVariable= nombreDentroDelConstructor
nombreDeLaVariable = nombreDentroDelConstructor
}
public override: Tal como su nombre lo dice, se usa para sobrescribir un objeto(C# lo ve todo como un objeto), en el ejemplo se sobrescribe el método ToString
Sintaxis:
enum: Se usa para crear una lista con valores predeterminados, esto nos ayuda a evitar errores y problemas de información.
Sintaxis:
publicenumNombre de la enumeración
{Valor1,Valor2,Valor3}
estoy tomando el curso en noviembre del 2022 con las nuevas versiones de visual estudio y la verdad no aprendo por que hay muchos errores. se necesita una actualización del curso
Que mas Cursos da El mismo profesor ?
No, entendí el concepto de "override ToString( )"
Por que usarlo para imprimir lo que contiene la clase ?
Por que usar ToString( ) ?
Por que usar override , no me queda claro por que sobreescribir y que es lo que se sobreescribe ?
Primero que nada ToString viene directamente de la clase Object, clase de la que heredan todas las clases que creamos como "Escuela" por ejemplo, y esta clase Object viene con el método ToString() que devuelve la dirección de donde se encuentra la clase en cuestión, por eso vemos nombres de espacio y demás, en otros lenguajes vemos un código hexadecimal medio raro que es la dirección en memoria de ese objeto y el nombre de la clase.
Porque es un método que puede hacer lo que le indiquemos, no solo ver el contenido de la clase, pero básicamente ese es su uso, (por convención) pasar a string información de la clase y mostrarlo.
Lo usan en Java también para lo mismo, es convención de la documentación, pero insisto puedes usarlo para imprimir y realizar mas cosas.
Override es una palabra clave que significa que sobre escribiremos el comportamiento de esa función ToString(), se usa porque por defecto ya trae la funcionalidad de darnos la dirección del objeto que pasemos como argumento, si no denotamos override, el programa trae la funcionalidad por defecto del dotnet Framework que es mostrarnos la dirección es como firmar un contrato y decir que cambiaremos esa funcionalidad, es todo.
Ya por ultimo podemos usar una función propia y nueva para mostrar información, no tiene que ser esa, precisamente, pero podemos verlo así. Por cada objeto que creemos, ese nuevo método ocupara memoria, que no es lo mismo que solo llamarla desde una clase padre pero manipulando lo que tiene que hacer.
Si se quiere acceder al método del “padre” se puede usar la palabra clave base, por ejemplo:
public override string ToString()=> $"{base.ToString()}: {Nombre}";
en este caso utilzo la funcionalidad “por defecto” y la extiendo, imagino que esto lo vamos a ver en detalle mas adelante.
Gracias por el dato.
Práctico y funcional con un par de variables extra
using System;using CoreEscuela.Entidades;namespace Etapa1{classProgram{staticvoidMain(string[] args){var escuela =newEscuela("Escuela SCJ",2010); escuela.Pais="Chile"; escuela.Ciudad="Santiago"; escuela.TipoEscuela=TiposEscuela.Primaria;Console.WriteLine(escuela);}}}
Por si el teclado no ayuda, el atajo de la barra invertida es ALT+92 = \
gracias :)
:thumbsup:
Me surgió una duda, porque a la hora de hacer override a ToString(), a la hora de imprimir el objeto escuela a secas se imprime eso, no deberia estar en el Constructor para que se imprima?
Tu objeto tiene 2 constructores a eso se lo llama sobre carga d metodos, cuando el puso Console.WriteLine(escuela); en el momento que instancio la clase mando 5 parametros por lo tanto llamó al constrcutor 2, por lo tanto gracias a eso se imprimio lo que habia en escuela.
el override lo que hace es sobreescribir al objeto TooString del metodo constructor... si vos solo tenes al constructor e imprimis escuela Console.WriteLine(escuela); no te aparecen los datos ocurre un desborde... por lo tanto si vos queres que aparezcan los datos tenes que que sobreescribir el método y convertirlo todo a string asi se puede imprimir por consola
Muy buen ejemplo de herencia, aun que falta un poco para llegar a ello.
Una duda, por que no hizo Console.WriteLine(escuela.ToString())
si el metodo ToString() devuelve un string? no lo llama en ningun momento
Hola, Adriana :)
Por defecto, los objetos incluyen un método ToString.
public virtual string ToString();
Existe lo que se llama string representation que es lo que pasa si hacemos Object.ToString.
Y lo que WriteLine hace (bajo la cortina) es llamar al ToString en el parámetro que le pasemos.
Entonces, al hacer Console.WriteLine(escuela), dentro de WriteLine se está invocando al método ToString que sobreescribimos.
😅 Espero haberme explicado bien, en resumen, no lo llamamos (explicitamente), porque WriteLine lo hace por nosotros (implicitamente).
Puedes ver la documentación de Object.ToString aquí, y la de WriteLine aquí.
¡Nunca pares de aprender! :green_heart:
Que tal gente, me aparece este error en mi código y no lo he podido solucionar "Un espacio de nombres no puede contener directamente miembros como campos o métodos"
using System;using CoreEscuela.Entidades;namespace Etapa1{classProgram{staticvoidMain(string[] args){var escuela =newEscuela("Platzi Academy",2012); escuela.Pais="Colombia"; escuela.Ciudad="Bogota"; escuela.TipoEscuela=TiposEscuela.Primaria;Console.WriteLine(escuela);}}}
Por favor ayuda, ya busque información pero no he dado con el error
Gracias
Tu código parece estar bien, el error debe estar en otro archivo, ejemplo de porque se produce el error:
namespace DummyProyect{ string nombre;//Error al declarar un campo o método fuera de las llaves de la clase publicclassProgram{staticvoidMain(string[] args){}}}```
En C# todo es un objeto.
Mi forma de sobrescribir el método toString por si a alguien le es útil