Francisco Javier Encina
Javier Alejandro Alamar Martínez
que ventaja tiene de hacerlo de esta forma compañero?
Cristian Camilo Berrio Montoya
mejora el performance.
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 Entidades public enum TiposEscuela { Primaria, Secundaria, Preescolar }
public para usarla fuera del archivo donde se define.¿Qué valores numéricos tiene una enum en C#?
public enum TiposEscuela { Primaria = 0, Secundaria = 1, Preescolar = 3 // no es obligatorio que sea consecutivo. }
¿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?
public class Escuela { public string Nombre { get; set; } public string Pais { get; set; } public string Ciudad { get; set; } public TiposEscuela TipoEscuela { get; set; } } // Asignación segura escuela.TipoEscuela = TiposEscuela.Primaria;
TiposEscuela tras ..¿Qué errores previene en tiempo de compilación?
¿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#?
System.Object, cuyo ToString() por defecto devuelve el nombre del tipo.¿Cómo implementar override ToString con interpolación de cadenas?
public override string ToString() { return $"Nombre: {Nombre}\n" + $"Tipo: {TipoEscuela.ToString().ToLower()}\n" + $"País: {Pais}\n" + $"Ciudad: {Ciudad}"; }
$ para interpolación y \n para salto de línea.; y devolver un string.¿Qué salida obtenemos tras formatear?
Nombre: Copia Platzi Academy Tipo: primaria País: Colombia Ciudad: Bogotá
dotnet run y verás la salida formateada.¿Te gustaría ver más ejemplos con validaciones o formateos alternativos? Comparte tus dudas y comenta qué caso necesitas cubrir.
Francisco Javier Encina
Javier Alejandro Alamar Martínez
que ventaja tiene de hacerlo de esta forma compañero?
Cristian Camilo Berrio Montoya
mejora el performance.
Andrés Felipe Martínez Salazar
Ya que en la clase pasada definimos el contructor usando => pense que tambien se podrian usar en el metodo ToString y lo defini de esta forma:
public override string ToString() => $"{Nombre}: Tipo {TipoEscuela} \nCreada en: {AñoDeCreacion}";
Denis Joseli Sanchez Carranza
El método toString() muchas veces es muy útil!!
public override string ToString() { return $"Nombre: {nombreEscuela}, Tipo: {tiposDeEscuela} \n Pais: {pais}, Ciudad: {ciudad}"; }
Rolando Mamani Salas
Tienes mucha razon
Aufsten Aufsten
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 Escuela namespace Etapa1 { class Program { static void Main(string[] args) { var escuela = new Escuela("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*/ } } }
Ismael Santiago Matiz Cardenas
Oscar Vázquez Hernández
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
Wilson Alexander Caal Pacay
Que mas Cursos da El mismo profesor ?
Gabriel Vladimir Valdivieso Vanegas
No, entendí el concepto de "override ToString( )"
José Arbey López Martínez
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.
Andrés Felipe Martínez Salazar
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.
Ivan Toro
Gracias por el dato.
Usuario anónimo
UserPráctico y funcional con un par de variables extra
public override string ToString() { return $"Nombre: {nombre}, Tipo: {tipo.ToString()}, Fundada: {año_creacion}\nPais: {pais}, Ciudad: {ciudad}, Dirección: {direccion}"; }
Jhon Wilchez
Sebastian Almiron
Por si el teclado no ayuda, el atajo de la barra invertida es ALT+92 = \
Felipe Vidal
gracias :)
Alonso Fabricio Samanez Nuñez
:thumbsup:
Kevin Villatoro
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?
Hernán Arica
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.
Hernán Arica
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
Wilson Erik Ramírez Franco
Muy buen ejemplo de herencia, aun que falta un poco para llegar a ello.
Adriana Selena Tito Ilasaca
Una duda, por que no hizo Console.WriteLine(escuela.ToString())
si el metodo ToString() devuelve un string? no lo llama en ningun momento
Daniel Adolfo Ordoñez Rubio
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:
Julian Ortiz
Misael Juarez Gordillo
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 public class Program { static void Main(string[] args) { } } }```
Jimmy Buriticá Londoño
En C# todo es un objeto.
Carlos Gabriel Gutiérrez García
Mi forma de sobrescribir el método toString por si a alguien le es útil
public override string ToString() { string _string = ""; foreach(System.Reflection.PropertyInfo property in this.GetType().GetProperties()) { _string+= property.Name +": " + property.GetValue(this,null)+"\n"; } return _string; }
Cesar Bautista Mejia
No ma nunca he utilizado el enum de esa manera tan básica, ayuda bastante.
Otra forma de retornar los atributos es con StringBuilder
public override string ToString(){ StringBuilder sb = new StringBuilder(); sb.AppendLine("Nombre: "+this.Nombre+"\n"); sb.AppendLine("Pais: "+this.Pais+"\n"); sb.AppendLine("Ciudad: "+this.Ciudad+"\n"); sb.AppendLine("Año: "+this.AñoDeCreación+"\n"); sb.AppendLine("Tipo de Escuela: "+this.TipoEscuelas+"\n"); return sb.ToString(); }
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 :
public void nombre de la funcion() { }
class: Se usa para declarar una clase Sintaxis:
class nombre 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 hacerlo public Escuela (string nombre, int año) => (Nombre, AñoDeCreación) = (nombre,año); //manera clásica de hacerlo public Escuela (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:
public override string ToString() { return $"Nombre: {Nombre}, TipoEscuela: {TipoEscuela} \nPaís: {País}, Ciudad: {Ciudad}"; }
enum: Se usa para crear una lista con valores predeterminados, esto nos ayuda a evitar errores y problemas de información. Sintaxis:
public enum Nombre de la enumeración { Valor1 , Valor2, Valor3 }
Escuela.cs
namespace CoreEscuela.Entidades { class Escuela { string nombre; public string Nombre { get{ return "Copia: " + nombre;} set{ nombre = value.ToUpper();} } public int AñoDeCreacion{get;set;} public string Pais { get; set; } public string Ciudad { get; set; } public TiposEscuela TipoEscuela{get;set;} public Escuela(string nombre, int año) =>(Nombre,AñoDeCreacion) = (nombre,año); public override string ToString() { return $"Nombre: {Nombre}, Tipo: {TipoEscuela} \n Pais: {Pais}, Ciudad: {Ciudad}"; } } }
TiposEscuela.cs
namespace CoreEscuela.Entidades { public enum TiposEscuela { Primaria, Secundaria , PreEscolar } }
Program.cs
using System; using CoreEscuela.Entidades; namespace Etapa1 { class Program { static void Main(string[] args) { var escuela = new Escuela("Escuela SCJ",2010); escuela.Pais = "Chile"; escuela.Ciudad="Santiago"; escuela.TipoEscuela = TiposEscuela.Primaria; Console.WriteLine(escuela); } } }
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"
Este es el código del archivo Escuela.cs
namespace CoreEscuela.Entidades { class Escuela { string nombre; public string Nombre { get{return "Copia:" + nombre; } set{nombre = value.ToUpper(); } } public int AñoDeCreacion {get; set;} public string Pais { get; set; } public string Ciudad { get; set; } public TiposEscuela TipoEscuela {get; set;} public Escuela(string nombre, int año) => (Nombre, AñoDeCreacion) = (nombre, año); public override string ToString() { return $"Nombre: (Nombre), Tipo: (TipoEscuela) \nPais: (Pais), Ciudad: (Ciudad)"; } } }
Este es el código de TiposEscuela
namespace CoreEscuela.Entidades { public enum TiposEscuela { Primaria, Secundaria, PreEscolar } }
Y este es el código de Program.cs
using System; using CoreEscuela.Entidades; namespace Etapa1 { class Program { static void Main(string[] args) { var escuela = new Escuela("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