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

get-i-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#, и как их использовать при работе с объектами.

На связи был Алексей Гулынин, оставляйте свои комментарии, увидимся в следующих статьях.


Комментарии:

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *