netlib.narod.ru | < Назад | Оглавление | Далее > |
Переписывая программу с C++ на С#, я внес в нее еще одно изменение: добавил модификатор static в определение IsLeapYear и добавил в этот метод параметр year. Это изменение не необходимо: удаление у метода IsLeapYear ключевого слова static и параметра не повлияет на работу программы.
Но модификатор static имеет настолько большое значение в С# и .NET, что я не хотел откладывать его рассмотрение ни на секунду.
На всем протяжении этой главы я отображал текст на консоли, вызывая метод WriteLine класса Console:
Console.WriteLine(...);
Однако при вызове метода DayOfYear указывается не класс (в данном случае — Date), a mydate — объект типа Date:
mydate.DayOfYear();
Уловили разницу? В первом случае указан класс Console; во втором случае — объект mydate.
Разница как раз и заключается в модификаторе static. Метод WriteLine в классе Console определен как static:
public static void WriteLine(string value)
Статические методы относятся к самому классу, а не к его объектам. Для вызова метода, определенного как static, необходимо указать перед ним имя класса. Для вызова метода, не определенного как static, нужно указать перед ним имя объекта — экземпляра класса, в котором определен этот метод.
Это различие относится и к членам класса, содержащим данные. Любые поля, определенные как static, имеют одно и то же значение для всех экземпляров класса. Вне определения класса к членам, содержащим данные, необходимо обращаться, указывая имя класса, а не имя объекта этого класса. Поля MinValue и MaxValue, которые я ранее использовал в программе MinAndMax, — статические.
К чему приводит определение IsLeapYear как static? Во-первых, нельзя вызывать IsLeapYear, указывая перед ним экземпляр класса Date:
mydate.IsLeapYear(1997) //He будет работать!
Необходимо вызывать IsLeapYear, указывая имя класса:
Date.IsLeapYear(1997)
Внутри определения класса, например в методе DayOfYear, перед IsLeapYear вообще не нужно ничего ставить. Еще одно следствие: IsLeapYear должен иметь параметр — проверяемый год. Преимущество определения IsLeapYear как static в том, что для его использования не надо создавать экземпляр Date. Аналогично для статических методов, определенных в классе Console, не нужно создавать экземпляр класса Console. На самом деле вы не сможете создать экземпляр Console, но даже если бы это удалось, то все равно было бы бесполезно, так как в классе Console нет нестатических методов.
Статический метод не может обращаться к нестатическим методам или полям своего класса. Дело в том, что нестатические поля различны для разных экземпляров класса, а нестатические методы возвращают различные значения для разных экземпляров класса. Когда вы ищете что-нибудь в справочнике по .NET Framework, всегда обращайте внимание, определено ли оно как static или нет. Это крайне важно. Я также постараюсь быть в этой книге очень аккуратным и обращать внимание, когда что-либо определено как static.
Поля также могут определяться как static, и тогда они совместно используются всеми экземплярами класса. Статические поля хорошо подходят для массивов которые требуется инициализировать постоянными значениями, как в случае массива MonthDays в программе CsDateClass. Как видно из этой программы, массив повторно инициализируется при каждом вызове метода DayOfYear.
netlib.narod.ru | < Назад | Оглавление | Далее > |