Устаревшие типы
Это, пожалуй, самая болезненная проблема для совместимости с ранними версиями.
Прежде всего, речь идет об указателях. Указатели считаются небезопасным типом, так как код, содержащий указатели, нельзя проверить на безопасность. Запрещена любая арифметика указателей, а также обращение к функциям и процедурам New, Dispose, GetMem, FreeMem и ReallocMem. Вместо концепции указателей программы должны использовать два класса из CTS: IntPtr и Marshal. Первый - суть универсальный платформеннонезависимый указатель, открывающий доступ к механизму межплатформенного взаимодействия P/Invoke. Второй осуществляет маршализацию данных, то есть низкоуровневое взаимодействие процессов, включая упаковку/распаковку передаваемых данных.
В следующем примере создается и используется указатель для размещения в нем целого числа. uses System.Runtime.InteropServices; var X: IntPtr; begin X := Marshal.AllocHGlobal(SizeOf(Integer)); // Создаем указатель try // на 4 байта Marshal.WriteInt32(X, 123456); // Наполняем его Caption := IntToStr(Marshal.ReadInt32(X) * 2); // Используем finally X.Free; // Освобождаем end end;Запрещены типизированные и нетипизированные файлы. Безопасный код может использовать только текстовые файлы типа FileVar: TextFile. Для работы с не текстовыми файлами рекомендуется использовать объекты класса TFileStream. Например, следующая программа создаст файл, содержащий 5 случайных вещественных чисел.
procedure TForm3.Button1Click(Sender: TObject); var A: Real; k: Integer; F: TFileStream; begin F := TFileStream.Create('data.dat', fmCreate); try for k := 1 to 5 do begin A := Random; F.Write(A, SizeOf(Real)); end; finally F.Free end end; Записи не могут содержать вариантную часть, но могут - методы (см. ниже).В .NET Framework используются "широкие" символы (2 байта на символ). В связи с этим небезопасным считается тип PChar, который используется как ссылка на массив однобайтных символов. В то же время формат типов String в Delphi и CTS совпадает.
Поскольку тип PChar в программах Delphi используется, в основном, при обращении в функциям API, вместо PChar следует использовать класс StingBuilder. Следующая программа прочитает заголовок активного окна:
function GetText(Window: HWND; BufSize: Integer = 1024): String; var Buffer: StringBuilder; begin Buffer := StringBuilder.Create(BufSize); GetWindowText(Window, Buffer, Buffer.Capacity); Result := Buffer.ToString; end;