Паскаль (язык программирования)
Паска́ль (англ. Pascal) — один из наиболее известных языков программирования[5], используется для обучения программированию в старших классах и на первых курсах вузов, является основой для ряда других языков. ![]() ИсторияЯзык программирования Pascal был создан в 1970 году на основе языка Алгол-60[6]. Pascal создавался Никлаусом Виртом в 1968—1969 годах после его участия в работе комитета разработки стандарта языка Алгол-68. Язык назван в честь французского математика, физика, литератора и философа Блеза Паскаля, который создал одну из первых в мире механических машин, складывающую два числа. Первая публикация Вирта о языке датирована 1970 годом; представляя язык, автор в качестве цели его создания указывал построение небольшого и эффективного языка, способствующего хорошему стилю программирования, использующему структурное программирование и структурированные данные.[источник не указан 1085 дней] Последующая работа Вирта была направлена на создание на основе Паскаля языка системного программирования с сохранением возможности вести на его базе систематический, целостный курс обучения профессиональному программированию: «The guiding idea was to construct a genuine successor of Pascal meeting the requirements of system engineering, yet also to satisfy my teacher’s urge to present a systematic, consistent, appealing, and teachable framework for professional programming.». Результатом этой работы стал язык Модула-2, после которого Вирт занялся разработкой объектно-ориентированного языка программирования Oberon на основе всех предыдущих разработок[6]. Одной из целей создания языка Паскаль Никлаус Вирт считал обучение студентов структурному программированию. До сих пор Паскаль заслуженно считается одним из лучших языков для начального обучения программированию. Его современные модификации, такие как Object Pascal, широко используются в коммерческом программировании (среда Delphi). Также на основе синтаксиса языка Паскаль создан язык программирования Structured Text (ST) или Structured Control Language (SCL) для программируемых логических контроллеров.[источник не указан 1085 дней] К 1990-м годам Pascal стал одним из наиболее распространённых в мире алгоритмических языков программирования. Ведущие разработчики программного обеспечения регулярно выпускали новые версии своих компиляторов для этого языка. Популярные компиляторы того времени: Turbo Pascal (разработан компанией Borland), Microsoft Pascal Compiler, Quick Pascal, Pascal-2, Professional Pascal, USCD Pascal[7]. Реализации и диалектыЯзык Pascal имеет много реализаций[8]. UCSD PascalВ 1978 году в Калифорнийском университете в Сан-Диего была разработана система UCSD p-System, включавшая порт компилятора Вирта с языка Паскаль в переносимый p-код, редактор исходных кодов, файловую систему и прочее[9], а также реализовывавшая значительное число расширений языка Паскаль, такие как модули, строки символов переменной длины, директивы трансляции, обработка ошибок ввода-вывода, обращение к файлам по именам и другое. Впоследствии основные реализации языка Паскаль основывались на этом диалекте. Object PascalВ 1986 году фирма Apple разработала объектное расширение языка Паскаль, получив в результате Object Pascal. Он был разработан группой Ларри Теслера, который консультировался с Никлаусом Виртом. Turbo Pascal и Object PascalВ 1983 году появилась первая версия интегрированной среды разработки Turbo Pascal фирмы Borland, основывавшаяся на одноимённой реализации Паскаля. В 1989 году объектное расширение языка было добавлено в Turbo Pascal версии 5.5. Последняя версия (7.0) была переименована в Borland Pascal. Объектные средства были позаимствованы из Object Pascal от Apple, языковые различия между объектным Turbo Pascal 5.5 и Object Pascal от Apple крайне незначительны. Почти в то же самое время, что и Borland, Microsoft выпустил свою версию объектно-ориентированного языка Паскаль.[10][11] Эта версия Паскаля не получила широкого распространения. Дальнейшее развитие реализации Паскаля от Borland породило вариант Object Pascal от Borland, впоследствии, в ходе развития среды программирования Delphi, получивший одноимённое название. MidletPascalСовременные реализации PascalFree Pascal и GNU PascalВажным шагом в развитии языка является появление свободных реализаций языка Паскаль Free Pascal и GNU Pascal, которые не только вобрали в себя черты множества других диалектов языка, но и обеспечили чрезвычайно широкую переносимость написанных на нём программ (например GNU Pascal поддерживает более 20 различных платформ, под более чем 10 различными операционными системами, Free Pascal обеспечивает специальные режимы совместимости с различными распространёнными диалектами языка, такими как Turbo Pascal (полная совместимость), Delphi и другими). Delphi и Delphi.NETDelphi - реализация языка Object Pascal, используемая в среде разработки Embarcadero Delphi. Delphi.NET - реализация языка Delphi, ориентированная на разработку приложений для платформы Microsoft.Net. PascalABC.NETB Южном федеральном университете разработан PascalABC.NET — язык программирования Паскаль, включающий большинство возможностей языка Delphi, а также ряд собственных расширений. Он основан на платформе Microsoft.NET и содержит практически все современные языковые средства: классы, перегрузку операций, интерфейсы, обработку исключений, обобщённые классы и подпрограммы, сборку мусора, лямбда-выражения. Pascal NextPascal Next – компилируемый, типизированный, алгоритмический, универсальный язык программирования и среда разработки, ориентированные на решение задачи обучения основам программирования. В основе синтаксиса языка Pascal Next лежит синтаксис "классического" Паскаля Вирта. В то же время, синтаксис инструкций выбора и циклов заимствован из Basic, что позволило отказаться от избыточных begin. Особенности языкаОсобенностями языка являются строгая типизация и наличие средств структурного (процедурного) программирования. Паскаль был одним из первых таких языков. По мнению Вирта, язык должен способствовать дисциплинированному программированию, поэтому, наряду со строгой типизацией, в Паскале сведены к минимуму возможные синтаксические неоднозначности, а сам синтаксис автор постарался сделать интуитивно понятным даже при первом знакомстве с языком. Тем не менее, первоначально язык имел ряд ограничений: невозможность передачи функциям массивов переменной длины, отсутствие нормальных средств работы с динамической памятью, ограниченная библиотека ввода-вывода, отсутствие средств для подключения функций, написанных на других языках, отсутствие средств раздельной компиляции и т. п. Подробный разбор недостатков языка Паскаль того времени был выполнен Брайаном Керниганом в статье «Почему Паскаль не является моим любимым языком программирования»[12] (эта статья вышла в начале 1980-х, когда уже существовал язык Модула-2, потомок Паскаля, избавленный от большинства его пороков, а также более развитые диалекты Паскаля). Некоторые недостатки Паскаля были исправлены в ISO-стандарте 1982 года, в частности, в языке появились открытые массивы, давшие возможность использовать одни и те же процедуры для обработки одномерных массивов различных размеров. Однако многие недостатки языка не проявляются или даже становятся достоинствами при обучении программированию. Кроме того, по сравнению с основным языком программирования в академической среде 1970-х (которым был Фортран, обладавший гораздо более существенными недостатками), Паскаль представлял собой значительный шаг вперёд. К 1980-м годам Паскаль стал основой для многочисленных учебных программ, в отдельных случаях на его основе были созданы специализированные обучающие языки программирования, так, в начале 1980-х годов в СССР для обучения школьников основам информатики и вычислительной техники Андрей Ершов разработал алголо-паскалеподобный «учебный алгоритмический язык». Наиболее известной реализацией Паскаля, обеспечившей широкое распространение и развитие языка, является Turbo Pascal фирмы Borland, выросшая затем в объектный Паскаль для DOS (начиная с версии 5.5) и Windows и далее в Delphi, в которой были внедрены значительные расширения языка. СтандартыПосле начала использования Паскаля в 1970 году и появления реализаций, расходящихся не только в дополнениях, но и в синтаксисе, был поднят вопрос о стандартизации языка. Стандарт языка был разработан Никлаусом Виртом в 1974 году совместно с Кетлин Йенсен (Kathleen Jensen).[13] В дальнейшем были приняты международный стандарт ISO и американский ANSI. На данный момент выделяют три принципиально разных стандарта: Unextended Pascal (исходный), Extended Pascal (расширенный), Object-Oriented Extensions to Pascal (объектно-ориентированное расширение Паскаля).
Одним из главных дополнительных свойств объектно-ориентированного расширения Extended Pascal стала модульность и средства, облегчающие раздельную компиляцию. Стандартизация языка была запаздывающей по отношению к реальному появлению в языке тех или иных возможностей. Коммерческие реализации расширяли стандартный Паскаль; так было сделано в UCSD Pascal, модификации Object Pascal фирмой Apple, Turbo Pascal от Borland (незначительно модифицированная версия Apple) и его ответвлений. Ни одна из распространённых коммерческих реализаций Паскаля не соответствует в точности ни одному из официальных стандартов языка. Синтаксис и языковые конструкцииПаскаль, в его первоначальном виде, представляет собой чисто процедурный язык и включает в себя множество алголоподобных структур и конструкций с зарезервированными словами наподобие В современных диалектах (Delphi Pascal, Free Pascal) доступны такие операции, как перегрузка операторов и функций. Hello, world!Программы на Паскале начинаются с ключевого слова Регистр символов в Паскале не имеет значения. Таким образом, простейшая («пустая») программа на Паскале будет выглядеть следующим образом: program p;
begin
end.
Приведённая выше программа не выполняет никаких действий и содержит пустой блок операторов. Пример программы, выводящей строку «Hello, world!»: program hello;
begin
writeln('Hello, World!'); // оператор вывода строки
end.
Типы данныхПростые типыВ стандартном и расширенном Паскале есть такие простые типы: числа с плавающей запятой ( Turbo Pascal дополнил язык вариациями этих типов: например, Современные диалекты Pascal, такие, как FPC или Delphi, считают, что Ещё раз расширили типы при переходе на x64 — «просто целое» ( Целочисленные типы:
Числа с плавающей запятой:
var { секция объявления переменных }
r: Real; { переменная вещественного типа }
i: Integer; { переменная целого типа }
c: Char; { переменная-символ }
b: Boolean; { логическая переменная }
s: String; { переменная строки }
t: Text; { переменная для объявления текстового файла }
e: (apple, pear, banana, orange, lemon); { переменная типа-перечисления }
В Pascal над целыми типами (byte, shortint, word, integer, longint и их диапазоны) допустимы побитовые операции. Логические операции над битами: Над битами двух целых операндов можно выполнять ранее рассмотренные логические операции: not, and, or, xor. Отличие между побитовыми и логическими операциями состоит в том, что побитовые (поразрядные) операции выполняются над отдельными битами операндов, а не над их значением в десятичном (обычно) представлении. Выделяется понятие порядковых типов данных (ordinal), к ним относятся целые типы (знаковые и беззнаковые), логический ( Порядковые типы задаются целым числом (кодом), которое можно получить с помощью функции ord. Все операции, выполняемые над порядковыми типами, выполняются с их кодами. Диапазоны содержат подмножество значений других порядковых типов: var
x: 1..10;
y: 'a'..'z';
z: pear..orange;
Для порядковых типов определены операции В Pascal, в отличие от Си-подобных языков, с типами МножестваВ отличие от многих распространённых языков, Pascal поддерживает специальный тип данных множество: var
set1: set of 1..10;
set2: set of 'a'..'z';
set3: set of pear..orange;
Множество — фундаментальное понятие в современной математике, которое может быть использовано во многих алгоритмах. В паскале тип множество может содержать только однотипные элементы порядкового типа. Эта особенность широко используется и обычно быстрее эквивалентной конструкции в языке, не поддерживающем множества. К примеру, для большинства компиляторов Паскаля: if i in [5..10] then { проверка на принадлежность элемента множеству }
...
обработается быстрее, чем if (i>=5) and (i<=10) then { проверка логическими условиями }
...
Для задания значения множества используется список элементов множества, отделённых запятыми и заключённый в квадратные скобки (как уже было показано выше): var { секция объявления переменных }
d:set of char;
begin { начало блока }
d:=['a','b'];
...
В Паскале Йенсен и Вирта строки представлялись как упакованные массивы символов; следовательно, они имели фиксированную длину и обычно дополнялись до этой длины пробелами. Составные типыНовые типы могут быть определены из существующих: type { секция объявления типов }
x = Integer;
y = x;
...
Более того, из примитивных типов могут быть сконструированы составные: type { секция объявления типов }
a = Array [1..10] of Integer; { определение массива }
b = record { определение записи }
x: Integer;
y: Char;
end;
c = File of a; { определение файла }
Файловые типы в Паскале делятся на типизированные, текстовые и файлы без типов. Как показано в вышеприведённом примере, типизированные файлы в Паскале — это последовательности однотипных элементов. Для каждого файла существует переменная-указатель на буфер, которая обозначается Файлы без типов объявляются как переменные типа СтрокиВ современном Паскале[15] для работы со строками используется встроенный тип Тип В Delphi 2009 и выше имеется конструкция для объявления AnsiString с определённой кодовой страницей: type
CyrillicString = AnsiString(1251);
CP866String = AnsiString(20866);
УказателиПаскаль поддерживает использование указателей (типизированные type
a = ^b;
b = record
x: Integer;
y: Char;
z: a;
end;
var
pointer_to_b:a;
Здесь переменная Для типизированного указателя определена операция разыменования (её синтаксис: Чтобы создать новую запись и присвоить значение new(pointer_to_b); { выделение памяти указателю }
pointer_to_b^.x := 10; { разыменовывание указателя и обращение к полю записи }
pointer_to_b^.y := 'A';
pointer_to_b^.z := nil;
...
dispose(pointer_to_b); { освобождение памяти из-под указателя }
Для целей обращения к полям записей и объектов можно также использовать оператор new(pointer_to_b);
with pointer_to_b^ do
begin
x := 10;
y := 'A';
z := nil
end;
...
dispose(pointer_to_b);
Процедурный типВ оригинальном языке Паскаль Йенсен и Вирта процедурный тип использовался только при описании формального параметра. Уже в TP существовал полноправный процедурный тип. В объявлении типа ставится заголовок процедуры либо функции (без имени), обобщённо описывающий интерфейс подпрограммы. Значение этого типа содержит указатель на подпрограмму с заголовком, соответствующую описанному в объявлении типа. С помощью идентификатора переменной может происходить вызов соответствующей процедуры или функции. Пример подпрограмм для Pascal type myfunc=function:string;
function func1:string;
begin
func1:='func № 1'
end;
function func2:string;
begin
func2:='func № 2'
end;
var fun:myfunc;
begin
fun:=@func1;
writeln(fun) {происходит вызов функции func1}
end.
Операторы управленияПаскаль — язык структурного программирования, что означает, что программа состоит из выполняющихся последовательно отдельных стандартных операторов, в идеале — без использования команды Пример для Pascal while a <> b do { цикл с предусловием }
writeln('Ожидание');
if a > b then { условный оператор }
writeln('Условие выполнилось')
else { else-секция - может отсутствовать}
writeln('Условие не выполнилось');
for i := 1 to 10 do { итерационный цикл }
writeln('Итерация №', i:1);
for i in [1..10] do { итерационный цикл по множеству }
writeln('Итерация №', i:1); { появился в версии 2.4.0 }
with a do {Оператор With - метод ускорения доступа к полям записи}
begin
l:=1;
k:=2;
p:=-3;
end;
repeat { цикл с постусловием }
a := a + 1
until a = 10;
case i of { условный оператор множественного выбора }
0: write('ноль');
1: write('один');
2: write('два')
else write('неизвестное число') { else-секция - может отсутствовать}
end;
В операторах В Turbo Pascal для управления процессом компиляции существуют директивы, которые помещаются в комментарии и позволяют переключать режимы работы компилятора — например, включать и отключать проверку операций ввода-вывода, переполнения: Пример для Pascal assign(inp,'text.txt');
{$I-} { отключение режима IO checking- генерации кода завершения программы в случае ошибки ввода-вывода }
{ (для случая, если файл не найден)}
reset(inp);
{$I+} { включение режима IO checking }
if IOresult=0 then begin { проверяем значение переменой ioresult(<>0 в случае ошибки ввода-вывода) }
...
close(inp);
end else writeln('file not found')
Существуют директивы, аналогичные директивам препроцессора C/C++ ( Процедуры и функцииВ Паскале подпрограммы делятся на процедуры и функции. При этом, функции явно возвращают значение (результат) определённого типа, а процедуры явно ничего не возвращают. Синтаксически описание процедуры или функции состоит из заголовка, содержащего ключевое слово Пример программы для Pascal program mine(output);
var i : integer;
procedure print(var j: integer);
function next(k: integer): integer;
begin
next := k + 1
end;
begin
writeln('Всего: ', j);
j := next(j)
end;
begin
i := 1;
while i <= 10 do
print(i)
end.
Тело процедуры, как и программы, в свою очередь может содержать описания процедур и функций. Таким образом, процедуры и функции могут быть вложены друг в друга как угодно глубоко, при этом тело программы — самое верхнее в цепочке. Причём содержимое секций описания переменных, типов, констант, внешнего тела (процедуры, функции, программы), расположенных перед описанием процедуры/функции, доступны внутри неё. Также, в большинстве диалектов из процедуры можно обращаться к параметрам внешней процедуры. Вслед за заголовком процедур/функций вместо тела может помещаться ключевое слово Стандартные математические функции и процедуры ПаскаляМатематические функции
Математические процедуры
Процедуры преобразования типов переменных
Функции преобразования типов переменных
МодулиДо появления связных модулей в их современном виде некоторые реализации Паскаля поддерживали модульность за счёт механизма включения заголовочных файлов, похожего на механизм Современные реализации языка Паскаль (начиная с UCSD Pascal) поддерживают модули. Программные модули могут быть двух видов: модуль главной программы, который, как обычно, начинается с ключевого слова program и тело которого содержит код, запускаемый после загрузки программы в память, и вспомогательных модулей, содержащих типы, константы, переменные, процедуры и функции, предназначенные для использования в других модулях, в том числе в главном модуле. СтруктураОбщая структура подключаемого модуля на Паскале выглядит следующим образом: unit UnitName1;
interface
...
implementation
...
begin {может отсутствовать - используется, если необходимо поместить операторы инициализации}
...
end.
Возможен также ещё один вариант: unit UnitName2;
interface
...
implementation
...
initialization
...
finalization
....
end.
В отличие от главной программы, файл модуля начинается с ключевого слова Интерфейсная секция идёт первой, начинается с ключевого слова Секция реализации следует за интерфейсной и начинается с ключевого слова Тело модуля начинается находящимся на верхнем уровне вложенности ключевым словом Модуль заканчивается ключевым словом ИспользованиеЧтобы использовать модуль, главная программа или другой модуль должны импортировать данный модуль, то есть содержать объявление о его использовании. Это объявление делается с помощью инструкции подключения модулей, представляющей собой ключевое слово Модули, подключённые в интерфейсной секции, могут использоваться во всём модуле — и в секции реализации, и в теле. Но секция реализации может иметь собственную инструкцию подключения (она следует за ключевым словом Любые объявленные в интерфейсных секциях модулей объекты можно использовать в программе там, где эти модули подключены. Имена импортированных из подключённых модулей объектов остаются теми же самыми, и их можно использовать непосредственно. Если два или более подключённых модуля имеют объекты, называемые одинаково, и компилятор не может их различить, то при попытке использования такого объекта будет выдана ошибка компиляции — неоднозначное задание имени. В этом случае программист должен применять квалификацию имени — указать имя в формате «<имя_модуля>.<имя_объекта>». Проблемы могут возникнуть, если появляется необходимость использования в программе двух разных одноимённых модулей. Если модули доступны только в откомпилированном виде (то есть поменять их имена невозможно), оказывается невозможным их одновременный импорт. Стандартного решения такой коллизии на уровне языка не существует, но конкретные компиляторы могут предлагать те или иные способы её обхода, в частности, средства назначения псевдонимов импортируемым модулям и прямого указания, какой модуль из какого файла брать. Компиляция и компоновкаМодули спроектированы в расчёте на обеспечение раздельной компиляции — компилятор не должен компилировать импортированные модули для того, чтобы откомпилировать модуль, который их использует. Однако, чтобы правильно компилировать модуль, компилятор должен иметь доступ к секции интерфейса всех используемых им модулей. Существует два разных, иногда совмещаемых подхода к организации такого доступа.
Загрузка и выгрузка модулейДля нормальной работы модуля может потребоваться выполнить некоторые действия до начала его использования: инициализировать переменные, открыть нужные файлы, выделить память или другие ресурсы. Всё это может быть сделано в теле модуля, либо в секции инициализации. Действия, обратные инициализации, делаются в секции финализации. Порядок инициализации и финализации модулей косвенно определяется порядком объявления в секции uses, но для статически откомпилированных программ (где модуль либо компилируется в один исполняемый файл с главной программой, либо находится в отдельной динамической библиотеке, но загружается на этапе первоначальной загрузки), компилятор всегда гарантирует, что инициализация будет выполнена до момента первого использования модуля. Финализация выполняется при завершении работы программы, после завершения главного модуля, так, что используемые модули финализируются позже, чем использующие их. В случае динамической загрузки модулей, управляемой самим программистом, инициализаторы выполняются при загрузке, то есть в момент, когда команда загрузки модуля вернула управление, инициализатор его уже выполнен. Финализатор выполняется после выгрузки, обычно — при выполнении команды выгрузки модуля. Если эта команда не вызывается, динамически загруженные модули финализируются так же, как все остальные — при завершении программы. Объектно-ориентированное программированиеВ Object Pascal имеется возможность разрабатывать программы с применением парадигмы объектно-ориентированного программирования. Классы задаются с помощью типа Конструктор и деструктор задаются как обычные процедуры, но вместо идентификатора Поддерживаются единичное наследование, полиморфизм классов, механизм виртуальных методов (слово В Delphi, FPC реализована перегрузка операций, абстрактные методы, директивы Пример программы для Pascal type
TbasicO = object
procedure writeByte (b:byte); virtual; abstract;
end;
TtextO =object (TbasicO) {наследует TbasicO, реализует остальные операции вывода на основе writeByte}
procedure writeS (s: string);
{..}
end;
TfileO = object (TbasicO) {класс файлового вывода - реализует операцию вывода как вывод байта в файл}
constructor init (n: string);
procedure writeByte (b: byte); virtual;
destructor closefile;
private
f: file of byte;
end;
basicO = ^TbasicO;
textO = ^TtextO;
fileO = ^TfileO;
constructor TfileO.init (n: string);
begin
assign (f, n);
rewrite (f)
end;
destructor TfileO.closefile;
begin
close (f)
end;
procedure TfileO.writeByte (b: byte);
begin
write (f, b)
end;
procedure TtextO.writeS (s: string);
var i: integer;
begin
for i:=1 to length(s) do
writeByte (ord(s[i]))
end;
{..}
var f: fileO;
begin
new (f, init('tstobj.txt')); {выделяет память под объект и вызывает конструктор}
textO(f)^.writeS ('text string');
dispose (f, closefile) {вызывает деструктор и освобождает память объекта}
end.
В диалекте Delphi классы могут также конструироваться с помощью слова Все классы (созданные с помощью В Delphi интерфейсы были введены для поддержки технологии COM фирмы Microsoft. Классы ( Пример для Pascal q1 := t1.create(9); { конструируем объект(t1 - имя класса) }
writeln (q1.InstanceSize); { вывод размера экземпляра класса }
q1.Free; { уничтожение объекта }
q1 := nil; { чтобы не происходило повторного вызова деструктора при вызове free }
В модификации ObjectPascal/Delphi/FreePascal в описании классов появляются свойства (property), которые совмещают удобство работы с переменными (роль которых в ООП играют поля) и вызовы методов, которые всегда уведомляют объект об изменении его состояния: Пример программы для Pascal type
TMyObj=class(TObject)
FProp:integer;
procedure SetProp(AValue:integer);
property MyProp:integer read FProp write SetProp;
end;
procedure TMyObj.SetProp(AValue:integer);
begin
FProp:=AValue;
Writeln('Somebody has changed MyProp!');
end;
var MyObj:TMyObj;
begin
MyObj:=TMyObj.Create;
MyObj.FProp:=5;
MyObj.MyProp:=MyObj.MyProp+6;
end.
В первом случае (использование MyObj.FProp) поле объекта было изменено непосредственно, в итоге, методы объекта не будут подозревать, что это поле было ранее изменено; в более сложном случае они могут полагаться на то, что поле неизменно, либо же полю может быть присвоено значение, недопустимое для данного объекта. Во втором случае значение присваивается непосредственно свойству объекта, которое ссылается на вызов метода, корректно обрабатывающего изменение данного поля. Этот подход удобен, если объект связан с визуальным элементом: непосредственное изменение поля, отвечающего, например, за ширину элемента, никак не отразится на самом визуальном элементе, а объект будет «дезинформирован» относительно реальных размеров элемента. Корректным подходом без использования свойств является разработка методов на получение и установку любого значения поля, но работа с такими методами будет менее удобна, например, вместо последней строки надо было бы написать MyObj.SetProp(MyObj.GetProp+6);
причём метод MyObj.GetProp следовало бы написать для унификации доступа. Большой интерес представляют индексные свойства, которые ведут себя практически так же, как и массивы, заменяя обращение к элементу массива вызовом соответствующего метода. Тем не менее, свойства не являются «панацеей»: при компиляции обращения к свойствам непосредственно транслируются в вызов методов или прямую работу с полями, поэтому настоящими переменными свойства не являются, в частности, их невозможно передавать в виде var-параметров. Примечания
Литература
Стандарты
Ссылки
|
Portal di Ensiklopedia Dunia