Читать интересную книгу Описание языка PascalABC.NET - W Cat

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 13 14 15 16 17 18 19 20 21 ... 101

Оператор try ... finally

Оператор try ... finally имеет вид:

try

операторы

finally

операторы

end;

Операторы в блоке finally выполняются безотносительно к тому, возникло или нет исключение в блоке try. При этом само исключение не обрабатывается.

Блок finally используется для возвращения ранее выделенных ресурсов.

Пример 1. Закрытие открытого файла.

reset(f);

try

...

finally

close(f);

end;

Файл будет закрыт независимо от того, произошло ли ислючение в блоке try.

Пример 2. Возвращение выделенной динамической памяти.

New(p);

try

...

finally

Dispose(p);

end;

Динамическая память, контролируемая указателем p, будет возвращена независимо от того, произошло ли ислючение в блоке try.

Оператор raise

Оператор raise предназначен для возбуждения исключения и имеет вид:

raise объект

Здесь объект - объект класса, производного от Exception. Например:

raise new Exception('Ошибка');

При возбуждении специфического исключения желательно определить свой тип исключения.

Для повторной генерации исключения внутри секции except используется также вызов raise без параметров:

raise;

Операторы += и -= для процедурных переменных

Оператор присваивания += предназначен для присоединения к процедурной переменной процедуры, оператор присваивания -= - для отсоединения. Подпрограммы вызываются в порядке присоединения. Например:

procedure mult2(var r: real);

begin

r := 2 * r;

end;

procedure add3(var r: real);

begin

r := r + 3;

end;

var

p: procedure (var x: real);

r: real;

begin

r := 1;

p := mult2;

p += add3;

p(r); // r := 2 * r; r := r + 3;

p -= mult2;

p(r); // r := r + 3;

end.

Отсоединение не присоединенных подпрограмм не выполняет никаких действий.

Кроме того, к процедурной переменной можно прикреплять/откреплять статические и экземплярные методы классов. Пример см. в теме процедурные переменные.

Операторы += и -= используются также для добавления/удаления обработчиков для событий .NET. Например:

procedure OnTimer1(sender: object; e: System.Timers.ElapsedEventArgs);

begin

write(1);

end;

begin

var Timer1 := new System.Timers.Timer(1000);

Timer1.Elapsed += OnTimer1;

Timer1.Start;

while True do

Sleep(1000);

end.

Оператор lock

Оператор lock имеет вид:

lock объект do

оператор

Объект обязательно принадлежит к ссылочному типу.

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

Оператор

lock obj do

oper;

полностью эквивалентен следующему участку кода:

Monitor.Enter(obj);

try

oper;

finally

Monitor.Exit(obj);

end;

Процедуры и функции: обзор

Что такое процедуры и функции

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

Описание процедур и функций

Любая используемая в программе процедура или функция должна быть предварительно описана в разделе описаний.

Описание процедуры имеет вид:

procedure имя(список формальных параметров);

раздел описаний

begin

операторы

end;

Описание функции имеет вид:

function имя(список формальных параметров): тип возвращаемого значения;

раздел описаний

begin

операторы

end;

Операторы подпрограммы, окаймленные операторными скобками begin/end, называются телом этой подпрограммы.

Список формальных параметров вместе с окружающими скобками может отсутствовать. Он состоит из одной или нескольких секций, разделенных символом ;. Каждая секция состоит из списка переменных, перечисляемых через запятую, после которого следуют двоеточие и тип. Каждая секция может предваряться ключевым словом var или const, что указывает на то, что параметры передаются по ссылке (см.п. Параметры процедур и функций). Тип формального параметра должен быть либо именем, либо динамическим массивом, либо множеством, либо процедурной переменной (для последних трех типов имеет место структурная эквивалентность типов).

Раздел описаний процедуры или функции устроен так же, как и раздел описаний основной программы. Здесь описываются так называемые локальные переменные и константы, типы (за исключением классов - классы можно описывать только глобально) а также вложенные процедуры и функции. Все такие локальные объекты доступны лишь внутри данной подпрограммы и не видны извне.

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

Например:

procedure DoAdd(a,b: real; var res: real);

begin

res := a + b;

end;

Вызов подпрограммы

Подпрограмма один раз описывается и может быть многократно вызвана. Для вызова процедуры используется оператор вызова процедуры:

begin

var x := ReadInteger;

var y := ReadInteger;

var res: integer;

DoAdd(x,y,res);

Print(res);

DoAdd(2*x,y,res);

Print(res);

end;

Для вызова функции используется выражение вызова функции.

Переменная Result

Внутри тела любой функции определена специальная переменная с именем Result, которая хранит результат вычисления функции. Ее тип совпадает с типом возвращаемого значения функции. Например:

function Sum(a,b: real): real;

begin

Result := a + b;

end;

function MinElement(a: array of real): real;

begin

Result := real.MaxValue;

foreach var x in a do

if x < Result then

Result := x;

end;

begin

var a := Seq(1,5,3);

writeln(MinElement(a) + Sum(2,3));

end.

Если внутри функции не присвоить переменной Result некоторое значение, то функция вернет в результате своего вызова непредсказуемое значение.

Упрощенный синтаксис описания подпрограмм

В PascalABC.NET имеется упрощенный синтаксис описания однооператорных процедур и функций:

procedure WriteStar := write('*');

и

function Add(a,b: real): real := a + b;

При этом для возвращаемого значения функции возможен автовывод типов:

function Add(a,b: real) := a + b;

Параметры процедур и функций

Параметры, указываемые при описании подпрограммы, называются формальными. Параметры, указываемые при вызове подпрограммы, называются фактическими.

Если формальный параметр описан с предваряющим ключевым словом var или const, то его называют параметром-переменной и говорят, что он передается по ссылке. Если же параметр описан без слов var или const, то его называют параметром-значением и говорят, что он передается по значению. Слово ссылка используется в PascalABC.NET также в другом значении - для ссылочных типов.

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

Например, пусть имеется следующее описание процедуры:

1 ... 13 14 15 16 17 18 19 20 21 ... 101
На этом сайте Вы можете читать книги онлайн бесплатно русская версия Описание языка PascalABC.NET - W Cat.
Книги, аналогичгные Описание языка PascalABC.NET - W Cat

Оставить комментарий