.NET глазами дельфийца. C# - Типизированные константы и Const-параметры

ОГЛАВЛЕНИЕ

 

Типизированные константы

Типизированные константы в 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) и полей.