Инкапсуляция как способ управления доступом к данным.
Инкапсуляция
Через свойства можно установить доступ к приватным переменным класса. Подобное сокрытие состояния класса от вмешательства извне представляет механизм инкапсуляции .
Применение модификаторов доступа типа private защищает переменную от внешнего доступа. Для управления доступом во многих языках программирования используются специальные методы, геттеры и сеттеры. В C# их роль выполняют свойства.
Например, есть некоторый класс Account, в котором определено поле sum, представляющее сумму:
class Account
{
public int sum;
}
Так как переменная sum является публичной, то в любом месте программы можно получить к ней доступ и изменить ее, в том числе установить какое-либо недопустимое значение, например, отрицательное. А это не является желательным. Поэтому применяется инкапсуляция для ограничения доступа к переменной sum и сокрытию ее внутри класса:
0) { sum=value; } } } } " width="640"
class Account
{
private int sum;
public int Sum
{
get {return sum;}
set
{
if (value 0)
{
sum=value;
}
}
}
}
Автоматические свойства
Свойства управляют доступом к полям класса. Однако, если полей много, то определять каждое поле и писать для него однотипное свойство было бы утомительно. Поэтому в фреймворк .NET были добавлены автоматические свойства. Они имеют сокращенное объявление:
class Person
{
public string Name { get; set; }
public int Age { get; set; }
public Person(string name, int age)
{
Name = name;
Age = age;}}
В примере также создаются поля для свойств, только их создает не программист в коде, а компилятор автоматически генерирует при компиляции.
В чем преимущество автосвойств, если по сути они просто обращаются к автоматически создаваемой переменной, почему бы напрямую не обратиться к переменной без автосвойств? Дело в том, что в любой момент времени при необходимости мы можем развернуть автосвойство в обычное свойство, добавить в него какую-то определенную логику.
Стоит учитывать, что нельзя создать автоматическое свойство только для записи, как в случае со стандартными свойствами.
Автосвойствам можно присвоить значения по умолчанию (инициализация автосвойств):
class Person
{
public string Name { get; set; } = "Tom";
public int Age { get; set; } = 23;
}
class Program
{
static void Main(string[] args)
{
Person person = new Person();
Console.WriteLine(person.Name); // Tom
Console.WriteLine(person.Age); // 23
Console.Read();
}
}
Если не укажем для объекта Person значения свойств Name и Age, то будут действовать значения по умолчанию.
Автосвойства также могут иметь модификаторы доступа:
class Person
{
public string Name { private set; get;}
public Person(string n)
{
Name = n;
}
}
Можно убрать блок set и сделать автосвойство доступным только для чтения. В этом случае для хранения значения этого свойства для него неявно будет создаваться поле с модификатором readonly, поэтому следует учитывать, что подобные get-свойства можно установить либо из конструктора класса, как в примере выше, либо при инициализации свойства:
class Person
{
public string Name { get;} = "Tom"
}
name; // эквивалентно public string Name { get { return name; } } } " width="640"
Сокращенная запись свойств
Как и методы, можно сокращать свойства. Например:
class Person
{
private string name;
public string Name = name;
// эквивалентно public string Name { get { return name; } }
}