Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Части get и set свойства или индексатора называются методами доступа. По умолчанию они имеют такие же уровни видимости или доступа, что и свойство или индексатор, которым они принадлежат. Дополнительные сведения см. в разделе Уровни доступа. Однако иногда полезно ограничить доступ к одному из этих методов доступа. Как правило, вы ограничиваете доступность set метода доступа, делая метод get доступа общедоступным. Например:
private string _name = "Hello";
public string Name
{
get
{
return _name;
}
protected set
{
_name = value;
}
}
В этом примере свойство Name определяет методы доступа get и set. Метод доступа get получает уровень доступа самого свойства public в этом случае, а к методу set доступ явно ограничивается установкой модификатора доступа protected.
Примечание.
Примеры, приведенные в этой статье, не используют автоматически реализованные свойства. Автоматически реализованные свойства предоставляют краткий синтаксис для объявления свойств, если настраиваемое поле резервного копирования не требуется.
Ограничения модификаторов доступа для аксессоров
При использовании модификаторов доступа для свойств или индексаторов необходимо соблюдать следующие ограничения:
- Модификаторы доступа нельзя использовать для интерфейса или явной реализации элемента интерфейса.
- Модификаторы доступа можно использовать только в том случае, если для свойства или индексатора определены одновременно методы доступа
setиget. В этом случае модификатор может применяться только к одному из двух методов доступа. - Если свойству или индексатору назначен модификатор override, модификатор аксессора должен соответствовать модификатору переопределяемого аксессора, если такой существует.
- Уровень доступности аксессора должен быть более строгим по сравнению с уровнем доступа самого свойства или индексатора.
Модификаторы доступа при переопределении аксессоров
При переопределении свойства или индексатора переопределенные методы доступа должны быть доступны коду переопределения. Кроме того, доступность свойства/индексатора и их аксессоров должна соответствовать доступности соответствующих переопределенных свойства/индексатора и их аксессоров. Например:
public class Parent
{
public virtual int TestProperty
{
// Notice the accessor accessibility level.
protected set { }
// No access modifier is used here.
get { return 0; }
}
}
public class Kid : Parent
{
public override int TestProperty
{
// Use the same accessibility level as in the overridden accessor.
protected set { }
// Cannot use access modifier here.
get { return 0; }
}
}
Реализация интерфейсов
Используя аксессор для реализации интерфейса, аксессор может не иметь модификатор доступа. Тем не менее при реализации интерфейса с использованием одного метода доступа (например, get) другой метод доступа может иметь модификатор доступа, как показано в следующем примере:
public interface ISomeInterface
{
int TestProperty
{
// No access modifier allowed here
// because this is an interface.
get;
}
}
public class TestClass : ISomeInterface
{
public int TestProperty
{
// Cannot use access modifier here because
// this is an interface implementation.
get { return 10; }
// Interface property does not have set accessor,
// so access modifier is allowed.
protected set { }
}
}
Домен доступности акцессоров
При использовании модификатора доступа для аксессора этот модификатор определяет область доступности для этого аксессора.
Если для аксессора не использовался модификатор доступа, то его уровень доступа определяется уровнем доступности свойства или индексатора.
Пример
В следующем примере определяются три класса: BaseClass, DerivedClass и MainClass. На обоих классах имеются свойства BaseClass, Name и Id. В этом примере демонстрируется, как свойство Id класса DerivedClass может быть скрыто свойством Id класса BaseClass при использовании ограничивающего модификатора доступа, такого как protected или private. Таким образом, при присвоении значений этому свойству вместо него вызывается свойство класса BaseClass. Чтобы сделать это свойство доступным, необходимо заменить модификатор доступа на public.
В этом примере также показано, что ограничивающий модификатор доступа, такой как private или protected, на методе доступа свойству Name в DerivedClass предотвращает доступ к этому методу в производном классе. При присваивании ему значения или доступе к свойству базового класса с тем же именем, если оно доступно, генерируется ошибка.
public class BaseClass
{
private string _name = "Name-BaseClass";
private string _id = "ID-BaseClass";
public string Name
{
get { return _name; }
set { }
}
public string Id
{
get { return _id; }
set { }
}
}
public class DerivedClass : BaseClass
{
private string _name = "Name-DerivedClass";
private string _id = "ID-DerivedClass";
new public string Name
{
get
{
return _name;
}
// Using "protected" would make the set accessor not accessible.
set
{
_name = value;
}
}
// Using private on the following property hides it in the Main Class.
// Any assignment to the property will use Id in BaseClass.
new private string Id
{
get
{
return _id;
}
set
{
_id = value;
}
}
}
class MainClass
{
static void Main()
{
BaseClass b1 = new BaseClass();
DerivedClass d1 = new DerivedClass();
b1.Name = "Mary";
d1.Name = "John";
b1.Id = "Mary123";
d1.Id = "John123"; // The BaseClass.Id property is called.
System.Console.WriteLine("Base: {0}, {1}", b1.Name, b1.Id);
System.Console.WriteLine("Derived: {0}, {1}", d1.Name, d1.Id);
// Keep the console window open in debug mode.
System.Console.WriteLine("Press any key to exit.");
System.Console.ReadKey();
}
}
/* Output:
Base: Name-BaseClass, ID-BaseClass
Derived: John, ID-BaseClass
*/
Комментарии
Обратите внимание, что если заменить объявление new private string Id на new public string Id, будут получены следующие выходные данные:
Name and ID in the base class: Name-BaseClass, ID-BaseClass
Name and ID in the derived class: John, John123