Public class MainClass

Set

Set

Class SampleClass

Определение свойств

Class SampleClass

Определение полей

Поля объявляются с типом подобно тому, как это делается со всеми прочими переменными [5 – Неш, C# 2010 Уск. Курс для проф.]. При этом также могут использоваться модификаторы доступа.

Определение поля: (MSDN_ООП_VB+C#_2010)

 

{ public string sampleField;

}

 

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

 

private int х = 789; // Инициализация с помощью константы

private int z = A.InitZ(); // Инициализация с помощью метода

 

Следует обратить внимание, что эта инициализация происходит во время выполнения, а не во время компиляции. Поэтому при инициализации могут использоваться не только константы. Например, переменная z инициализируется вызовом метода A.InitZ() . Поначалу такое обозначение инициализации поля может показаться значительным сокращением, избавляющим от необходимости инициализировать все поля внутри тела конструктора. Однако для объявлений сложных типов все-таки рекомендуется инициализировать поля экземпляра внутри тела конструктора экземпляра.

 

Свойства – один из самых замечательных механизмов С# и CLR, который позволяет достичь лучшей инкапсуляции. Если говорить коротко, то свойства используются для ужесточения контроля доступа к внутреннему состоянию объекта.

С точки зрения клиента объекта свойство выглядит и ведет себя аналогично общедоступному полю. Доступ к свойству организован так же, как и доступ к общедоступному полю экземпляра класса. Однако свойство не имеет никакого ассоциированного с ним места хранения в объекте, как это присуще полю. Вместо этого свойство предоставляет средства доступа для чтения и записи поля. Типичный шаблон предусматривает обеспечение доступа к приватному полю класса через общедоступное свойство.

Синтаксис определения свойства очень прост. Для его реализации нужно определить поле для хранения значения свойства, а затем реализовать базовую логику для хранения и извлечения этого значения соответственно в блоках set и get, например:

 

{ private int sample; // Определение поля

public int Sample // Определение свойства

{ get

{ return sample; // Возвращение значения, сохраненного в поле

}

{ sample = value; // Сохранение значения в поле

}

}

}

 

Блок get вызывается, когда клиент объекта читает свойство, и обеспечивает возвращение значения поля, соответствующего свойству.

Блок set вызывается, когда клиент объекта пытается записать свойство. Обратите внимание, что в этом блоке нет возвращаемого значения, но есть специальная переменная value, которая доступна коду внутри этого блока и имеет тот же тип, что объявлен в качестве типа свойства. При записи значения в свойство именно через переменную value передается значение, которое клиент пытается присвоить свойству. При попытке объявить локальную переменную по имени value в блоке set, будет получена ошибка компиляции.

Пример 14.1. Определение класса T со свойством Temperature, которое просто возвращает или изменяет значение приватного поля temperature из внутреннего состояния экземпляра объекта. Затем создается объект (objT, экземпляр класса T), изменяется в нем значение указанного свойства и выводится на экран это значение.

 

using System;

public class T // Определение класса

{ private int temp; // Определение поля

public int Temperature // Определение свойства

{ get

{ Console.WriteLine("Извлечение значения temp.");

return temp; // Возврат значения, хранимого в поле

}

{ Console.WriteLine("Установка значения temp.");

temp = value; // Сохранение значения в поле

}

}

}

{ static void Main() // Точка входа в программу

{ T objT = new T(); // Создание экземпляра класса (объекта)

objT.Temperature = 20; // Изменение значения свойства

Console.WriteLine("T = {0}", objT.Temperature);

// Вывод значения температуры (свойства)

Console.ReadLine(); // Ожидание нажатия клавиши <Enter>

}

}

/* Вывод: