Свойства в C#
Инкапсуляция данных не позволяет напрямую обращаться к закрытым членам класса из другого класса. Для работы с такими данными могут создаваться подпрограммы, входящие в состав класса, и имеющие статус доступа public. (см. пример выше: функции get_num(), get_name() и get_price()). В языке C# предусмотрена возможность вместо таких функций применять так называемые «свойства» (принятый в литературе термин неудачный, может быть следовало бы применять термин «аксессор», но он уже используется к фрагментам get и set). Формат оформления «свойства» имеет вид:
public <тип> <имя свойства>
{
get { return <имя переменной>; } // Получение значения
set { <имя переменной> = value;} // Установка значения
}
Имеется в виду, что переменная, имя которой указано, имеет закрытый доступ. <имя свойства> и <имя переменной> должны быть разными. Часто применяется прием, при котором эти имена отличаются одной или несколькими заглавными или строчными буквами. Например, в примере ниже <имя переменной> price, а <имя свойства> Price. В отличие от функции круглые скобки после имени «свойства» не записываются. Лексеме value присваивается значение вызывающим кодом. Эта лексема является контекстуальным ключевым словом, и, когда входит в состав фрагмента с set, всегда имеет тип, совпадающий с типом «свойства». Например, если объявлен объект tov, то обращение к элементам класса Product с помощью «свойств» будет иметь вид:
double cost = tov.Price; // Использование «свойства» get
tov.Price = 125.50; // Использование «свойства» set
Обратите внимание, форма обращения одинаковая, изменяется только положение лексемы обращения к члену класса (pr.Price) относительно знака равенства.
Ниже приведена программа, которая была приведена выше, но в ней вместо функций get_num(), get_name() и get_price() оформлены «свойства» Prod_Num, Prod_Name и Price. Изменена также форма обращения к элементам класса Product. В этом примере значения только извлекаются из объекта pr класса Product, поэтому свойства set можно было бы не оформлять. Если их пропустить, то при попытке использования «свойства» будет выдано сообщение о том, что соответствующая переменная доступна только для чтения.
using System;
using System.Collections.Generic;
using.Linq;
using System.Text;
namespace Project2
{
class Product // Товар
{
private int prod_num; // Штрих код товара
private string prod_name; // Название товара
private double price; // Цена
public int Prod_Num
{
get { return prod_num; } // Получение значения
set { prod_num = value;} // Установка значения value см ниже
}
public string Prod_Name
{
get { return prod_name; }
set { prod_name = value;}
}
public double Price
{
get { return price; }
set { price = value; }
}
// Конструктор с параметрами
public Product(int Num, string Name, double Pr)
{ // Присвоение значений аргументов переменным класса
prod_num = Num;
prod_name = Name;
price = Pr;
}
}
class Order // Заказ
{
private static double Order_Cost; // Стоимость заказа
private static string Client_Name; // Фамилия клиента
private static int Product_Quan; // Количество
static void Main(string[] args)
{
//
Product tov = new Product(123456, "Молоток", 120.75);
Console.WriteLine("
Введите имя клиента и количество товара
");
//
Client_Name = Console.ReadLine();
Product_Quan= int.Parse(Console.ReadLine());
Order_Cost = tov.Price * Product_Quan;
Console.WriteLine("
Клиент " + Client_Name + " заказал товар
" +
tov.Prod_Name + " (штрих код "+ tov.Prod_Num+") в количестве "+
Product_Quan + "
на сумму " + Order_Cost);
Console.ReadKey(); // Останов экрана пользователя
}
}
}
Свойства могут быть оформлены упрощенно. Просто после имени переменной можно вставить
{ get; set; }
Однако такая форма может применяться только для переменных, объявленных с уровнем доступа public, поэтому не видно разницы между обычным обращением к таким переменным без использования и с использованием «свойств». Преимущество состоит в том, что появляется возможность разграничения доступа для считывания и изменения значения, а также можно выполнять предварительные вычисления. Так, если записать:
public int x{ get; private set; }
В этом случае переменная x доступна только для чтения.
Свойства в C#
Лекции по предмету «Программирование»