Volatile 11 страница
using System.IO; public class Console public static TextReader In { public static TextWriter Out { public static TextWriter Error { Класс Console содержит три свойства (In, Out и Error), которые представляют стандартные устройства ввода, вывода и вывода ошибок соответственно. Благодаря предоставлению этих членов в виде свойств класса Console обеспечивается задержка их инициализации до момента фактического использования Например, при первой ссылке на свойство Out, как показано в примере Console.Out.WriteLine("hello, world"); создается базовый объект TextWriter для устройства вывода. Однако если приложение не ссылается на свойства In и Error, объекты для этих устройств не создаются. 10.7.3 Автоматически реализуемые свойства Для свойства, определенного как автоматически реализуемое свойство, автоматически создается скрытое резервное поле, для которого реализуются методы доступа для чтения и записи. Следующий пример: public class Point { равнозначен следующему объявлению: public class Point { Поскольку резервное поле недоступно, чтение и запись его значений осуществляются только с помощью методов доступа свойства, даже внутри типа контейнера. Это означает, что автоматически реализуемые свойства только для чтения или только для записи не имеют смысла и не разрешены. Однако возможно задать различные уровни доступа для каждого из методов доступа. Таким образом, можно имитировать свойство только для чтения с закрытым резервным полем следующим образом: public class ReadOnlyPoint { Это ограничение также означает, что явное присваивание типов структуры автоматически реализуемым свойствам может осуществляться только с помощью стандартного конструктора структуры, поскольку для присваивания самого свойства требуется явное присваивание структуры. Это означает, что пользовательские конструкторы должны вызывать конструкторы по умолчанию. 10.7.4 Доступность; Если метод доступа содержит модификатор_метода_доступа;, область доступности (§3.5.2) метода определяется на основании объявленной доступности модификатора_метода_доступа;. Если метод доступа не содержит модификатор_метода_доступа;, область доступности метода определяется на основании объявленной доступности свойства или индексатора. Наличие модификатора_метода_доступа; никогда не влияет на поиск членов (§7.3) или разрешение перегрузки (§7.5.3). Модификаторы свойства или индексатора всегда определяют связанные свойство или индексатор независимо от контекста доступа. После выбора конкретного свойства или индексатора допустимость их использования определяется на основании областей доступности задействованных методов доступа. · Для использования в качестве значения (§7.1.1) должен существовать и быть доступным метод доступа get. · Для использования в качестве конечного объекта операции простого присваивания (§7.17.1) должен существовать и быть доступным метод доступа set. · Для использования в качестве конечного объекта операции составного присваивания (§7.17.2) или в качестве конечного объекта операторов «++» или «--» (§7.5.9, §7.6.5) должны существовать и быть доступны оба метода доступа (get и set). В следующем примере свойство A.Text скрывается свойством B.Text даже в тех контекстах, в которых вызывается только метод доступа set. Противоположно этому, свойство B.Count недоступно для класса M, в связи с чем вместо него используется доступное свойство A.Count. class A public int Count { class B: A new public string Text { new protected int Count { class M Метод доступа, используемый для реализации интерфейса, может не содержать модификатор_метод_доступа. Если для реализации интерфейса используется только один метод доступа, второй метод доступа может быть объявлен с помощью модификатора_метода_доступа;: public interface I public class C: I 10.7.5 Виртуальные, запечатанные, переопределяющие и абстрактные методы доступа Объявление свойства virtual указывает, что методы доступа свойства являются виртуальными. Модификатор virtual применяется к обоим методам доступа свойства для чтения и записи. Объявление в качестве виртуального только одного метода доступа такого свойства не допускается. Объявление свойства abstract указывает, что методы доступа свойства являются виртуальными, однако не предоставляет их фактической реализации. Вместо этого необходимо определить неабстрактные производные классы, предоставляющие собственные реализации методов доступа посредством переопределения свойства. Поскольку метод доступа для объявления абстрактного свойства не предоставляет фактической реализации, тело_метода_доступа; содержит только точку с запятой. Объявление свойства, содержащее одновременно модификаторы abstract и override, указывает, что свойство является абстрактным и переопределяет базовое свойство. Методы доступа такого свойства также являются абстрактными. Объявления абстрактных свойств допускаются только в абстрактных классах (§10.1.1.1). Методы доступа унаследованного виртуального свойства можно переопределить в производном классе, включив объявление свойства, задающее директиву override. Этот способ называется переопределяющим объявлением свойства. Переопределяющее объявление свойства не объявляет новое свойство. Вместо этого оно уточняет реализацию методов доступа существующего виртуального свойства.
|