Volatile 14 страница
Поскольку в методе доступа к событию неявно имеется параметр с именем value, объявление в методе доступа к событию локальной переменной или константы с таким именем является ошибкой времени компиляции. В примере class Control: Component // Return event handler associated with key // Add event handler associated with key // Remove event handler associated with key // MouseDown event // MouseUp event // Invoke the MouseUp event класс Control реализует механизм внутреннего хранилища для событий. Метод AddEventHandler связывает значение делегата с ключом, метод GetEventHandler возвращает делегат, в данный момент связанный с ключом, а метод RemoveEventHandler удаляет делегат в качестве обработчика событий для указанного события. Предположительно, лежащий в основе механизм хранилища разработан так, что отсутствуют затраты на связывание значения делегата null с ключом, и таким образом необрабатываемые события не расходуют емкость хранилища. 10.8.3 Статические события и события экземпляров Если в объявление события включен модификатор static, событие называют статическим событием. Если нет модификатора static, событие называется событием экземпляра; Статическое событие не связано с конкретным экземпляром, и обращение к this в методах доступа статического события является ошибкой времени компиляции. Событие экземпляра связано с данным экземпляром класса, и к этому экземпляру можно обращаться как к this (§7.6.7) в методах доступа этого события. Когда к событию обращаются через доступ_к_члену; (§7.6.4) вида E.M, если M является статическим событием, E должно означать тип, содержащий M, а если M является событием экземпляра, E должно означать экземпляр типа, содержащего M. Различия между статическими членами и членами экземпляров рассматриваются в разделе §10.3.7. 10.8.4 Виртуальные, запечатанные, переопределяющие и абстрактные методы доступа Объявление события как virtual указывает, что методы доступа этого события являются виртуальными. Модификатор virtual применяется к обоим методам доступа события. Объявление события как abstract указывает, что методы доступа события являются виртуальными, но не предоставляет фактическую реализацию методов доступа. Вместо этого требуются не абстрактные производные классы для предоставления их собственной реализации для методов доступа посредством переопределения события. Поскольку объявление абстрактного события не предоставляет фактическую реализацию, оно не может предоставить разделенные скобками объявления_методов_доступа_к_событиям;. Объявление события, включающее оба модификатора abstract и override, указывает, что событие является абстрактным и переопределяет основное событие. Методы доступа такого события также являются абстрактными. Объявления абстрактных событий разрешены только в абстрактных классах (§10.1.1.1). Методы доступа унаследованного виртуального события могут быть переопределены в производном классе включением объявления события, указывающего модификатор override. Это называется объявлением переопределяющего события. Объявление переопределяющего события не объявляет новое событие. Вместо этого оно просто специализирует реализации методов доступа существующего виртуального события. Объявление переопределяющего события должно указывать точно те же модификаторы доступа, тип и имя, что и переопределяемое событие. Объявление переопределяющего события может включать модификатор sealed. Использование этого модификатора предотвращает дальнейшее переопределение события производным классом. Методы доступа запечатанного события также запечатаны. Включение модификатора new в объявление переопределяющего события является ошибкой времени компиляции. За исключением различий в синтаксисе объявления и вызова, поведение виртуальных, запечатанных, переопределяющих и абстрактных методов доступа точно такое же, как поведение виртуальных, запечатанных, переопределяющих и абстрактных методов. В частности, правила, описанные в §10.6.3, §10.6.4, §10.6.5 и §10.6.6, применяются, как если бы методы доступа были методами соответствующего вида. Каждый метод доступа соответствует методу с единственным параметром-значением типа события, с типом возвращаемого значения void и с теми же модификаторами, что содержащее событие. 10.9 Индексаторы; Индексатор является членом, дающим возможность индексировать объект так же, как массив. Индексаторы объявляются с помощью объявлений_индексаторов;: объявление_индексатора: модификаторы_индекса: модификатор_индекса: декларатор_индексатора: Объявление_индексатора; может включать набор атрибутов; (§17) и допустимое сочетание из четырех модификаторов доступа (§10.3.5) и модификаторы new (§10.3.4), virtual (§10.6.3), override (§10.6.4), sealed (§10.6.5), abstract (§10.6.6) и extern (§10.6.7). Объявления индексаторов подчиняются тем же правилам, что и объявления методов (§10.6), в отношении допустимых сочетаний модификаторов, с одним исключением – модификатор static не допускается в объявлении индексатора.
|