.NET глазами дельфийца. C#
Страница 6. Типизированные константы и 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) и полей.

 
« Предыдущая статья   Следующая статья »