Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Теоретический_курс.doc
Скачиваний:
36
Добавлен:
10.11.2019
Размер:
7.68 Mб
Скачать

3.7.5. Понятие «Свойство» Понятие «Свойство»

1. Понятие «Свойство»

Свойство — это член, предоставляющий гибкий механизм для чтения, записи или вычисления значения частного поля (переменной). Свойства можно использовать, как если бы они являлись открытыми членами данных, хотя в действительности они являются специальными методами, называемыми методами доступа. Это обеспечивает простой доступ к данным и позволяет повысить уровень безопасности и гибкости методов.

В данном примере ниже, класс TimePeriod хранит сведения о периоде времени. Внутри класса время хранится в секундах, но свойство с именем Hours позволяет клиенту задать время в часах. Методы доступа для свойства Hours выполняют преобразование между часами и секундами:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace LC_Console

{

class TimePeriod

{

private double seconds;

// Свойство

public double Hours

{

get { return seconds / 3600; }

set { seconds = value * 3600; }

}

}

class Program

{

static void Main()

{

TimePeriod t = new TimePeriod();

// При передаче значения свойству будет вызвано "set" (24 * 3600)

t.Hours = 24;

// Извлечение значения из свойства вызывает "get" (24 * 3600 / 3600)

Console.WriteLine("Время в часах: " + t.Hours);

Console.WriteLine("Для продолжение нажмите любую клавишу . . . ");

Console.ReadKey();

}

}

}

/* Выведет:

* Время в часах: 24

* Для продолжение нажмите любую клавишу . . .

*/

Общие сведения о свойствах:

  • Свойства позволяют классу предоставлять общий способ получения и задания значений, скрывая при этом код реализации или проверки.

  • Метод доступа свойства get используется для возврата значения свойства, а метод доступа set используется для назначения нового значения. Эти методы доступа могут иметь различные уровни доступа. Дополнительные сведения можно получить в разделе Ограничение доступности методов доступа (Руководство по программированию на C#) (http://msdn.microsoft.com/ru-ru/library/75e8y5dd.aspx).

  • Ключевое слово value используется для определения значения, присваиваемого методом доступа set.

  • Свойства, которые не реализуют метод доступа set, доступны только для чтения.

  • Для простых свойств, не требующих пользовательского кода метода доступа, рассмотрите возможность использования автоматически реализуемых свойств.

2. Метод доступа get для свойства

Основная часть метода доступа get похожа на основную часть метода. Она должна возвращать значение типа свойства. Выполнение метода доступа get эквивалентно считыванию значения поля. Например, когда возвращается частная переменная из метода доступа get и разрешена оптимизация, вызов метода доступа get встраивается компилятором, что позволяет избежать ненужных затрат на вызов метода. Однако виртуальный метод доступа get не может быть встроен, поскольку во время компиляции у компилятора нет данных о том, какой метод может быть вызван во время выполнения. Ниже приведён метод доступа get, который возвращает значение частного поля name:

class Person

{

private string name; // Поле

public string Name // Свойство

{

get

{

return name;

}

}

}

При создании ссылки на свойство, кроме случая присвоения ему значения, для чтения значения свойства вызывается метод доступа get. Пример:

Person person = new Person();

//...

Console.WriteLine(person.Name); // Вызывается "get" для чтения значения

Метод доступа get должен заканчиваться оператором return или throw, а элемент управления не должен выходить за основную часть метода доступа.

Изменение состояния объекта с помощью метода доступа get указывает на низкую квалификацию программиста. Например, следующий метод доступа имеет побочный эффект, заключающийся в изменении состояния объекта при каждой операции доступа к полю number:

private int number;

public int Number

{

get

{

return number++; // Не делайте так...

}

}

Метод доступа get можно использовать для возвращения значения поля или для вычисления и возвращения этого значения. Пример:

class Employee

{

private string name;

public string Name

{

get

{

return name != null ? name : "Не установлено";

}

}

}

Если в предыдущем фрагменте кода свойству Name не назначается какое-либо значение, это свойство возвращает значение «NA».