Страница 6 из 19
Типизированные константыТипизированные константы в Delphi позволяют хранить не только значенияпримитивных типов, но и массивы, записи, а также указатели, включая указателина процедуры и функции: const A: integer = 1; const B: array [1..3] of integer = (1, 2, 3);
В C# константы всегда типизированы - как при использовании модификатораconst, так и readonly. В Delphi при использовании директивы компилятора {$J+} (установлено поумолчанию) типизованные константы ведут себя как обычные переменные, которыеинициализируются одновременно с описанием, т.е. их значение может быть измененов ходе выполнения программы: const A: integer = 1; X := A; A := 2;
В C# действуют более строгие правила - если константа, то поменять еезначение невозможно. Если же используется поле , тоего содержимое может быть изменено в контексте объекта: // класс-обертка public class Const { // число-константа public readonly int A = 1; // метод изменяет значение поля A public void ChangeA(int NewValue) { A = NewValue; } }
При использовании типизованных констант в качествеинициализируемых переменных в области видимости подпрограммы (метода,процедуры, функции) в Delphi наблюдается недокументированный побочный эффект - данные,записанные в локальные типизованные константы, сохраняются между вызовамиподпрограмм: procedure A; const B: integer = 0; begin Inc(B); ShowMessage(IntToStr(B)); end; procedure Do; begin A; A; A; end;
Результаты вывода: 1, 2, 3 В C# подобный побочный эффект отсутствует. Вообще, стандартизация C# в качествемеждународного стандарта (ECMA, 2001 год) гарантирует отсутствиепобочных эффектов. Поэтому если в программе C# необходимо сохранять некоторое состояниемежду вызовами подпрограмм (методов), используются стандартные средства, вчастности, статические или обыкновенные поля классов. Const-параметрыВ Delphi семантический смысл const-параметров заключается в указаниикомпилятору на возможность оптимизации передачи в функцию (процедуру, метод)неизменяемой ссылки на некоторый объект программы. Так, например, конструкциятипа: procedure A(const S: string);
означает, что в качестве параметра процедуры будетпередаваться ссылка на строку (при этом копирования содержимого строки в стеквызова процедуры не происходит). Кроме того, содержимое строки S внутри процедуры изменитьнельзя. В C# не предусмотрено прямого эквивалента const-параметров. Тем не менее, в случаенеобходимости может быть построена семантически эквивалентная конструкция(аналогия вышеприведенному примеру): class ReadOnlyString { ReadOnlyString(string S) { this.S = S; } public readonly string S; static void Test(ReadOnlyString s) { Console.Write(s.S); } static void Main() { string s = "проверка const-параметров"; ReadOnlyString.Test(new ReadOnlyString(s)); } }
Приведенный код иллюстрирует использованиеклассов- (т.н. wrappers) и полей. |