He creado dos objetos, str y prog . Cuando imprimo ambos objetos
Salida para el Objeto 1: (La cadena se imprime)
Web World!!Salida para el Objeto 2: (Se imprime el nombre de la Clase)
Program1¿Puede alguien explicar por qué sucede esto?
using System; using System.Text; public class Program1 { string str1; public Program1(string str2) { str1 = str2; } } public class Program { public static void Main() { StringBuilder str = new StringBuilder("Web World!!", 30); Console.WriteLine(str); Program1 prog = new Program1("Hello"); Console.WriteLine(prog); } }Esto se debe a que el sistema no sabe cómo debe imprimir un objeto de tipo Program1, la forma de decirle al sistema cómo imprimir ese tipo es anular el método ToString en la clase Program1. Puedes hacer esto simplemente agregando:
public override string ToString() { return str1; }en la clase Program1. Todos los objetos de C# naturalmente tienen este método, pero solo devolverá el nombre de la clase (o algún otro valor, no estoy 100% seguro) de forma predeterminada, anulamos este método para decirle al sistema cómo formatear un objeto de tipo Program1 como una cadena, lo que permite que se imprima correctamente.
Console.WriteLine(prog); imprime Program1 porque
Cada clase o estructura en C# hereda implícitamente la clase Object. Por lo tanto, cada objeto en C# obtiene el método ToString, que devuelve una representación de cadena de ese objeto. (De Cómo anular el método ToString (Guía de programación de C#) )
y
Las implementaciones predeterminadas del método Object.ToString devuelven el nombre completo del tipo de objeto. (De referencia para Object.ToString Method )
Aquí hay un ejemplo de una clase ToString (del primer artículo)
class Person { public string Name { get; set; } public int Age { get; set; } public override string ToString() { return "Person: " + Name + " " + Age; } }Puede valer la pena mencionar los tipos de registros.
Desde registros (referencia de C#) :
Los tipos de registro tienen un método ToString generado por el compilador que muestra los nombres y valores de propiedades y campos públicos. El método ToString devuelve una cadena con el siguiente formato:
<record type name> { <property name> = <value>, <property name> = <value>, ...}
Si Program1 se convierte en un registro y str1 se convierte en una propiedad en lugar de un campo
public record Program1 { public string Str1 { get; set; } public Program1(string str1) { Str1 = str1; } }luego
Program1 prog = new Program1("Hello"); Console.WriteLine(prog);huellas dactilares
Program1 { Str1 = Hello }Cuando llama a Console.WriteLine(someArg); y someArg no es una cadena, el método ToString() se llamará automáticamente.
Como señaló @tymtam
Las implementaciones predeterminadas del método Object.ToString devuelven el nombre completo del tipo de objeto.
Su clase Program1 hereda del objeto y no anula ToString(), por lo que obtiene un nombre completo.
StringBuilder anula el método ToString que convierte su valor en una cadena y obtienes "¡¡Web World!!" cuerda