Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Руководство_по_C#.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
10.01 Mб
Скачать

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

Начиная с версии C# 3.0, появилась возможность для реализации очень простых свойств, не прибегая к явному определению переменной, которой управляет свойство. Вместо этого базовую переменную для свойства автоматически предоставляет компилятор. Такое свойство называется автоматически реализуемым и принимает следующую общую форму:

тип имя { get; set; }

где тип обозначает конкретный тип свойства, а имя — присваиваемое свойству имя. Обратите внимание на то, что после обозначений аксессоров get и set сразу же следует точка с запятой, а тело у них отсутствует. Такой синтаксис предписывает компилятору создать автоматически переменную, иногда еще называемую поддерживающим полем, для хранения значения. Такая переменная недоступна непосредственно и не имеет имени. Но в то же время она может быть доступна через свойство, например:

using System;

namespace ConsoleApplication1

{

class MyCls

{

// "Автоматическое" свойство

public int Prop { set; get; }

public MyCls() { Prop = 45; }

}

class Program

{

static void Main()

{

MyCls obj = new MyCls();

Console.WriteLine(obj.Prop); // выводится 45

obj.Prop = 123;

Console.WriteLine(obj.Prop); // выводится 123

Console.ReadKey();

}

}

}

Если в приведенном классе убрать инициализацию Prop в конструкторе, то свойству будет присвоено значение 0.

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

5.15Модификаторы доступа в аксессорах

По умолчанию доступность аксессоров set и get оказывается такой же, как и у индексатора и свойства, частью которых они являются. Так, если свойство объявляется как public, то по умолчанию его аксессоры set и get также становятся открытыми (public). Тем не менее для аксессора set или get можно указать собственный модификатор доступа, например private. Но в любом случае доступность аксессора, определяемая таким модификатором, должна быть более ограниченной, чем доступность, указываемая для его свойства или индексатора.

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

Вышесказанное иллюстрирует нижеследующее:

namespace ConsoleApplication1

{

class UserInfo

{

int age;

public int Age

{

get { return age; }

// Присваивание закрыто вне класса

private set { age = value; }

}

public int myAge()

{

// Внутри класса доступ открыт

Age = 26;

return Age;

}

}

class Program

{

static void Main(string[] args)

{

UserInfo ui = new UserInfo();

ui.myAge();

// Для чтения доступ открыт вне класса

Console.WriteLine(ui.Age);

/*

Так нельзя:

ui.Age = 26;

UserInfo ui1 = new UserInfo{ Age = 26 };

*/

}

}

}

Вероятно, ограничение доступа к аксессорам оказывается наиболее важным для работы с автоматически реализуемыми свойствами. Cоздать автоматически реализуемое свойство только для чтения или же только для записи нельзя, поскольку оба аксессора, get и set, должны быть указаны при объявлении такого свойства. Тем не менее добиться желаемого результата все же можно, объявив один из аксессоров автоматически реализуемого свойства как private.

На применение модификаторов доступа в аксессорах накладываются следующие ограничения:

  • Действию модификатора доступа подлежит только один аксессор: set или get, но не оба сразу.

  • Модификатор должен обеспечивать более ограниченный доступ к аксессору, чем доступ на уровне свойства или индексатора.

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