В данном разделе приведны примеры, иллюстрирующие различные особенности языка PascalABC.NET, отличающие его от языка Delphi. Некоторые из этих особенностей являются ключевыми (они выделены жирным), некоторые - малозначительны. Ряд особенностей связан с языковыми возможностями, предоставляемыми платформой .NET.
Условно все особенности разделены на простейшие и основные.
Простейшие особенности систематически используются при начальном обучении программированию на PascalABC.NET. Большинство из них введено как расширения языка, эффективно используемые при обучении.
Расширенные операторы присваивания | Данный пример иллюстрирует использование расширенных операторов присваивания += -= *= /= для целых и вещественных. Операция /= для целых, разумеется, запрещена. | |
Внутриблочные переменные | Переменные могут описываться внутри блока begin-end и инициализироваться при описании. Это крайне удобно для промежуточных переменных и соблюдает принцип локальности: переменная описывается непосредственно перед началом своего использования. Внутриблочные переменные позволяют сильно уменьшить количество глобальных переменных в разделе описания. | |
Автоопределение типа при описании | Если переменная инициализируется при описании, то ее тип можно не указывать: он определяется по типу правой части. Это не только сокращает запись, но и в большинстве случаев делает программу более понятной. | |
Описание параметра цикла for в заголовке цикла | Переменные-параметры цикла for должны преимущественно описываться в заголовке цикла для соблюдения принципа локальности. | |
Вычисление суммы N чисел | Данный пример подытоживает четыре предыдущих, используя расширенные операции присваивания, внутриблочные описания, автоопределение типа при описании и описание переменной в заголовке цикла for. | |
Форматированный вывод |
Для форматированного вывода и вывода нескольких данных одновременно удобно использовать стандартную процедуру WritelnFormat. | |
Цикл foreach | Программа илюстрирует использование цикла foreach. Цикл foreach используется для доступа на чтение к элементам любого контейнера, в частности, массива или множества. | |
Тип Char: особенности | Тип Char хранит символ Unicode и занимает 2 байта. | |
Тип String: особенности | Тип String хранит строку символов переменной длины. Для строк фиксированной длины используется синтаксис string[10]. | |
Множества произвольного типа | Множества могут иметь произвольный базовый тип. К сожалению, по этой причине множества уже не хранятся как битовый вектор, и все операции с ними немного менее эффективны. | |
Перегрузка имен подпрограмм | Можно определит несколько подпрограмм с одним именем, но разными типами или количеством параметров. Ключевое слово overload для таких подпрограмм использовать не нужно. | |
Упрощенный синтаксис модулей | Небольшие модули удобно определять в упрощенном стиле - без деления на интерфейс и реализацию. Все определенные в модуле имена будут видны из модуля, подключившего данный. | |
Перечислимый тип: особенности | Значение перечислимого типа можно выводить с помощью writeln. Кроме того, Константу перечислимого типа можно указывать в формате EnumType.ConstName. |
Часть основных особенностей связана с объектно-ориентированным программированием и платформой .NET и используется для обучения современному программированию, другая является чисто технической и приведена здесь для полноты картины.
Ошибки при работе с вещественными значениями | Действия с вещественными значениями не могут привести к переполнению или другой ошибке. При некорректных операциях мы получаем либо значение "бесконечность", либо значение NaN (не число). | |
Методы класса string | Все типы - классы. Класс string содержит в своем составе ряд мощных методов. | |
Преобразования Строка-Число | Преобразование из строки в число и обратно можно выполнять с помощью методов классов string, integer, real. | |
Методы класса Enum | Все перечислимые типы можно обрабатывать с помощью методов класса Enum. В частности, легко получить массив строк - имен констант перечислимого типа. | |
Динамические массивы: особенности | Память под динамические массивы можно выделять операцией new, как и вызов конструктора. Тип array of T параметра подпрограммы обозначает именно динамический массив, а не открытый массив, как в Delphi. | |
Прямоугольные динамические массивы | n-мерные массивы также могут быть динамическими. | |
Процедурные переменные: операции += и -= | Процедурные переменные могут хранить несколько действий, вызываемых последовательно. | |
Бестиповые файлы: особенности | Бестиповые файлы file изменены по сравнению с Delphi. Отсутствуют процедуры BlockRead и BlockWrite, но в бестиповой файл можно непосредственно записывать данные любых размерных типов. | |
Инициализаторы полей в записях и классах | Полям записи или класса можно присваивать значение непосредственно. Они инициализируются в момент создания переменной. | |
Особенности вызова конструктора |
Для вызова конструктора используется опрация new. | |
Определение методов внутри класса | Методы могут определяться непосредственно в теле класса как в C++ и Java. | |
Методы в записях | В записях могут быть методы. Это ощутимо меняет стиль обучения и позволяет учить объектному программированию на более раннем этапе. | |
Сборка мусора и отсутствие деструкторов | Память, выделенную конструктором, явно освобождать не надо. Автоматический сборщик мусора возвращает память, занимаемую объектами, на которые никто не ссылается. | |
Вывод записей и классов с помощью write | Для вывода переменных типа класс или запись в операторе writeln следует переопределить виртуальный метод ToString. | |
Создание и подключение dll | Библиотеки dll легко создать и использовать. Синтаксически библиотека dll представляет собой модуль, где вместо ключевого слова unit используется слово library. | |
Вызов функции из dll на C# | PascalABC.NET - полноценный .NET-язык, легко совмещаемый с другими .NET-языками. В данном примере показывается, как в программе на PascalABC.NETвызвать функцию из dll, созданной на C#. | |
Вызов функции из неуправляемой dll | Функции из обычных (неуправляемых) dll вызывать столь же легко. | |
Определение типа во время выполнения программы | Точный тип во время выполнения определяется с помощью метода GetType. | |
Упаковка и распаковка | При присваивании размерного типа объекту типа Object происходит упаковка. Для распаковки следует использовать явное приведение типа. | |
Перегрузка операций | Для типов, определенных пользователем, можно перегружать операции. | |
Обобщенные подпрограммы | Можно определять подпрограммы, параметризованные некоторым типом. Этот тип выводится в момент вызова подпрограммы по типам параметров. | |
Обобщенные классы | Класс может быть параметризован типом. | |
Ограничения на параметры обобщенных классов | Параметры обобщенных классов и подпрограмм могут удовлетворять дополнительным условиям, например, реализовывать интерфейс или иметь конструктор по умолчанию. | |
Интерфейсы | Интерфейс похож на абстрактный класс без полей, методы которого не имеют реализации. | |
Явная реализация интерфейса | Класс может реализовывать методы интерфейса неявно или явно. Явная реализация интерфейса может быть вызвана только через ссылку на интерфейс. | |
Стандартные исключения | Иерархия исключений заимствуется из .NET. | |
Методы расширения | Можно расширять типы, определенные ранее, новыми методами. | |
Атрибуты | Атрибут - дополнительная характеристика-описатель объекта. Атрибуты разработали с целью не вводить дополнительные ключевые слова в язык. Атрибутом можно пометить класс, запись, перечислимый тип, подпрограмму, метод, поле, параметр, возвращаемое значение, свойство, событие. | |
Перечислимый тип: флаги | Перечислимый тип с помощью атрибута [Flags] может быть превращен в тип-флаг. | |
События event | События event представляют собой процедурные переменные, имеющие ряд ограничений. Они предназначены для хранения обработчиков событий. | |
Структурная эквивалентность типов | Здесь приводятся все составые типы в PascalABC.NET, эквивалентные структурно. Остальные составные типы поддерживают лишь именную эквивалентность. | |
01.02.24. На ресурсе Stepik в ознакомительном режиме открыт курс "PascalАВС.NЕТ: продвинутый уровень".
10.07.23. Вышел релиз версии PascalABC.NET 3.9.0. Нововведения описаны здесь.
20.05.23. На странице https://pascalabc.net/stepikcourse опубликованы новые курсы по PascalABC.NET от центра олимпиадного программирования DL Club.
08.05.23. Вышла версия PascalABC.NET 3.9.0.beta. Основное - ковариантные параметры обобщений, аргументы по умолчанию при вызове подпрограммы, модуль автоматической проверки LightPT.
22.02.23. Открыта регистрация на конференцию «Использование системы программирования PascalABC.NET в обучении программированию»