Свойства класса C#

Общие сведения о свойствах C#.

Свойства в C# представляют собой одну из форм инкапсуляции данных класса. Они позволяют управлять доступом к закрытым полям класса.

В общем виде определение свойств может быть представлено следующим образом:

// определение поля класса
тип_поля поле_класса;

// определение свойства класса
тип_свойства имя_свойства {
    get { // чтение поля класса
        return поле_класса;
    }
    set { // запись поля класса
        поле_класса = value;
    }
}

Доступ к свойству так же как и к полям класса:

объект_класса.имя_свойства = значение;

Свойство может содержать два метода: get – для получения значения поля и set – для установки значения поля. Метода set может отсутствовать, если нужно создать свойство только для чтения. Если нужно создать свойство только для записи, в свойстве может отсутствовать метод get.

Внутри метода set может использоваться ключевое слово value для доступа к устанавливаемому значению.


Инкапсуляция полей класса. Ограничение доступа к полю.

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

public class Person {
    // закрытое поле класса
    private int _age;

    // свойство для доступа к полю _age
    public int Age {
        get {
            return _age;
        }
        set {
            if ( value >= 0 && value <= 100 ) 
                _age = value;
            else
                throw new ArgumentOutOfRangeException(
                   "Возраст должен быть в пределах от 0 до 100 лет");
        }
    }
}

В этом примере ограничивается установка поля _age значением от 0 до 100 лет. При попытке назначить значение выходящее за эти пределы, генерируется исключение ArgumentOutOfRangeException.

Поле класса можно ограничить только чтением, или вообще не использовать поле:

public class Math {
    // свойство возвращающее число Пи
    public double Pi {
        get {
            return 3.14;
        }
    }
}

Использование автоматических свойств.

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

// определение свойства класса
тип_свойства имя_свойства {
    get; set;
}

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

Пример использования автоматического свойства:

public class Person {
    // автоматическое свойство
    public string Name {
        get; set;
    }
}

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

public class Person {
    private string _name;
    
    public string get_Name() {
        return _name; 
    }

    public void set_Name( string value ) {
        _name = value; 
    }
}

Вот как выглядит этот этот класс в программе ildasm.exe:

Декомпилированный класс Person

Из рисунка видно, что свойство Name было преобразовано компилятором в закрытое поле _name и два метода get_Name и set_Name.

avatar
5000
  Подписаться  
Уведомление о