Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Заочники_АСОИ / Лекции / 01 Классы / Объекты и типы.docx
Скачиваний:
20
Добавлен:
29.02.2016
Размер:
97.14 Кб
Скачать

Статические классы

Ранее в этой главе обсуждались статические конструкторы и то, как они позволяют ини­циализировать статические переменные-члены. Если класс не содержит ничего кроме ста­тических методов и свойств, этот класс сам по себе может стать статическим. Статический класс функционально представляет собой то же самое, что и класс с приватным статиче­ским конструктором. Создать экземпляр такого класса невозможно. Если указать ключевое слово static в объявлении класса, компилятор будет гарантировать, что к этому классу никогда не будут добавлены нестатические члены. В противном случае будет выдана ошиб­ка компиляции. Это гарантирует также, что экземпляры этого класса никогда не будут соз­даны. Синтаксис объявления статического класса выглядит следующим образом:

static class StaticUtilities

{

public static void HelperMethod()

{

}

}

Объект типа StaticUtilities не нужен для вызова HelperMethod(). При вызове ука­зывается имя типа:

StaticUtilities.HelperMethod();

Класс Object

Как отмечалось ранее, классы .NET изначально унаследованы от System.Object. Фактически, если при определении нового класса базовый класс не указан, компилятор автоматически предполагает, что он наследуется от Object. Поскольку в этой главе насле­дование не используется, все классы, которые вы видели до сих пор, на самом деле унас­ледованы от System.Object. (Как упоминалось выше, для структур это наследование не­прямое. Структуры всегда наследуются от System.ValueType, который, в свою очередь, унаследован от System.Object.)

Практическое значение этого в том, что помимо методов и свойств, которые вы оп­ределяете, также появляется доступ к множеству общедоступных и защищенных методов-членов, которые определены в классе Object. Эти методы присутствуют во всех опреде­ляемых классах.

Методы System.Object

На данный момент следующий список кратко резюмирует назначение каждого метода, за исключением ToString(), который описан более подробно.

  • ToString(). Этот метод предназначен для выдачи базового, быстрого и простого строкового представления. Применяйте его, когда нужно получить представление о содержимом объекта  возможно, в целях отладки. Он предлагает очень огра­ниченные средства форматирования данных. Например, даты в принципе могут быть отображены в огромном разнообразии форматов, но DateTime.ToString() не оставляет никакого выбора в этом отношении. Если нужно более сложное стро­ковое представление, которое, например, принимает во внимание установленные предпочтения или местные стандарты, то понадобится реализовать интерфейс IFormattable (см. раздел 6.9).

  • GetHashCode(). Этот метод используется, когда объект помещается в структуру данных, известную как карта (map), которая также называется хеш-таблицей или словарем. Применяется классами, которые манипулируют этими структурами, что­бы определить, куда именно в структуру должен быть помещен объект. Если вы намерены использовать свой класс как ключ словаря, то должны переопределить GetHashCode(). Существуют достаточно строгие требования относительно того, как нужно реализовывать перегрузку, и вы ознакомитесь с ними, когда будете изу­чать словари в разделе 6.10.

  • Equals() (обе версии) и ReferenceEquals(). Как несложно догадаться, учитывая существование трех различных методов сравнения объектов, среда .NET использует довольно сложную схему определения эквивалентности объектов. Следует учитывать и использовать тонкие различия между этими тремя методами и операцией сравне­ния ==. Кроме того, также существуют ограничения, регламентирующие, как следует переопределять виртуальную версию Equals() с одним параметром, если вы реши­тесь на это  поскольку некоторые базовые классы из пространства имен System.Collections вызывают этот метод и ожидают от него определенного поведения. Мы вернемся к этим методам в разделе 6.7, когда будем рассматривать операции.

  • Finalize(). Этот метод будет описан в разделе 6.13. Его назначение в С# примерно со­ответствует деструкторам С++, и он вызывается при сборке' мусора для очистки ре­сурсов, занятых ссылочным объектом. Реализация Finalize() из Object на самом деле ничего не делает и игнорируется сборщиком мусора. Обычно переопределять Finalize() необходимо, если объект владеет неуправляемыми ресурсами, которые нужно освободить при его уничтожении. Сборщик мусора не может сделать это на­прямую, потому что он знает только об управляемых ресурсах, поэтому полагается на финализацию, определенную вами.

  • GetType(). Этот метод возвращает экземпляр класса, унаследованный от System.Туре. Этот объект может предоставить большой объем информации о классе, чле­ном которого является ваш объект, включая базовый тип, методы, свойства и т.п. System.Туре также представляет собой стартовую точку технологии рефлексии .NET. Этой теме посвящен раздел 6.14.

  • MemberwiseClone(). Это единственный член System.Object, который в книге подробно нигде больше не упоминается. Вообще говоря, в этом нет необходимости, поскольку его концепция весьма проста. Этот метод просто создает копию объекта и возвращает ссылку на эту копию (а в случае типа значения  ссылку на упаковку). Отметим, что при этом выполняется неглубокое копирование, т.е. копируются все типы значений в классе. Если же класс включает в себя члены ссылочных типов, то копируются только ссылки, а не объекты, на которые они указывают. Этот метод является защищенным, а потому не может вызываться для копирования внешних объектов. К тому же он не виртуальный, а потому переопределять его реализацию нельзя.

Соседние файлы в папке 01 Классы