Почему тип данных String имеет a .ToString()
метод?
Тип System.String
, как и почти все типы в .NET, является производным от системы .Объект
. Объект
имеет метод ToString ()
, поэтому String
наследует этот метод. Это виртуальный метод, и String
переопределяет его, чтобы вернуть ссылку на себя, а не использовать реализацию по умолчанию, которая должна возвращать имя типа.
Из Reflector это реализация ToString в Object
:
public virtual string ToString()
{
return this.GetType().ToString();
}
И это переопределение в String
:
public override string ToString()
{
return this;
}
Это верно даже для java, я думаю, что большинство объектно-ориентированных языков программирования имеют это строковое представление рассматриваемых объектов, поскольку каждый создаваемый вами класс по умолчанию он extedns from Object, что приводит к появлению метода toString (), помните, что он применим только к объектам, а не к премитивным типам.
Как отмечает Марк, он просто возвращает ссылку на себя. Но почему это важно? Все базовые типы должны возвращать строковое представление самих себя. Представьте себе функцию протоколирования, которая работает следующим образом:
public void Log(object o) {
Console.WriteLine(o.ToString());
}
Это позволяет вам передавать любой базовый тип и записывать его содержимое в журнал. Если бы строка не возвращала себя, она бы просто вывела "String", а не свое содержимое. То же самое можно сделать с помощью функции-шаблона.
Думаете, это глупо? По сути, это то, что делают функции форматирования строк. Она вызывает "ToString", когда вы делаете следующее:
Console.WriteLine("{0}", myString);
Строка - это объект, а не тип данных. Поскольку String является объектом, он наследует от корневого объекта метод ToString ().
Это как в Java, Objective-C или Scala :)
Любой объект в C# имеет метод to string, хотя я не могу придумать причину, по которой можно было бы привести строку к строке в тот момент, когда ToString() наследуется от типа объекта, примером которого, конечно, является строка.