Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
CSharp Language Specification.doc
Скачиваний:
13
Добавлен:
26.09.2019
Размер:
4.75 Mб
Скачать

10.7.3Автоматически реализуемые свойства

Для свойства, определенного как автоматически реализуемое свойство, автоматически создается скрытое резервное поле, для которого реализуются методы доступа для чтения и записи.

Следующий пример:

public class Point { public int X { get; set; } // automatically implemented public int Y { get; set; } // automatically implemented }

равнозначен следующему объявлению:

public class Point { private int x; private int y; public int X { get { return x; } set { x = value; } } public int Y { get { return y; } set { y = value; } } }

Поскольку резервное поле недоступно, чтение и запись его значений осуществляются только с помощью методов доступа свойства, даже внутри типа контейнера. Это означает, что автоматически реализуемые свойства только для чтения или только для записи не имеют смысла и не разрешены. Однако возможно задать различные уровни доступа для каждого из методов доступа. Таким образом, можно имитировать свойство только для чтения с закрытым резервным полем следующим образом:

public class ReadOnlyPoint { public int X { get; private set; } public int Y { get; private set; } public ReadOnlyPoint(int x, int y) { X = x; Y = y; } }

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

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 string Text { get { return "hello"; } set { } }

public int Count { get { return 5; } set { } } }

class B: A { private string text = "goodbye"; private int count = 0;

new public string Text { get { return text; } protected set { text = value; } }

new protected int Count { get { return count; } set { count = value; } } }

class M { static void Main() { B b = new B(); b.Count = 12; // Calls A.Count set accessor int i = b.Count; // Calls A.Count get accessor b.Text = "howdy"; // Error, B.Text set accessor not accessible string s = b.Text; // Calls B.Text get accessor } }

Метод доступа, используемый для реализации интерфейса, может не содержать модификатор_метод_доступа. Если для реализации интерфейса используется только один метод доступа, второй метод доступа может быть объявлен с помощью модификатора_метода_доступа:

public interface I { string Prop { get; } }

public class C: I { public Prop { get { return "April"; } // Must not have a modifier here internal set {...} // Ok, because I.Prop has no set accessor } }

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]