Конструкции 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#, и как их использовать при работе с объектами.
На связи был Алексей Гулынин, оставляйте свои комментарии, увидимся в следующих статьях.




