2012-08-20 12 views
0

Я пытаюсь сделать следующее выражение, но я продолжаю работать в этом исключении: «Невозможно найти свойство setter для« chars ».»Не удается найти свойство setter для «Chars»

Вот это выражение:

xstr, str : string; 
for i := 1 to length(str) do 
begin 
    if ((i mod 2)<>0) then 
    begin 
    xstr[i] := char(Ord(str[i]) xor $AA); <<<<------ Exception Raised 
    end 
    else 
    begin 
    xstr[i] := char(Ord(str[i]) xor $55); <<<<------ Exception Raised 
    end; 
end; 

Значение «ул» передается в метод шифрования.

Это часть метода шифрования. Каков наилучший способ сделать это?

ответ

5

System.String - неизменный класс, то есть вы не можете изменять его экземпляры. .NET требует модификации строковых операций для создания новых экземпляров строки. Для вашей цели, вероятно, проще всего и наиболее эффективно создать массив модифицированных символов char, а затем построить из него строку.

В целом класс System.Text.StringBuilder предлагает изменяемый экземпляр строки.

В самом деле, даже если бы не было неизменности строк, код потерпит неудачу, потому что вы не выделить строку, поэтому присвоение xstr[i] уступит в исключения переполнения буфера. Это нужно сделать при использовании массива char.

+0

Как насчет небезопасного решения с помощью указателей? возможно ли это в delphi? –

+0

@Kuba Возможно. Но какая у него была бы польза? * Может быть * выступление. Но, возможно, даже не это. –

+0

@KubaWyrostek это не безопасно и почти никогда не рекомендуется. – elyashiv