Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Язык C# и основы платформы .NET.docx
Скачиваний:
36
Добавлен:
11.05.2015
Размер:
178.68 Кб
Скачать

11. Статические элементы и методы расширения

Поля, методы и свойства классов, которые рассматривались ранее, использовались при помощи объекта класса. Такие элементы называются экземплярными. Разберём употребление статических элементов.

11.1. Статические элементы

Статическиеэлементы предназначены для работы не с объектами, а с классом. Статические поля хранят информацию, общую для всех объектов, статические методы либо вообще не используют поля, либо работают только со статическими полями.

Чтобы объявить статический элемент, применяется модификатор static:

publicclassAccount

{

privatestaticdouble_tax = 0.1;

publicstaticdoubleGetTax()

{

return_tax * 100;

}

}

Для вызова статических элементов требуется использовать имя класса:

Console.WriteLine(Account.GetTax());

Подчеркнём, что статическими могут быть сделаны поля, методы и обычные свойства. Открытая константа, описанная в классе, уже работает как статический элемент. Индексатор класса не может быть статическим1.

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

Если класс содержит только статические элементы, то при объявлении класса можно указать модификатор static. Так определяется статический класс:

publicstaticclassApplicationSettings

{

publicstaticstringBaseDir { }

public static string GetRelativeDir() { }

}

Экземпляр статического класса не может быть создан или даже объявлен в программе. Для таких классов запрещено наследование. Все открытые элементы статического класса доступны только с использованием имени класса.

Упомянем некоторые полезные статические классы из пространства имён System. Для преобразования данных различных типов удобно использовать классConvert. КлассMathсодержит большой набор различных математических функций. КлассConsoleпредназначен для чтения и записи информации на консоль, а также для настройки консоли. КлассEnvironmentсодержит полезные свойства, описывающие окружение запуска программы (например,Version– текущая версия платформы .NET).

11.3. Методы расширения

В C# 3.0 была представлена концепция метода расширения(extension method). Методы расширения позволяют «добавлять» методы в существующие типы без создания нового производного типа, перекомпиляции или иного изменения исходного типа. Методы расширения являются особым видом статического метода, но они вызываются, как если бы они были методами экземпляра в расширенном типе. Для клиентского кода нет видимого различия между вызовом метода расширения и вызовом методов, фактически определённых в типе.

Рассмотрим следующий пример. Пусть разрабатывается программный проект, в различных частях которого требуется подсчёт суммы элементов целочисленного массива. Для реализации данной задачи создан специальный вспомогательный класс, содержащий статический метод подсчёта:

publicstaticclassArrayHelper

{

publicstaticintSum(int[] array)

{

varresult = 0;

foreach(variteminarray)

{

result += item;

}

returnresult;

}

}

// использование метода Sum()

int[] m = {3, 4, 6};

Console.WriteLine(ArrayHelper.Sum(m));

Превратим Sum()в метод расширения. Для этого достаточно в описании метода добавить ключевое словоthisперед первым параметром:

publicstaticclassArrayHelper

{

publicstaticintSum(thisint[] array)

{ . . . }

}

Теперь метод Sum()можно вызывать как традиционным способом, так и как «экземплярный» метод массива:

int[] m = {3, 4, 6};

Console.WriteLine(m.Sum());

Подчеркнём, что методами расширения могут быть только статические методы1статических классов. Количество параметров такого метода произвольно (один и более), но только первый можно указать с модификаторомthis. Соответственно, метод расширит тип первого параметра.

Методы расширения применимы к типу, как только импортируется пространство имён, содержащее класс с этими методами расширения. Если выполняется импорт нескольких пространств имён, содержащих классы с одинаковыми методами расширения для одного типа, то возникает ошибка компиляции. В этом случае методы расширения должны использоваться как обычные статические методы вспомогательных классов.