Конструкции get и set в C#

Всем доброго времени суток. На связи Алексей Гулынин. В прошлой статье вы узнали, что такое спецификаторы доступа в C#. В данной статье я бы хотел поговорить о том, что такое свойство в C#, что такое конструкции get и set в С#, для чего они нужны и как их применять. Обращение к полю объекта напрямую является плохой практикой, так как это нарушает инкапсуляцию. Обычно доступ к закрытому полю объекта оборачивают в виде двух открытых методов, в которых можно заложить некую проверку, перед тем как присвоить полю значение. Давайте на простом примере покажу это. Создадим класс Sqrt с одним закрытым полем и двумя открытыми методами, которые осуществляют доступ к этому полю. Будем реализовать задачу вычисления квадратного корня из некоего числа. Также осуществим проверку, чтобы передаваемое число было неотрицательным:
class Sqrt { private double param; //поле класса public double getParam() //открытый метод, который возвращает значение поля { return param; } public void setParam(double a) //открытый метод, который присваивает значение полю { if (a < 0) { Console.WriteLine("Введите неотрицательное число"); } else { param = a; } } }
Давайте теперь создадим метод, который будет возвращать корень квадратный из числа:
public double sqrtFrom(double a) { return Math.Sqrt(a); }
Давайте теперь в методе Main проверим всё ли у нас нормально:
Sqrt sqrt1 = new Sqrt(); double b = Convert.ToDouble(Console.ReadLine()); while (b < 0) { sqrt1.setParam(b); b = Convert.ToDouble(Console.ReadLine()); } sqrt1.setParam(b); Console.WriteLine("Наше число {0}",sqrt1.getParam()); Console.WriteLine("Корень квадратный равен {0}", sqrt1.sqrtFrom(sqrt1.getParam())); Console.ReadLine();
Пример очень надуманный, написано много лишнего.
В качестве домашнего задания попробуйте сократить число строк кода и сделать его более понятным.
Как мы видим у нас есть два открытых метода. Вместо этих двух методов (в данном случае getParam() и setParam()) можно использовать одно свойство. Вот здесь-то как раз и используются get и set:
public double Param { get { return param; } set { if (value < 0) { Console.WriteLine("Введите неотрицательное число"); } else { param = value; } } }
Сразу хочу отметить, что свойство ничего не хранит. Все значения объекта хранят поля. Свойство — это лишь некая обертка для поля. Оно нужно, чтобы не писать два открытых метода. В данном случае метод set получает значение (зарезервированное слово value), а get — возвращает. При работе со свойствами не нужно забывать, что вы работаете с методами, а не с полями. Давайте теперь перепишем код в методе Main:
static void Main(string[] args) { Sqrt sqrt1 = new Sqrt(); double b = Convert.ToDouble(Console.ReadLine()); while (b < 0) { sqrt1.Param = b; b = Convert.ToDouble(Console.ReadLine()); } sqrt1.Param = b; Console.WriteLine("Наше число {0}",sqrt1.Param); Console.WriteLine("Корень квадратный равен {0}", sqrt1.sqrtFrom(sqrt1.Param)); Console.ReadLine(); }
Весь код можно посмотреть под хайдом.
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace TestApp { class Sqrt { private double param; /*public double getParam() { return param; } public void setParam(double a) { if (a < 0) { Console.WriteLine("Введите неотрицательное число"); } else { param = a; } }*/ public double sqrtFrom(double a) { return Math.Sqrt(a); } public double Param { get { return param; } set { if (value < 0) { Console.WriteLine("Введите неотрицательное число"); } else { param = value; } } } } class Program { static void Main(string[] args) { Sqrt sqrt1 = new Sqrt(); double b = Convert.ToDouble(Console.ReadLine()); while (b < 0) { //sqrt1.setParam(b); sqrt1.Param = b; b = Convert.ToDouble(Console.ReadLine()); } //sqrt1.setParam(b); sqrt1.Param = b; //Console.WriteLine("Наше число {0}", sqrt1.getParam()); //Console.WriteLine("Корень квадратный равен {0}", sqrt1.sqrtFrom(sqrt1.getParam())); Console.WriteLine("Наше число {0}",sqrt1.Param); Console.WriteLine("Корень квадратный равен {0}", sqrt1.sqrtFrom(sqrt1.Param)); Console.ReadLine(); } } }
В данной статье вы узнали, что такое свойство в C#, что такое get и set в C#, и как их использовать при работе с объектами.
На связи был Алексей Гулынин, оставляйте свои комментарии, увидимся в следующих статьях.