Недавно я просматривал одну программу на C# и наткнулся на странное поведение класса внутри нее. Я написал небольшую программу, чтобы обрисовать это поведение:
class Program
{
static void Main()
{
Test inst1 = new Test();
inst1.name0 = "Hello";
inst1.name1 = "World";
Console.WriteLine(inst1.ToString());
Console.WriteLine(inst1);
}
}
class Test
{
public string name0;
public string name1;
public override string ToString()
{
return string.Format("Name0: {0}; Name1: {1}", name0 ?? "(null)", name1 ?? "(null)");
}
}
Выход:
Name0: Hello; Name1: World
Name0: Hello; Name1: World
Так почему же inst1.ToString () и inst1 возвращают одно и то же значение в методе WriteLine ()? Я в замешательстве.
Поскольку класс переопределяет метод ToString (), Console.WriteLine () вызовет ToString () во втором экземпляре Console.WriteLine (), поэтому вы получите те же результаты.
Если вы позвоните ToString(), он примет результат. Если вы его не вызываете, метод WriteLine вызовет его за вас.





При передаче объекта перегрузка Console.WriteLine будет использовать метод объекта ToString.
If value is null, only the line terminator is written. Otherwise, the ToString method of value is called to produce its string representation, and the resulting string is written to the standard output stream.
Это применимо только для метода Console.WriteLine?
Есть и другие случаи, когда это происходит, например, интерполяция строк / string.Format.
Это происходит потому, что класс Test переопределяет функцию ToString.
Когда Console.Writeline должен отображать объект, отличный от String, он будет искать функцию ToString и использовать ее, если она доступна.
Console.Writelineимеет параметр объекта, он вызывает методToStringэтого объекта.