Справочная статья
Тип STRING и фиксированные строки
Текст нужен программе на каждом шаге: как подпись вывода, как путь к файлу, как прочитанная из файла строка. Для таких значений служит тип STRING с переменной длиной, а форма STRING * N задаёт место хранения постоянной ширины, например для короткого кода. Ниже объясняется, как ведут себя оба вида, чем ограничена длина значения и где фиксированная ширина допустима.
Обычная строка
Значение типа STRING получается из литерала, из ввода или как результат функции. Переменная обычного типа принимает строки разной длины, а пустая строка содержит ноль единиц текста. В примере к начальному тексту дописывается слово:
DIM title AS STRING = "Отчёт"
title = title + " готов"
PRINT titleРезультат:
Отчёт готовСинтаксис кавычек и интерполяции описан отдельно, а функции длины и фрагментов различают единицы UTF-16, кодовые точки и графемы в поддержанных формах.
Строка ведёт себя как значение, а не как ссылка на чужое место хранения. Прочитанное строковое значение сохраняет свой текст: если последующий вызов изменит исходную переменную, уже вычисленный операнд, переданный по значению аргумент или сохранённая копия от этого не изменятся. Изменять само место хранения позволяет параметр BYREF — по обычным правилам передачи аргументов.
Предельная длина значения
Одно значение STRING содержит не более 16 777 216 кодовых единиц UTF-16; пустая строка допустима. Предел относится к тексту значения, а не к числу графем, размеру файла в байтах или общей памяти программы, поэтому корректная суррогатная пара расходует две единицы.
Превышение предела при выполнении вызывает MB3007; эту ошибку можно обработать оператором TRY/CATCH. Размер результата повторения, заполнения и соединения проверяется до создания результирующей строки, поэтому отказ вычисления правой части не записывает частичный текст в переменную назначения. Общий предел не расширяет допустимую ширину объявления STRING * N: для неё по-прежнему действует диапазон 1–65535.
Фиксированная ширина
Форма STRING * N создаёт строковое место хранения постоянной ширины. Объявить её можно в консольной или графической программе; исходное строковое выражение при записи не меняется.
DIM <имя> AS STRING * <длина>Имя обозначает создаваемую переменную, а длина задаёт ширину в единицах UTF-16 и должна быть целочисленной константой от 1 до 65535 — литералом или доступной целочисленной константой. При записи короткое значение дополняется пробелами справа, длинное обрезается справа до заданной ширины, а начальное значение без инициализатора состоит из указанного числа пробелов.
Один и тот же размер применяется к каждому присваиванию, поэтому обрезка видна на втором значении, а дополнение — на первом:
DIM shortCode AS STRING * 4
shortCode = "AB"
PRINT "[" + shortCode + "]"
shortCode = "Alphabet"
PRINT "[" + shortCode + "]"Результат:
[AB ]
[Alph]Скобки в выводе показывают границы поля: «AB» дополнено двумя пробелами, а «Alphabet» сохранило только первые четыре знака. Обрезка считается по UTF-16 и может разделить суррогатную пару, поэтому фиксированная ширина не означает число графем или экранных ячеек.
Допустимые объявления
Фиксированная строка поддержана в переменной DIM и поле TYPE. Для константы, параметра процедуры или функции, результата функции и функционального типа следует брать обычный STRING: форма фиксированной ширины в этих местах не поддержана.
Диагностика
MB2026 возникает при использовании фиксированной строки в неподдержанном месте, при размере вне диапазона 1–65535 и при выражении размера, которое нельзя вычислить как целочисленную константу. Несовместимое присваивание обнаруживается при проверке типов. Размер и другие ограничения объявления должны соблюдаться до запуска программы.
Файловое значение
Текстовый путь хранится в STRING, но открытый файловый ресурс — это отдельный тип FILE. Его договор перенесён в главу файлов и к строковому типу не относится.