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

91

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

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

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

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

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 };
             */

            Console.ReadLine();
        }
    }
}

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

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

Пройди тесты
Лучший чат для C# программистов