KnigaRead.com/

W Cat - Описание языка PascalABC.NET

На нашем сайте KnigaRead.com Вы можете абсолютно бесплатно читать книгу онлайн "W Cat - Описание языка PascalABC.NET". Жанр: Детская образовательная литература издательство неизвестно, год неизвестен.
Перейти на страницу:

begin

i := 5;

end;

end;

B=class(A)

i: integer;

procedure p;

begin

i := 5;

inherited p;

end;

end;

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

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

uses unit1,unit2;

begin

id := 2;

end.

описание переменной id будет искаться вначале в основной программе, затем в модуле unit2, затем в модуле unit1. При этом в разных модулях могут быть описаны разные переменные id. Данная ситуация означает, что unit1 образует внешнее пространство имен, пространство имен unit2 в него непосредственно вложено, а пространство имен основной программы вложено в unit2.

Если в последнем примере оба модуля - unit1 и unit2 - определяют переменные id, то рекомендуется уточнять имя переменной именем модуля, используя конструкцию ИмяМодуля.Имя:

uses unit1,unit2;

begin

unit1.id := 2;

end.

Типы данных

Обзор типов

Типы в PascalABC.NET подразделяются на простые, строковые, структурированные, типы указателей, процедурные типы и классы.

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

К структурированным типам относятся массивы, записи, множества и файлы.

Все простые типы, кроме вещественного, называются порядковыми. Только значения этих типов могут быть индексами статических массивов и параметрами цикла for. Кроме того, для порядковых типов используются функции Ord, Pred и Succ, а также процедуры Inc и Dec.

Все типы, кроме типов указателей, являются производными от типа Object. Каждый тип в PascalABC.NET имеет отображение на тип .NET. Тип указателя принадлежит к неуправляемому коду и моделируется типом void*.

Все типы в PascalABC.NET подразделяются на две большие группы: размерные и ссылочные.

Список типов .NET

* Целые типы Вещественные типы Логический тип Символьный тип Перечислимый и диапазонный типы Статические массивы Динамические массивы Записи Множества Файлы Указатели Процедурный тип Последовательности Классы

Размерные и ссылочные типы

Все типы в PascalABC.NET подразделяются на две большие группы: размерные и ссылочные. К размерным относятся все простые типы, указатели, записи, статические массивы, множества и строки. К ссылочным типам относятся классы, динамические массивы, файлы и процедурный тип.

Размерные типы более эффективны при вычислениях: они занимают меньше памяти и операции, выполняемые над небольшими размерными типами, максимально эффективны. Ссылочные типы обладают большей гибкостью: память под них выделяется динамически в процессе работы программы и освобождается автоматически, когда объект ссылочного типа перестаёт использоваться.

Выделение памяти

Память под переменную размерного типа распределяется на программном стеке в момент её описания. При этом переменная размерного типа хранит значение этого типа.

var i: integer; // здесь под i выделяется память

i := 5;

Переменная ссылочного типа представляет собой ссылку на объект некоторого класса в динамической памяти. Если она не инициализирована, то хранит специальное значение nil (нулевая ссылка). Для инициализации ссылочных переменных используется вызов конструктора соответствующего класса:

type Person = auto class

name: string;

age: integer;

end;

var p: Person; // p хранит значение nil, память под объект не выделена

p := new Person('Иванов',20); // конструктор выделяет память под объект

Присваивание

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

var a,a1: array [1..1000000] of integer;

a1 := a; // копируются все 1000000 элементов

При присваивании переменных ссылочного типа осуществляется присваивание ссылок, в итоге после присваивания обе ссылки ссылаются на один объект в динамической памяти:

var p1: Person;

p1 := p; // копируется ссылка

Сравнение на равенство

Сравнение на равенство объектов размерного типа сравнивает их значения. В частности, две переменные типа запись равны если равны все поля этих записей.

type PersonRec = record

name: string;

age: integer;

end;

var p,p1: PersonRec;

p.name := 'Иванов'; p.age := 20;

p1.name := 'Иванов'; p1.age := 20;

writeln(p1 = p); // True

При сравнении на равенство переменных ссылочного типа проверяется, что они ссылаются на один и тот же объект.

var p := new Person('Иванов',20);

var p1 := new Person('Иванов',20);

writeln(p1=p); // False

Управление памятью

Размерные типы распределяются на программном стеке, поэтому не нуждаются в специальном управлении памятью. Под глобальные размерные переменные память распределена всё время работы программы. Под локальные размерные переменные память выделяется в момент вызова подпрограммы. а освобождается в момент завершения работы этой подпрограммы.

Управление памятью для ссылочных типов осуществляется автоматически сборщиком мусора. Сборщик мусора запускается в неопределенный момент времени когда управляемой памяти перестаёт хватать. Он возвращает в пул неиспользуемой памяти те объекты, на которые больше никто не ссылается, после чего дефрагментирует оставшуюся память, в результате чего динамическая память всегда дефрагментирована и ее выделение при вызове конструктора происходит практически мгновенно.

Передача в подпрограммы

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

type Arr = array [1..100] of integer;

procedure PrintArray(const a: Arr; n: integer);

begin

for var i:=1 to n do

Print(a[i])

end;

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

procedure Change666(a: array of integer);

begin

a[0] := 666;

end;

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

Целые типы

Ниже приводится таблица целых типов, содержащая также их размер и диапазон допустимых значений.

Тип

Размер, байт

Диапазон значений

shortint

1

-128..127

smallint

2

-32768..32767

integer, longint

4

-2147483648..2147483647

int64

8

-9223372036854775808..9223372036854775807

byte

1

0..255

word

2

0..65535

longword, cardinal

4

0..4294967295

uint64

8

0..18446744073709551615

BigInteger

переменный

неограниченный

Типы integer и longint, а также longword и cardinal являются синонимами.

Максимальные значения для каждого целого типа определены как внешние стандартные константы: MaxInt64, MaxInt, MaxSmallInt, MaxShortInt, MaxUInt64, MaxLongWord, MaxWord, MaxByte.

Для каждого целого типа T кроме BigInteger определены следующие константы как статические члены:

T.MinValue - константа, представляющая минимальное значение типа T;

T.MaxValue - константа, представляющая максимальное значение типа T;

Для каждого целого типа T определены статические функции:

T.Parse(s) - функция, конвертирующая строковое представление числа в значение типа T. Если преобразование невозможно, то генерируется исключение;

T.TryParse(s,res) - функция, конвертирующая строковое представление числа в значение типа T и записывающая его в переменную res. Если преобразование возможно, то возвращается значение True, в противном случае - False.

Кроме того, для T определена экземплярная функция ToString, возвращающая строковое представление переменной данного типа.

Константы целого типа могут представляться как в десятичной, так и в шестнадцатеричной форме, перед шестнадцатеричной константой ставится знак $:

Перейти на страницу:
Прокомментировать
Подтвердите что вы не робот:*