- •Классы и структуры
- •Функции-члены
- •Передача параметров в методы
- •Параметры ref
- •Параметры out
- •Свойства
- •Свойства, доступные только для чтения и только для записи
- •Модификаторы доступа для свойств
- •Автоматически реализуемые свойства
- •Замечание о встраивании
- •Индексаторы
- •Тип_элемента this[int индекс]
- •Листинг 1.
- •Листинг 2.
- •Листинг 3.
- •Листинг 4.
- •Конструкторы
- •Статические конструкторы
- •Вызов одних конструкторов из других
- •Поля readonly
- •Анонимные типы
- •Структуры
- •Структуры это типы значений
- •Структуры и наследование
- •Конструкторы структур
- •Частичные классы
- •Статические классы
- •Класс Object
- •Методы System.Object
- •Метод ToString()
- •Расширяющие методы
Метод ToString()
Вы уже встречались с методом ToString() в разделе 6.2. Этот метод предоставляет наиболее удобный способ быстрого получения строкового представления объекта. Например:
int i = -50;
string str = i.ToString(); // возвращает "-50"
Вот другой пример:
enum Colors {Red, Orange, Yellow};
// далее в коде. . .
Colors favoriteColor = Colors.Orange;
string str = favoriteColor.ToString(); // возвращает "Orange"
Метод Object.ToString() объявлен как виртуальный, и во всех этих примерах используется преимущество того факта, что его реализация для встроенных типов С# переопределена с целью возврата корректного представления этих типов. Не следует думать, что перечисление Colors считается предопределенным типом данных. На самом деле оно реализовано как структура, унаследованная от System.Enum, а в System.Enum предлагается достаточно интеллектуальная реализация ToString(), имеющая дело со всеми типами перечислений, которые вы определяете.
Если вы не переопределяете ToString() в своих классах, то они просто наследуют реализацию этого метода от System.Object, которая просто отображает имя класса. Если же необходимо, чтобы метод ToString() возвращал информацию о значении объекта вашего класса, то должны переопределить его. Чтобы проиллюстрировать это, в следующем примере Money определен очень простой класс, также названный Money, который представляет суммы в валюте США. Класс Money служит оболочкой типа decimal, но включает метод ToString(). Обратите внимание, что он должен быть объявлен как override, потому что переопределяет метод, предоставленный Object. Переопределение рассматривается более подробно в разделе 6.4. Полный код примера приведен ниже. Обратите внимание, что он также иллюстрирует применение свойств для помещения полей в оболочки.
using System;
namespace Wrox
{
class MainEntryPoint
{
static void Main(string[] args)
{
Money cashl = new Money();
cashl.Amount = 40M;
Console.WriteLine("cashl.ToString() возвращает: " +
cashl.ToString());
Console.ReadLine();
}
}
class Money
{
private decimal amount;
public decimal Amount
{
get
{
return amount;
}
set
{
amount = value;
}
}
public override string ToString()
{
return "$'* + Amount.ToString();
}
}
}
Этот пример просто иллюстрирует синтаксические свойства С#. В С# уже имеется предопределенный тип для представления денежных сумм decimal, поэтому в реальности писать класс, дублирующий эту функциональность, не придется, если только вы не пожелаете добавить к нему какие-то другие методы. Во многих случаях, для удовлетворения требований форматирования, при отображении в строке денежной суммы, скорее всего, будет использоваться метод String.Format() (он описан в разделе 6.8).
В методе Main() сначала создается экземпляр объекта Money, а затем BetterMoney. После этого вызывается метод ToString() (который в действительности выполняет переопределенную версию этого метода. Запуск показанного кода даст следующий результат:
cash1.ToString() возвращает: $40